HorResol,VertResol,HorScWidth,VertScHeight: Integer;
PixXFact,PixYFact: Double;
...
HorResol := GetDeviceCaps(GetDC(HWND(Nil)),HORZRES);
VertResol := GetDeviceCaps(GetDC(HWND(Nil)),VERTRES);
HorScWidth := GetDeviceCaps(GetDC(HWND(Nil)),HORZSIZE);
VertScHeight := GetDeviceCaps(GetDC(HWND(Nil)),VERTSIZE);
PixXFact := HorResol/HorScWidth;
PixYFact := VertResol/VertScHeight;
Перевод пикселей в миллиметры
Пробовал:
1.
Вычисляю число пикселей в миллиметре по X и по Y:
Код:
Но такой вариант дает весьма неточные значения, которые с увеличением значения отображаемой величины, очень сильно искажаются.
2.
Есть свойство класса TScreen - PixelsPerInch, которое дает число пикселей в логическом дюйме по вертикали. Но, очевидно, этого недостаточно.
Каким еще образом можно решить эту проблему, получив при этом более или менее приемлемые данные ?
Использовать функцию PixelsPerInch, а при переводе в милиметры(сантиметры) указывать с большей точностью значение дюйм/сантиметр. Проверял на практике - распечатывал линии и линеечкой измерял :p
во-первых, насколько я понимаю автору надо, чтобы размер на экране совпадал с вычисленным; во-вторых: где-то читал, что PixelsPerInch дает хорошие результаты только тогда, когда стоит родной драйвер монитора, который идет вместе с монитором.
вообще задача, как видно, непростая.
Код:
PixXFact := 2.54/GetDeviceCaps(GetDC(HWND(Nil)),LOGPIXELSX);
PixYFact := 2.54/GetDeviceCaps(GetDC(HWND(Nil)),LOGPIXELSY);
PixYFact := 2.54/GetDeviceCaps(GetDC(HWND(Nil)),LOGPIXELSY);
LOGPIXELSX Number of pixels per logical inch along the screen width.
LOGPIXELSY Number of pixels per logical inch along the screen height.
И когда я мерял размер своего монитора, он совпал абсолютно...
Про драйвера kosfiz абсолютно прав: если драйвер вам скажет, что у вас метр на метр, то тут уж не попишешь :D
Смотрим в исходник класса TScreen:
Код:
begin
...
DC := GetDC(0);
FPixelsPerInch := GetDeviceCaps(DC, LOGPIXELSY);
...
end;
...
DC := GetDC(0);
FPixelsPerInch := GetDeviceCaps(DC, LOGPIXELSY);
...
end;
;)