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

Clarion, Clarion 7

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

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

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

Сообщение Yufil »

Может быть, про таскбар забыли? :D

У меня виндовые обучалки при запуске запрашивают режим:

Стандартный - указано в настройках ( обычно 1024x768 )
Оптимальный - с сохранением пропорций ( таскбар не перекрывается )
Максимальный - с занятием всего свободного места на экране

Главное окно - MDI Frame, но без рамки, никаких просветов не остаётся.

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

GetTaskbarInfo       PROCEDURE  (*LONG PAR:X,*LONG PAR:Y,*LONG PAR:W,*LONG PAR:H)
WindowClass   CString('Shell_TrayWnd') 
WindowNamePtr LONG(0) 

R       GROUP
left     SIGNED
top      SIGNED
right    SIGNED
bottom   SIGNED
              END   

Loc:Handle    LONG               

  CODE
    ! Получили Handle 
    Clear(R) 
    LOC:HANDLE = FINDWINDOW(Address( WindowClass ), WindowNamePtr ) 
    ! Получили размер таскбара 
    IF LOC:HANDLE 
       GetWindowRect(Loc:Handle,R) 
       ! Возвращаем размеры 
       Par:X = R.LEFT 
       Par:Y = R.TOP 
       Par:W = R.Right - R.Left 
       Par:H = R.Bottom - R.Top
    END    
    !GLO:TaskBarXPos = PAR:X
    !GLO:TaskBarYPos = PAR:Y
    !GLO:TaskBarWidth = PAR:W
    !GLO:TaskBarHeight = PAR:H
    RETURN
    
Аватара пользователя
vic7tar
Ветеран
Сообщения: 365
Зарегистрирован: 09 Февраль 2017, 20:12

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

Сообщение vic7tar »

Для просмотра характеристик окон использую Control Viewer, может кому пригодится.
Вложения
Control Viewer.zip
(784.83 КБ) 100 скачиваний
C10, Win10x64
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7330
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

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

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

Yufil писал(а): 29 Октябрь 2020, 9:51 Может быть, про таскбар забыли?
Нет. И мне не нужно принудительно перекрывать TaskBar.
Мне нужно получить рабочую область с текущими настройками рабочего стола
(и далее уже контролировать выход окна за его пределы)
И, кстати, TaskBar может быть не только традиционно снизу ... ;)

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

       ! Получить реальный размер рабочего стола Windows
       Loc:hMonitor = MonitorFromWindow(GetShellWindow(),xMy_MONITOR_DEFAULTTOPRIMARY)
       If Loc:hMonitor
          Loc:MInfo.cbSize = Size(Loc:MInfo)
          If GetMonitorInfo(Loc:hMonitor,Address(Loc:MInfo))
             XClient# = Loc:MInfo.rcWork.eLeft     ! Доступная зона рабочего стола Windows 
             YClient# = Loc:MInfo.rcWork.eTop
             WClient# = Loc:MInfo.rcWork.eRight
             HClient# = Loc:MInfo.rcWork.eBottom
          end
       end
Последний раз редактировалось Игорь Столяров 29 Октябрь 2020, 16:22, всего редактировалось 1 раз.
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4562
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

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

Сообщение finsoftrz »

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

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

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

finsoftrz писал(а): 29 Октябрь 2020, 16:04 Стесняюсь спросить, а нафига все это?
Это всё та же старая тема viewtopic.php?f=1&t=3983 ;)

Просто тогда, усилили штатные костыли своими, и не были решены все вопросы. :(
Например, как вернуть в зону видимости NotMDI окно вывалившееся за зону видимости
рабочего стола Windows при смене разрешения.

А сейчас ещё добавились новые условия - например при использовании AnyFont нужно
контролировать попадание Window в рабочую зону AppFrame, когда у них разный масштаб
(шрифт и его размер). Да и вообще осенью обостряется тяга к необычным задачам ! :)
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4562
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

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

Сообщение finsoftrz »

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

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

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

