C # WPF разрешение независимости? - PullRequest
12 голосов
/ 19 ноября 2008

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

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

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

canvas.ActualWidth дает ширину в DIU (независимых от устройства единицах). Итак, 400 DIU - это 400/96 = 4,17 дюйма, ДОКАЗАНО , что физическое разрешение моего монитора составляет 96 dpi.

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

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

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

Ответы [ 3 ]

9 голосов
/ 19 ноября 2008

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

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

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

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

1 голос
/ 16 декабря 2008

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

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

int widthmm = GetDeviceCaps (deviceContext, HORZSIZE); Ширина моего монитора составляет 362 мм

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

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

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

0 голосов
/ 19 ноября 2008

Спасибо за быстрый ответ.

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

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

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

map.ActualWidth * (96 / monitorPhysicalDPI) * inchesPerDIU, inchesPerDIU равен 1/96

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

...