![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Пиксели и сантиметры [D7, Win95/98, WinXP]
apic © (2006-08-18 17:52:00)Мне нужно нарисовать на экране например прямоугольник 10х5 см , в натуральную величину, но в прграммировании графики, насколько я знаю все в пикселях, Так вот может кнонибудь подкинуть ф-ции преобразования пикселейв сми наоборот
Virgo_Style (2006-08-21 08:30:00) [1]Pavia © (21.08.06 0:44) [66]
Точечная статическая модель. несерьезно. Предъявите динамическую распределенную - будет тема для разговора...
guav (2006-08-21 02:17:00) [2]
> А это зависет от драйвера видео карты, а не от монитора
> :-p
Возможно. всё равно у телевизора ключика EDID нет.
KilkennyCat (2006-08-21 02:14:00) [3]> [70] Pavia © (21.08.06 02:05)
неправда.
Pavia (2006-08-21 02:05:00) [4]
> А я решил не ставить драйвер для монитора :-p
А это зависет от драйвера видео карты, а не от монитора :-p
KilkennyCat (2006-08-21 01:59:00) [5]> [68] guav © (21.08.06 01:54)
> А первым у меня там вообще телевизор идёт ;-)
С барахлящим строчником ;)
guav (2006-08-21 01:54:00) [6]> Я решил из реестра прочитать информацию о мониторе. ;)
А я решил не ставить драйвер для монитора :-p
> {Определили имя первого подраздела }
А первым у меня там вообще телевизор идёт ;-)
Pavia (2006-08-21 01:38:00) [7]Я тут подумал новерно надо заменить 'ControlSet001' на 'CurrentControlSet'.
Pavia (2006-08-21 00:44:00) [8]Взлетит куда дентся. :D
Я решил из реестра прочитать информацию о мониторе. ;)
Должно работать в WinNT(WinXP, Win2K).
function ReadEDID(EDID:PByte):Boolean;
var
MyKey:HKey; { Handle для работы с разделом }
StrKey:String;
Buf:array[0..1023] of char; { Буфер }
Err, i:longint;
RegData:DWord;
begin
Result:=True;
StrKey:='SYSTEM\ControlSet001\Enum\DISPLAY\';
Err:=RegOpenKey(HKEY_LOCAL_MACHINE,@StrKey[1],MyKey); { Открыли раздел }
if Err<> ERROR_SUCCESS then
begin
Result:=False;
Exit;
end;
{Определили имя первого подраздела }
Err:=RegEnumKey(MyKey,0,Buf,Sizeof(Buf));
if Err<> ERROR_SUCCESS then
begin
Result:=False;
Exit;
end;
StrKey:=StrKey+Buf+'\';
Err:=RegOpenKey(HKEY_LOCAL_MACHINE,@StrKey[1],MyKey); { Открыли раздел }
if Err<> ERROR_SUCCESS then
begin
Result:=False;
Exit;
end;
{Определили имя первого подраздела }
Err:=RegEnumKey(MyKey,0,Buf,Sizeof(Buf));
if Err<> ERROR_SUCCESS then
begin
Result:=False;
Exit;
end;
StrKey:=StrKey+Buf+'\Device Parameters\';
Err:=RegOpenKey(HKEY_LOCAL_MACHINE,@StrKey[1],MyKey); { Открыли раздел }
if Err<> ERROR_SUCCESS then
begin
Result:=False;
Exit;
end;
i:=256;
RegData:=REG_BINARY;
Err:=RegQueryValueEX(MyKey,'EDID',nil,@RegData,PByte(EDID),@i);
if Err<> ERROR_SUCCESS then
begin
Result:=False;
Exit;
end;
end;
procedure CmPerPixel(var xcmpp,ycmpp: Real);
var
hres,vres,hsiz,vsiz:integer;
Buf:array [0..255] of Byte;
i:Integer;
c:Byte;
begin
hres := GetSystemMetrics(Sm_Cxscreen); {display width in pixels}
vres := GetSystemMetrics(Sm_CYscreen); {display height in pixels}
hsiz := 0;
vsiz := 0;
if ReadEDID(@buf) then
begin
c:=0;
for i:= 0 to 127 do c:=c+Buf[i]; {Check summ}
if c=0 then
begin
hsiz:=buf[21]*10;
vsiz:=buf[22]*10;
for i:=0 to 3 do
case buf[54+i*18+3] of
$FA..$FF:;
else
begin
hsiz:=buf[54+i*18+12]+((buf[54+i*18+14] and $F0)shl 4); {H_SIZE}
vsiz:=buf[54+i*18+13]+((buf[54+i*18+14] and $0F)shl 8); {V_SIZE}
end;
end;
end;
end;
xcmpp := hsiz/hres*0.1;
ycmpp := vsiz/vres*0.1;
end;
Virgo_Style (2006-08-20 17:53:00) [9]ну не взлетит же.
где зависимость от координаты?
Pavia (2006-08-20 17:09:00) [10]Я пока до WMI, но вот функция с карактеровкой. На LSD мониторах должна давать точный результат, а вот на ЖК надо проверить.
function MaxHORRES:DWord;
var
i: Integer;
DevMode : TDeviceMode;
begin
Result:=0;
i:=0;
while EnumDisplaySettings(nil,i,DevMode) do
with Devmode do
begin
if dmPelsWidth>Result then Result:=dmPelsWidth;
inc(i);
end;
end;
procedure CmPerPixel(canvas:TCanvas; var xcmpp,ycmpp: Real);
var h:HDC;
MHRes,hres,vres,hsiz,vsiz:integer;
begin
MHRes:=MaxHORRES;
h:=canvas.handle;
hres := GetDeviceCaps(h,HORZRES); {display width in pixels}
vres := GetDeviceCaps(h,VERTRES); {display height in pixels}
hsiz := GetDeviceCaps(h,HORZSIZE); {display width in mm}
vsiz := GetDeviceCaps(h,VERTSIZE); {display height in mm}
xcmpp := hres/MHRes*hsiz/hres*0.1;
ycmpp := hres/MHRes*vsiz/vres*0.1;
end;
Мефисто (2006-08-20 16:40:00) [11]
> Pavia © (20.08.06 16:31) [62]
Ждем с нетирпением ;)
Хорошая ветка получилась. Может еще этот вопрос на других форумах задать :)
Pavia (2006-08-20 16:31:00) [12]Anatoly Podgoretsky
Я сделал вывод. Попробую получить эти сантиметры другим методом.
Anatoly Podgoretsky (2006-08-20 16:22:00) [13]Вот именно согласно тебе не должен, поскольку размер монитора не меняется. Отсюда сделай вывод насчет этой функии сам.
Pavia (2006-08-20 16:17:00) [14]Посмотрел при разных разрешениях. Виндоус как то хитро меняет цифры, а не должен.
Anatoly Podgoretsky (2006-08-20 15:35:00) [15]Линейка у тебя правильная, просто под каждый монитор и разрешение нужна своя линейка.
хм... (2006-08-20 14:57:00) [16]цифры там и вправду лгут, сейчас написал маленькую программку которая должна нарисовать исходя из этих пикселей квадрат 10см*10см, в итоге в обоих режимах рисовался квадрат 9,5*9,5...
или может у меня линейка неправильная? :)))
Anatoly Podgoretsky (2006-08-20 14:26:00) [17]Мефисто (20.08.06 14:22) [56]
Вообще то у меня слабый монитор, просто М9 не потянул, точнее посчитал не экономичным для дома.
vrem (2006-08-20 14:22:00) [18]Эскперимент - пусть каждый измерит.
Мефисто (2006-08-20 14:22:00) [19]
> Anatoly Podgoretsky © (20.08.06 14:20) [54]
Вах, хороший у Вас LCD с таким высоким разрешением. А я думал по разрешениям это ЭЛТ :)
Anatoly Podgoretsky (2006-08-20 14:20:00) [20]Мефисто (20.08.06 14:06) [53]
Я тестировал LCD c цифровым интерфейсом! Где гарантирован размер, органы управления им заблокированы, никаких проблем, как в случае аналогового интерфейса.
И еще у меня два монитора, вне зависимости от того на каком мониторе происходил запуск размеры не меняли, только при изменении разрешения, он почему вдруг становился резко уже.