Независимость разрешения C # WPF?

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

Масштаб карты будет: размер_холста_в_метрах / реальный_размер_в_метрах.

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

Canvas.ActualWidth дает ширину в DIU (независимые от устройства единицы). Итак, 400 DIU составляют 400/96 = 4,17 дюйма, ПРЕДУСМОТРЕНО, что физическое разрешение моего монитора составляет 96 точек на дюйм.

Однако с помощью линейки я обнаружил, что физическое разрешение моего монитора составляет 87 точек на дюйм. (Есть только несколько мониторов, которые ДЕЙСТВИТЕЛЬНО имеют 96 точек на дюйм)

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

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


person Community    schedule 18.11.2008    source источник


Ответы (3)


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

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

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

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

person Orion Edwards    schedule 19.11.2008

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

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

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

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

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

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

person Community    schedule 16.12.2008

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

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

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

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

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

Опять же, это косметика ... Было бы неплохо, если бы Windows знала ФАКТИЧЕСКИЕ размеры элемента управления? (пользователю необходимо указать размеры экрана при настройке ОС или просто установить INF-файл монитора)

person Community    schedule 19.11.2008
comment
Было бы здорово. Вы можете просматривать текстовые документы и PDF-файлы и устанавливать для них 100% масштаб и фактически просматривать правильный размер страницы. Я ошеломлен, что они не пытались исправить это много лет назад :-( - person Orion Edwards; 23.11.2008