Принудительное масштабирование модели.NetCF 1.0 в приложении.NetCF 2.0

У меня есть большое приложение, разработанное в.Net Compact Framework 1.0, которое было разработано за последние 9 лет с большим количеством форм и пользовательских элементов управления. Приложение предназначено для экранов 240х320. Он хорошо масштабируется до экрана 480x640 при компиляции с Compact .Net 1.0 и Visual Studio 2003.

Я обновил приложение до.Net 2.0 с помощью мастера обновления по умолчанию Visual Studio 2008. Приложение использует полноэкранный режим, и все элементы управления расположены так, как это предусмотрено при использовании устройства с разрешением 240x320. Но приложение использует только верхний левый 25% экрана при использовании устройства с разрешением 480х640.

Я пытался использовать код: AutoScaleDimensions = new SizeF(96,96); AutoScaleMode = AutoScaleMode.Dpi;

Он работает с формой, но не работает с динамическими элементами управления (стандартными / пользовательскими), размещенными на форме.

Есть ли способ заставить приложение использовать масштабирование, подобное тому, которое выполняется при использовании.Net 1.0, без использования свойств AutoScaleDimensions/AutoScaleMode.

Благодарю.

2 ответа

Решение

Я нашел своего рода решение этой проблемы.

Я получаю масштабный коэффициент, аналогичный процедуре, описанной в simons19, а затем при добавлении любого динамически созданного элемента управления в форму я вызываю метод control.Scale(масштабный коэффициент). Это решило мою проблему. Метод Scale масштабирует как Location, так и Size элемента управления, поэтому я устанавливаю свойства location и size динамически созданного элемента управления перед вызовом свойства scale.

Пример:

Label lblTest = new Label();
lblTest.Text = "A Test Label";
lblTest.Location = new Point(10, 5);  //Designed in relation to a 96 dpi screen
lblTest.Size = new Size(30, 10);      //Size Designed in relation to 96 DPI screen
parentControl.Controls.Add(lblTest);
//Scale Factor is calculated as mentioned by simons19
lblTest.Scale(scaleFactor);           //Scale the control to the screen DPI.

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

Вы можете проанализировать разрешение хоста устройства, на котором работает ваше приложение, используя что-то вроде:

const float designResolution = 96.0f; 
float scaleFactor;

System.Drawing.Graphics g = f.CreateGraphics();
float runningResolution = g.DpiX;
scaleFactor = runningResolution / designResolution;
g.Dispose();

Затем вы изменили бы любые жестко запрограммированные координаты в своем коде, который создает динамические элементы управления, чтобы скорректировать значения с помощью вычисляемого scaleFactor, например:

const int controlY = 8;
int yPosition = (int)(controlY * scaleFactor);
Другие вопросы по тегам