Принудительное масштабирование модели .NetCF 1.0 в приложении .NetCF 2.0 - PullRequest
3 голосов
/ 06 октября 2010

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

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

Я пытался использовать код: AutoScaleDimensions = новый размерF (96,96); AutoScaleMode = AutoScaleMode.Dpi;

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

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

Спасибо.

Ответы [ 2 ]

3 голосов
/ 19 октября 2010

Похоже, что ваш код для создания пользовательских элементов управления содержит жестко закодированные значения, которые предполагают, что определенный 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);
2 голосов
/ 20 октября 2010

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

Я получаю масштабный коэффициент, аналогичный процедуре, описанной в 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.
...