Загадка про размер окна

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7328
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Загадка про размер окна

Сообщение Игорь Столяров »

Привет всем ! :)

Либо я чего-то не понимаю, либо оно чего-то не того. :(

1. Есть HD монитор с высотой экрана = 1080, без панели задач высота рабочего стола = 1040.
(Это ежу понятно, но для подстраховки - функции WinAPI возвращают эти же значения)

2. Берём самое обычное NotMDI окно и растягиваем его максимально по высоте рабочего стола.
Получаем высоту = 988

Код: Выделить всё

  0{Prop:Pixels} = True
  Message(0{Prop:Height}) ! = 988
  0{Prop:Pixels} = False
Почему оно так ? Кто-нибудь это может объяснить ? :(
Заранее спасибо, потому что у меня уже идей нет абсолютно.
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4560
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

Загадка про размер окна

Сообщение finsoftrz »

Высоту заголовка окна надо учитывать.
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7328
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Загадка про размер окна

Сообщение Игорь Столяров »

Спасибо за наводку ... действительно, если выполнить:

Код: Выделить всё

  SELF.Open(Window)  ! Open window
  0{Prop:Height} = 0
  Display
то получается вот такое окно "нулевой высоты", как раз высотой в недостающие 52 px. :(

1.jpg
1.jpg (6.44 КБ) 2311 просмотров

Интересно, а можно как-то это значение получить ?
Ведь высота шапки и строки состояния зависит от темы оформления, системного шрифта и.д.
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Загадка про размер окна

Сообщение Дед Пахом »

Чем GetClientRect не устраивает?
С уважением, ДП
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4560
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

Загадка про размер окна

Сообщение 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)
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7328
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Загадка про размер окна

Сообщение Игорь Столяров »

Дед Пахом писал(а): 28 Октябрь 2020, 19:32 Чем GetClientRect не устраивает?
Это размер рабочей области ... Для окна я делаю по справке:

Код: Выделить всё

  If GetWindowRect(Windows{Prop:Handle}, GrRectInfo) ...
В принципе - работает. Но разброс результатов - катастрофический. :(
Через WinAPI для NotMDI окон получается идеально высота и так себе ширина.
Для MDI окон - идеально ширина и вообще непонятная высота. :(
Как с этим жить - ХЗ ! :(
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Загадка про размер окна

Сообщение Дед Пахом »

Вы там линейкой что ли меряете?
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7328
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Загадка про размер окна

Сообщение Игорь Столяров »

Дед Пахом писал(а): 28 Октябрь 2020, 21:28 Вы там линейкой что ли меряете?
Ага ! Делаю снимок экрана и вставляю в PainBrush. Выделяю окно и вижу его реальный размер в пикселях. :)
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Загадка про размер окна

Сообщение Дед Пахом »

На GetWindowRect весь интерфейс Windows держится, оно не может врать.
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7328
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Загадка про размер окна

Сообщение Игорь Столяров »

Дед Пахом писал(а): 28 Октябрь 2020, 21:46 оно не может врать
Да я это прекрасно понимаю.
Проблема в стыковке данных GetWindowRect и того, что Clarion RTL сохраняет как координаты и размеры окон. :(
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Загадка про размер окна

Сообщение Дед Пахом »

GetWindowRect возвращает абсолютные координаты, надо их перевести в относительные (ScreenToClient) и тогда уже сравнивать с Prop:Xpos и т.д.
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7328
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Загадка про размер окна

Сообщение Игорь Столяров »

Дед Пахом писал(а): 28 Октябрь 2020, 22:56 и тогда уже сравнивать с Prop:Xpos и т.д.
Если мы говорим о NotMDI Window, то парадокс ситуации в том, что именно КООРДИНАТЫ окна, которые возвращает
GetWindowRect() всегда идеально совпадают с данными Prop:Xpos / Prop:Ypos (в пикселях есстесно) !

Хрень начинается, когда мы получаем РАЗМЕРЫ окна. :(
Просто сразу видно, что значения Prop:Width / Prop:Height - вообще не соответствуют реальным,
а то что возвращает GetWindowRect() - уже ближе к реальности, но нет полного соответствия нарисованному.
Я думаю, что это связано с особенностями прорисовки окон Clarion RTL. :(
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7328
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Загадка про размер окна

Сообщение Игорь Столяров »

Спасибо за содействие, в принципе я разобрался с вопросом ... но таки что я хочу сказать ... ;)
Если у нас есть рабочий стол Windows размером 1920x1040, и мы в Clarion создадим на нём
окно для которого функция WinAPI GetWindowRect() покажет координаты 0,0 и размер 1920x1040 -
то визуально слева, справа и внизу будут явные интервалы где-то по 5 px. Не верь глазам своим. ;)
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4560
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

Загадка про размер окна

Сообщение finsoftrz »

Эти 5px скорее всего еще от установленного разрешения зависят.
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7328
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Загадка про размер окна

Сообщение Игорь Столяров »

Возможно ... но точно, что визуальный размер окон нарисованных Clarion RTL не соответствует WinAPI.
Причём это уже с учётом рамки Resize, высоты Title и StatusBar - которые функции Clarion RTL вообще игнорят.
За теми кто отстал - не возвращаться. (С) Кодекс
Ответить