
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[35.175.191.46] |
![]() |
|
Сообщ.
#1
,
|
|
|
Приветствую!
Рубрика глупых вопросов продолжается. Подскажите, пожалуйста, возможно ли на TImage нарисовать линию длиною ровно одим см, чтобы этот см. соответствовал через экран реальному 1см? При этом, чтобы это был см. на любом мониторе? Как я понимаю, Windows в 100% масштабе возвращает 96 DPI и с этим ничего не поделать? Проблема ж, как я понимаю, в невозможности определить размер экрана? ![]() |
Сообщ.
#2
,
|
|
|
Кажется стоит откалибровать монитор. У меня тоже самое рисует линию строго в 1 см.
Как по горизонтали так и по вертикали. Как на Lazarus под Linux, так и на Delphi7 под Windows 7 на VirtualBox под Linux. Скрытый текст Скрытый текст Linux wine Прикреплённый файл ![]() Скрытый текст Linux lazarus Прикреплённый файл ![]() |
Сообщ.
#3
,
|
|
|
macomics, мне кажется, дело не в калибровке. Да и как на ноуте калибровать монитор?)
Кстати, у Вас на Lazarus почему-то подлиннее вышло, но у меня все равно это не см. |
Сообщ.
#4
,
|
|
|
Цитата The_Immortal @ Проблема ж, как я понимаю, в невозможности определить размер экрана? Все упирается в вопрос определения размеров "пикселя". Это зависит от заявленной DPI и физических размеров отображаемой области экрана. По-скольку мы имеем дело с дискретными сущностями, о строгой точности можно забыть. А если принять за экран, к примеру, рекламное табло 20м x 6м, то может и о точности можно забыть, ибо там размер "пикселя" размеру размеру светодиода (а возможно и трех). |
Сообщ.
#5
,
|
|
|
Majestio,
Цитата Majestio @ Ну DPI и размеры можно же узнавать? Касательно DPI, кстати, тоже проблема - Венда всегда возвращает значением 96, такой некий baseline. Как узнать это значение реальное - не ясно. Это зависит от заявленной DPI и физических размеров отображаемой области экрана |
Сообщ.
#6
,
|
|
|
Цитата The_Immortal @ Ну DPI и размеры можно же узнавать? DPI корректны исключительно из технических характеристик матриц, а не то, что отображает венда. При этом следует понимать, что монитор/дисплей/панель/возможно смартфон - не обязаны работать в предопределенным оптимальном заводском видио-режиме. Андестенд? P.S. В свое дело я было занялся идентификацией CPU ... но вовремя бросил это неблагодарное дело, когда список CPU превысил 30шт. P.PS. Если тебе нужен "строгий" сантиметр сетки на экране - предусмотри свою калибровку! Самый надёжный варик - имхо. |
Сообщ.
#7
,
|
|
|
Цитата Majestio @ предусмотри свою калибровку! Поддерживаю. Сделать это не так сложно, но придётся взаимодействовать с пользователем. Иначе не узнать истинный размер. |
Сообщ.
#8
,
|
|
|
macomics, я даже не могу нагуглить как вручную откалибровать монитор свой, а уж тем паче как это делать через дельфик...
![]() Вот, к примеру, как люди "развлекаются" с калибровкой через переустановку драйверов. О каком тут взаимодействии с пользователем может идти речь?.. |
Сообщ.
#9
,
|
|
|
За 5 минут набросал примерную форму калибровки
![]() ![]() object Form1: TForm1 Left = 192 Top = 124 Width = 570 Height = 463 Caption = 'Form1' Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] OldCreateOrder = False OnCreate = FormCreate OnPaint = FormPaint PixelsPerInch = 96 TextHeight = 13 object ScrollBar1: TScrollBar Left = 160 Top = 8 Width = 385 Height = 17 LargeChange = 10 Max = 385 Min = 1 PageSize = 0 Position = 1 TabOrder = 0 TabStop = False OnScroll = ScrollBar2Scroll end object ScrollBar2: TScrollBar Left = 160 Top = 32 Width = 17 Height = 385 Kind = sbVertical LargeChange = 10 Max = 385 Min = 1 PageSize = 0 Position = 10 TabOrder = 1 TabStop = False OnScroll = ScrollBar2Scroll end end ![]() ![]() unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ScktComp, Menus, StdCtrls; type TForm1 = class(TForm) ScrollBar1: TScrollBar; ScrollBar2: TScrollBar; procedure FormPaint(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); var SDC: HDC; begin SDC := GetDC(0); ScrollBar1.Position := Round(10 * GetDeviceCaps(SDC, LOGPIXELSX) / 25.4); ScrollBar2.Position := Round(10 * GetDeviceCaps(SDC, LOGPIXELSY) / 25.4); end; procedure TForm1.FormPaint(Sender: TObject); begin with Canvas do begin MoveTo(10, 10); LineTo(10 + ScrollBar1.Position, 10); MoveTo(20, 20); LineTo(20, 20 + ScrollBar2.Position); end; end; procedure TForm1.ScrollBar2Scroll(Sender: TObject; ScrollCode: TScrollCode; var ScrollPos: Integer); begin Repaint; end; end. |
Сообщ.
#10
,
|
|
|
macomics, можно попытаться использовать
эти функции: PhysicalToLogicalPointForPerMonitorDPI LogicalToPhysicalPointForPerMonitorDPI PhysicalToLogicalPoint LogicalToPhysicalPoint Эта книга может быть интересна для решения такой задачи: Том 4 |
Сообщ.
#11
,
|
|
|
Цитата ЫукпШ @ Эта книга может быть интересна для решения такой задачи: Том 4 А теперь тоже самое, но под Lazarus на Linux. |