Страница 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
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 вообще игнорят.