finsoftrz писал(а): 29 Октябрь 2020, 16:37 Для mdi окон контролируется выход окна за пределы фрейма.
Не совсем ... контролируется увеличение размера больше фрейма, а задвинуть окно за фрейм - запросто.
К тому же можно исправить пограничный случай - когда окно перед закрытием частично было за границей фрейма.
Также есть ситуации, когда меняется размер рабочей области фрейма - например из-за отключения TOOLBAR.
finsoftrz писал(а): 29 Октябрь 2020, 16:37 Еще может быть 2 монитора, как тогда?
Таки мониторов может быть намного больше чем один ! :) Зависит от режима включения.
Либо Вы получите один рабочий стол гигантского размера, либо список активных мониторов -
см. описание MonitorFromWindow(). :)
За теми кто отстал - не возвращаться. (С) Кодекс
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

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

Сообщение kreator »

finsoftrz писал(а): 29 Октябрь 2020, 16:37 Еще может быть 2 монитора, как тогда?
И один из них выключен. Интересная задача - узнать не выключен ли монитор?
We are hard at work… for you. :)
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7330
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

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

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

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

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

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

Кстати, есть ещё одно применение (подсказал идею юзер).

Как известно, в C63 RTL есть клюк с разворачиванием MDI окон в полноэкранный режим.
Разработчики обычно просто выключают эту возможность (Maximize Box = OFF), а юзеры
приспосабливаются выполняя в программе ОКНО -> Заголовки, при котором MDI окно
автоматом растягивается на максимально возможный размер.

Но не дай бог хоть чуть изменить размер рабочей области AppFrame ... но сейчас даже не об этом.
Если использовать AnyFont - то рано или поздно окно не попадёт в рабочую область AppFrame -
это связано с погрешностью округления при пересчёте размеров в целочисленные значения +
переходы пиксели в условные единицы измерения и обратно. :(
Код есть, смотрел, ничего с этим сделать нельзя ... кроме как каждый раз контролировать попадание
окна в рабочую область с последующей коррекцией его размера.
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4562
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

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

Сообщение finsoftrz »

Чтобы отследить окна, задвинутые за пределы фрейма - древняя задача, которая не раз обсуждалась.

Тема какая-то депрессивная. :-)
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4562
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

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

Сообщение finsoftrz »

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

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

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

finsoftrz писал(а): 29 Октябрь 2020, 18:25 задвинутые за пределы фрейма - древняя задача
Я бы сказал - вечная. Ибо в штатных классах она не решена, а дальше кто как смог - тот так и сделал. :)
И решать её надо вместе со смежной задачей - окно за пределами рабочего стола Windows.
Что в общем-то я и делаю на досуге. :)
finsoftrz писал(а): 29 Октябрь 2020, 18:29 Тоже много раз обсуждалось. Скучно.
Да, не актуально, т.к. баг давно устранён ещё в C7/C8.
Но сама техника развёртывания окна на максимальный размер интересна для тестирования. ;)
Ибо, как обсуждалось ранее, получить расчётным путём максимальный размер MDI окна - нетривиально. :(
finsoftrz писал(а): 29 Октябрь 2020, 18:29 без цели обхода бага с максимизацией более юзабельно
Уф ! Да, но пока Вы работаете Вы работаете с общим масштабом во всём приложении, а значит
можете использовать штатные условные единицы измерения окон. Переход на пиксели всё меняет.
Я уже думал, а не проще ли вообще весь класс INIClass переписать на пиксели, чем долбиться с
точностью и округлением пересчёта координат и размеров окон ... ;)
Последний раз редактировалось Игорь Столяров 29 Октябрь 2020, 20:15, всего редактировалось 1 раз.
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4562
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

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

Сообщение finsoftrz »

После открытия фрейма запоминаем его высоту и ширину в глобальных переменных. После открытия окна проверяем левую и верхнюю границы. Все просто.

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

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

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

finsoftrz писал(а): 29 Октябрь 2020, 20:13 После открытия окна проверяем левую и верхнюю границы. Все просто.
Здесь достаточно, что бы координаты окна были натуральными числами, т.к. для MDI координаты внутри Frame.
А вот контроль правой и нижней границы действительно нужен. И обнаружив выход (части) окна за Frame надо
что-то делать ... :)
За теми кто отстал - не возвращаться. (С) Кодекс
Ответить