Страница 1 из 10
Загадка про размер окна
Добавлено: 28 Октябрь 2020, 16:46
Игорь Столяров
Привет всем !
Либо я чего-то не понимаю, либо оно чего-то не того.
1. Есть HD монитор с высотой экрана = 1080, без панели задач высота рабочего стола = 1040.
(Это ежу понятно, но для подстраховки - функции WinAPI возвращают эти же значения)
2. Берём самое обычное NotMDI окно и растягиваем его максимально по высоте рабочего стола.
Получаем высоту = 988
Код: Выделить всё
0{Prop:Pixels} = True
Message(0{Prop:Height}) ! = 988
0{Prop:Pixels} = False
Почему оно так ? Кто-нибудь это может объяснить ?
Заранее спасибо, потому что у меня уже идей нет абсолютно.
Загадка про размер окна
Добавлено: 28 Октябрь 2020, 17:01
finsoftrz
Высоту заголовка окна надо учитывать.
Загадка про размер окна
Добавлено: 28 Октябрь 2020, 19:15
Игорь Столяров
Спасибо за наводку ... действительно, если выполнить:
Код: Выделить всё
SELF.Open(Window) ! Open window
0{Prop:Height} = 0
Display
то получается вот такое окно "нулевой высоты", как раз высотой в недостающие 52 px.
- 1.jpg (6.44 КБ) 2358 просмотров
Интересно, а можно как-то это значение получить ?
Ведь высота шапки и строки состояния зависит от темы оформления, системного шрифта и.д.
Загадка про размер окна
Добавлено: 28 Октябрь 2020, 19:32
Дед Пахом
Чем GetClientRect не устраивает?
Загадка про размер окна
Добавлено: 28 Октябрь 2020, 19:53
finsoftrz
Если win api не, то можно тупо так, передав в параметрах шрифт исходного окна.
Код: Выделить всё
FsWindowTitleHeight FUNCTION (lop:font,lop:size) ! Объявление процедуры
FilesOpened LONG
Loc:Height LONG
wind WINDOW('Заголовок'),AT(,,145,100),FONT('MS Sans Serif',8,,),GRAY
END
CODE ! Начало исполняемого кода
open(wind)
wind{prop:font}=lop:font
wind{prop:fontsize}=lop:size
wind{prop:pixels}=1
wind{prop:text}=''
Loc:Height=wind{prop:height}
wind{prop:text}='Заголовок'
Loc:Height=Loc:Height - wind{prop:height}
wind{prop:pixels}=0
close(wind)
RETURN(Loc:Height)
Загадка про размер окна
Добавлено: 28 Октябрь 2020, 21:21
Игорь Столяров
Дед Пахом писал(а): ↑28 Октябрь 2020, 19:32
Чем GetClientRect не устраивает?
Это размер рабочей области ... Для окна я делаю по справке:
Код: Выделить всё
If GetWindowRect(Windows{Prop:Handle}, GrRectInfo) ...
В принципе - работает. Но разброс результатов - катастрофический.
Через WinAPI для NotMDI окон получается идеально высота и так себе ширина.
Для MDI окон - идеально ширина и вообще непонятная высота.
Как с этим жить - ХЗ !
Загадка про размер окна
Добавлено: 28 Октябрь 2020, 21:28
Дед Пахом
Вы там линейкой что ли меряете?
Загадка про размер окна
Добавлено: 28 Октябрь 2020, 21:35
Игорь Столяров
Дед Пахом писал(а): ↑28 Октябрь 2020, 21:28
Вы там линейкой что ли меряете?
Ага ! Делаю снимок экрана и вставляю в PainBrush. Выделяю окно и вижу его реальный размер в пикселях.
Загадка про размер окна
Добавлено: 28 Октябрь 2020, 21:46
Дед Пахом
На GetWindowRect весь интерфейс Windows держится, оно не может врать.
Загадка про размер окна
Добавлено: 28 Октябрь 2020, 22:36
Игорь Столяров
Дед Пахом писал(а): ↑28 Октябрь 2020, 21:46
оно не может врать
Да я это прекрасно понимаю.
Проблема в стыковке данных GetWindowRect и того, что Clarion RTL сохраняет как координаты и размеры окон.
Загадка про размер окна
Добавлено: 28 Октябрь 2020, 22:56
Дед Пахом
GetWindowRect возвращает абсолютные координаты, надо их перевести в относительные (ScreenToClient) и тогда уже сравнивать с Prop:Xpos и т.д.
Загадка про размер окна
Добавлено: 29 Октябрь 2020, 6:44
Игорь Столяров
Дед Пахом писал(а): ↑28 Октябрь 2020, 22:56
и тогда уже сравнивать с Prop:Xpos и т.д.
Если мы говорим о NotMDI Window, то парадокс ситуации в том, что именно КООРДИНАТЫ окна, которые возвращает
GetWindowRect() всегда идеально совпадают с данными Prop:Xpos / Prop:Ypos (в пикселях есстесно) !
Хрень начинается, когда мы получаем РАЗМЕРЫ окна.
Просто сразу видно, что значения Prop:Width / Prop:Height - вообще не соответствуют реальным,
а то что возвращает GetWindowRect() - уже ближе к реальности, но нет полного соответствия нарисованному.
Я думаю, что это связано с особенностями прорисовки окон Clarion RTL.
Загадка про размер окна
Добавлено: 29 Октябрь 2020, 9:09
Игорь Столяров
Спасибо за содействие, в принципе я разобрался с вопросом ... но таки что я хочу сказать ...
Если у нас есть рабочий стол Windows размером 1920x1040, и мы в Clarion создадим на нём
окно для которого функция WinAPI GetWindowRect() покажет координаты 0,0 и размер 1920x1040 -
то визуально слева, справа и внизу будут явные интервалы где-то по 5 px. Не верь глазам своим.
Загадка про размер окна
Добавлено: 29 Октябрь 2020, 9:19
finsoftrz
Эти 5px скорее всего еще от установленного разрешения зависят.
Загадка про размер окна
Добавлено: 29 Октябрь 2020, 9:33
Игорь Столяров
Возможно ... но точно, что визуальный размер окон нарисованных Clarion RTL не соответствует WinAPI.
Причём это уже с учётом рамки Resize, высоты Title и StatusBar - которые функции Clarion RTL вообще игнорят.