Обработка различных разрешений в Visual Studio 2008 для .NET CF - PullRequest
5 голосов
/ 18 ноября 2008

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

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

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

Спасибо, Кронос

Ответы [ 5 ]

6 голосов
/ 27 ноября 2008

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

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

public partial class frmDialog240x240: frmDialog

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

public partial class frmDialog240x240: Form

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

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

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

5 голосов
/ 18 ноября 2008

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

int screenWidth = Screen.PrimaryScreen.Bounds.Width;
int workingHeight = Screen.PrimaryScreen.WorkingArea.Height;
2 голосов
/ 21 ноября 2008

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

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

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

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

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

2 голосов
/ 18 ноября 2008

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

[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 «engine», содержащий весь код, общий для всех разрешений. Затем добавьте выходные данные этого проекта в качестве ссылки на столько проектов приложений Windows Forms, сколько вам нужно.

0 голосов
/ 10 февраля 2009

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

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

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

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

CurrentAutoScaleDimensions.Height / 96

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

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

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

...