Обработка различных разрешений в Visual Studio 2008 для .NET CF

Я разрабатываю графическое приложение на основе .NET CF, мой проект включает в себя множество графических изображений. Мы решили перенести приложение на другое разрешение телефона (240 X 240, 480 X 640) и т. д.

Как мне достичь этого в рамках одного решения / проекта?

Есть ли необходимость создавать разные проекты на основе разрешений? Как мне обрабатывать общие файлы? и мне нужно, чтобы изменения в одном из общих классов произошли на всех устройствах.

Спасибо, Cronos

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
5
0
7 886
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Этот код помог мне определить разрешение экрана динамически:

[DllImport("coredll.dll", EntryPoint = ("GetSystemMetrics"))]
public static extern int GetSystemMetrics(int nIndex);

private const int SM_CXSCREEN = 0;
private const int SM_CYSCREEN = 1;

private int width = GetSystemMetrics(SM_CXSCREEN);
private int height = GetSystemMetrics(SM_CYSCREEN);

Я не припоминаю, чтобы это было у меня в голове, но есть также способ получить ориентацию экрана. Это поможет объединить некоторый код в один класс.

Я настоятельно рекомендую создать единое решение для всех разрешений. В рамках этого решения у вас может быть столько проектов, сколько вы хотите. Эти проекты могут быть приложениями Windows Forms, проектами библиотеки Dll или проектами настройки.

Я бы хотел создать единый проект приложения Windows Forms. Я бы использовал описанную выше технику и прочитал статические изображения из файловой системы. Если это не работает для вас и / или вы предпочитаете читать свои изображения как ресурсы, тогда создайте проект dll «движка», содержащий весь код, общий для всех разрешений. Затем добавьте результат этого проекта в качестве ссылки на столько проектов приложений Windows Forms, сколько вам нужно.

Привязка и закрепление - наиболее распространенный механизм для обработки различных разрешений (помните также, что многие устройства могут поворачивать экран, поэтому вам нужно обрабатывать изменения даже на одном устройстве). Получить размер экрана, если после этого потребуется, так же просто, как запросить объект Screen:

int screenWidth = Screen.PrimaryScreen.Bounds.Width;
int workingHeight = Screen.PrimaryScreen.WorkingArea.Height;

На этот вопрос нет однозначного ответа. Создавать формы для работы с различными разрешениями экрана легко в Windows, где даже самый маленький размер экрана обычно составляет 600 x 800. В мире CF экран может быть размером от 240 x 240 (или меньше для смартфонов) или размером до 640 x 480 (или больше). Анкеровка и стыковка, как правило, очень плохо работают в этих диапазонах размеров.

Один из вариантов - использовать подход, основанный на наименьшем общем знаменателе, и спроектировать все так, чтобы уместилось на минимально возможном экране. Это гарантированно будет работать на любом устройстве, но, очевидно, приведет к потере полезного места на больших экранах.

Другой вариант - создать каждую форму с учетом разрешения. Например, если у вас есть форма, которая отображает данные в сетке и поле со списком фильтров над ней, вы можете написать код в событии Resize формы, который регулирует размеры сетки, чтобы заполнить все доступное пространство.

Альтернативным вариантом коду с учетом разрешения является создание отдельной формы для каждого разрешения для конкретной функции пользовательского интерфейса. Это, конечно, больше работы и приводит к дублированию кода, но для некоторых конкретных функций это просто то, что вам нужно сделать. Пока вы абстрагируете общую логику, все будет в порядке.

У вас правильное представление о желании достичь этого в рамках одного проекта. Разные разрешения экрана, как правило, требуют небольшой работы и размышлений, и определенно не являются основанием для разделения вашего продукта на разные проекты.

Пожалуйста, посмотрите мой новый ответ. Я немного покопался в этой проблеме и нашел гораздо лучший способ справиться с разрешениями экрана.

MusiGenesis 27.11.2008 02:36
Ответ принят как подходящий

Не слушайте этого идиота MusiGenesis. Намного лучший способ справиться с различными разрешениями экрана для устройств Windows Mobile - это использовать наследование форм, который можно прикрепить к существующему приложению CF с минимальными усилиями.

По сути, вы разрабатываете каждую форму для стандартного экрана 240x320. Когда вам нужно переупорядочить форму для нового разрешения (скажем, 240x240), вы добавляете новую форму в свой проект и наследуете ее от исходной формы 240x320:

public partial class frmDialog240x240: frmDialog

вместо формы:

public partial class frmDialog240x240: Form

как обычно. В исходной форме вам нужно установите для свойства Modifiers каждого элемента управления значение Protected (вместо частного по умолчанию). В дизайнере вашей новой формы вы увидите все элементы управления формы, от которой вы наследуете, и вы можете перемещать их и изменять их размер по своему усмотрению для соответствия новым размерам экрана (это не повлияет на исходную форму). макет).

Когда ваша программа запущена, ей легко проверить разрешение экрана устройства, на котором она работает, и создать соответствующую форму (для этого подходит заводской метод). Ваша новая форма наследует все от старой формы, но использует ваш новый настраиваемый макет.

Такой подход позволяет избежать дублирования кода, потому что его нет.

Я попробовал метод наследования и не продвинулся далеко, в основном из-за проблем с дизайнером. Я прибег к стыковке и получил приличные результаты.

cdonner 08.07.2009 07:00

@cdonner: вы установили для свойства Modifiers каждого элемента управления родительской формы значение Protected (вместо Private)? Это ключ к правильной работе дизайнера.

MusiGenesis 08.07.2009 14:28

Я отказался от дизайнера для всех, кроме самых простых компактных приложений. Я стараюсь разместить каждый элемент управления математически, используя размеры экрана. Это звучит болезненно, но как только вы начинаете действовать, это становится вашей второй натурой.

Для каждой формы я создаю метод «регенерации», который запускается всякий раз, когда форма отображается или изменяется. В этом методе я обычно устанавливаю расположение, размер и, если необходимо, размер шрифта для каждого элемента управления в форме. При размещении контроля мой мыслительный процесс таков:

  1. Хорошо для обычного портретного устройства?
  2. Хорошо для обычного горизонтального устройства?
  3. Хорошо для квадратного устройства?
  4. Подходит ли устройство VGA (640x480) (высокое разрешение)?

Для размеров шрифта и работы с устройствами VGA с высоким разрешением (точек на дюйм) я использую свойство -:

CurrentAutoScaleDimensions.Height / 96

... для получения коэффициента масштабирования шрифта. (Обычные устройства 96 точек на дюйм)

В крайнем случае, вы можете использовать условные операторы (if) в вашем повторно сгенерированном коде для проверки различных размеров / форм экрана.

По-прежнему можно использовать конструктор для базового макета, но вам нужно будет запустить формы на различных эмуляторах / устройствах и попробовать переключить портрет / пейзаж, чтобы полностью протестировать методы «регенерации».

Другие вопросы по теме