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





Этот код помог мне определить разрешение экрана динамически:
[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. Намного лучший способ справиться с различными разрешениями экрана для устройств Windows Mobile - это использовать наследование форм, который можно прикрепить к существующему приложению CF с минимальными усилиями.
По сути, вы разрабатываете каждую форму для стандартного экрана 240x320. Когда вам нужно переупорядочить форму для нового разрешения (скажем, 240x240), вы добавляете новую форму в свой проект и наследуете ее от исходной формы 240x320:
public partial class frmDialog240x240: frmDialog
вместо формы:
public partial class frmDialog240x240: Form
как обычно. В исходной форме вам нужно установите для свойства Modifiers каждого элемента управления значение Protected (вместо частного по умолчанию). В дизайнере вашей новой формы вы увидите все элементы управления формы, от которой вы наследуете, и вы можете перемещать их и изменять их размер по своему усмотрению для соответствия новым размерам экрана (это не повлияет на исходную форму). макет).
Когда ваша программа запущена, ей легко проверить разрешение экрана устройства, на котором она работает, и создать соответствующую форму (для этого подходит заводской метод). Ваша новая форма наследует все от старой формы, но использует ваш новый настраиваемый макет.
Такой подход позволяет избежать дублирования кода, потому что его нет.
Я попробовал метод наследования и не продвинулся далеко, в основном из-за проблем с дизайнером. Я прибег к стыковке и получил приличные результаты.
@cdonner: вы установили для свойства Modifiers каждого элемента управления родительской формы значение Protected (вместо Private)? Это ключ к правильной работе дизайнера.
Я отказался от дизайнера для всех, кроме самых простых компактных приложений. Я стараюсь разместить каждый элемент управления математически, используя размеры экрана. Это звучит болезненно, но как только вы начинаете действовать, это становится вашей второй натурой.
Для каждой формы я создаю метод «регенерации», который запускается всякий раз, когда форма отображается или изменяется. В этом методе я обычно устанавливаю расположение, размер и, если необходимо, размер шрифта для каждого элемента управления в форме. При размещении контроля мой мыслительный процесс таков:
Для размеров шрифта и работы с устройствами VGA с высоким разрешением (точек на дюйм) я использую свойство -:
CurrentAutoScaleDimensions.Height / 96
... для получения коэффициента масштабирования шрифта. (Обычные устройства 96 точек на дюйм)
В крайнем случае, вы можете использовать условные операторы (if) в вашем повторно сгенерированном коде для проверки различных размеров / форм экрана.
По-прежнему можно использовать конструктор для базового макета, но вам нужно будет запустить формы на различных эмуляторах / устройствах и попробовать переключить портрет / пейзаж, чтобы полностью протестировать методы «регенерации».
Пожалуйста, посмотрите мой новый ответ. Я немного покопался в этой проблеме и нашел гораздо лучший способ справиться с разрешениями экрана.