Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Пиксели и сантиметры [D7, Win95/98, WinXP]


Страницы:   1 2 3 4

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 цифровым интерфейсом! Где гарантирован размер, органы управления им заблокированы, никаких проблем, как в случае аналогового интерфейса.
И еще у меня два монитора, вне зависимости от того на каком мониторе происходил запуск размеры не меняли, только при изменении разрешения, он почему вдруг становился резко уже.


Страницы:   1 2 3 4

Наверх

Титульная страница Поиск, карта сайта Написать письмо