2008-11-18 2 views
12

Я разрабатываю элемент управления картой в WPF с помощью C#. Я использую управление холстом, например. 400 x 200, которому назначена область карты, например. 2 000 м x 1000 м.C# WPF разрешение независимость?

Масштаб карты будет: canvas_size_in_meters/real_size_in_meters.

Я хочу найти canvas_size_in_meters.

Холст. Атрибут ширины дает ширину в единицах измерения (независимые от устройства) устройства. Таким образом, 400 DIU составляет 400/96 = 4,17 дюйма, ПРЕДОСТАВЛЯЕТ, что физическое разрешение моего монитора составляет 96 точек на дюйм.

Однако, используя линейку, я обнаружил, что физическое разрешение моего монитора составляет 87 точек на дюйм. (Есть только несколько мониторов, которые на самом деле имеют 96 физических dpi)

Эта разница DPI (10%) переводит на + 10% разницу в фактической ширине управления сетью на экране.

Как измерить размер элемента управления WPF в дюймах ТОЧНО и независимо от разрешения экрана и настройки DPI?

ответ

9

Как измерить размер элемента управления WPF в дюймах ТОЧНО и независимо от разрешения экрана и настройки DPI?

Это не реально, потому что для его работы WPF должен будет знать разрешение (с точки зрения DPI) вашего монитора. Звучит неплохо в теории, но на практике окна не знают эту информацию. Вот почему окна сами по себе всегда принимают 96dpi вслепую, а не умнее об этом.

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

Лучшее, что вы можете сделать, это нарисовать масштаб, например, карты google. Вы знаете, что 1 pixel == 1 миля, поэтому вы можете нарисовать линию на 50 пикселов на своей карте с надписью «Эта линия равна 50 милям»

0

Благодарим вас за быстрый ответ.

Я полностью согласен, но я не хотел в это верить. Вы видите, что должен быть приблизительно расчет масштаба карты, если карта используется для отображения разных слоев данных карты (зависит от масштаба). Большинство приложений используют ползунок, например, 10 дискретных уровней карты для установки «шкалы».

Наличие абсолютной шкалы не имеет решающего значения для приложения, было бы неплохо отобразить ориентировочную шкалу, например 1: 15 000.

Абсолютный масштаб потребует дополнительной переменной monitorPhysicalDPI (изначально установленный на 96), что если использование, выбранное для изменения, даст немного лучшее масштабирование (опять же это не имеет решающего значения). Размер контроля карты будет следующим:

map.ActualWidth * (96/monitorPhysicalDPI) * inchesPerDIU, inchesPerDIU является 1/96

Опять это косметика .. Не было бы хорошо, если бы знал, что Windows, размеры фактического элемента управления? (пользователь должен будет предоставить информацию о размерах экрана при настройке ОС или просто установить файл INF монитора)

+0

Было бы здорово. Вы можете просматривать документы Word и PDF и устанавливать их на 100% масштабирование и фактически просматривать правильный размер страницы. Я ошеломлен, что они не пытались исправить это много лет назад :-( – 2008-11-23 19:56:22

1

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

Сначала получите текущее разрешение. Предположим, что это 1280x1024 Теперь получите ширину монитора в мм с помощью функции GetDeviceCaps. Его стандартная функция библиотеки окон.

int widthmm = GetDeviceCaps (deviceContext, HORZSIZE); ширина Мой монитор 362 мм

Так размер пиксела = 362/1280 = 0,282 мм

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

Таким образом, чтобы ответить на исходный вопрос, размер холста 400 x 200 пикселей будет равен (400 * 0.282/1000) x (200 * 0.282/1000) в метрах, если это будет показано на моем мониторе.

Смежные вопросы