Страница 2 из 10

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

Добавлено: 29 Октябрь 2020, 9:51
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
    

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

Добавлено: 29 Октябрь 2020, 10:51
vic7tar
Для просмотра характеристик окон использую Control Viewer, может кому пригодится.

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

Добавлено: 29 Октябрь 2020, 14:46
Игорь Столяров
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:04
finsoftrz
Стесняюсь спросить, а нафига все это?
Вдруг мне тоже нужно. :-)

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

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

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

А сейчас ещё добавились новые условия - например при использовании AnyFont нужно
контролировать попадание Window в рабочую зону AppFrame, когда у них разный масштаб
(шрифт и его размер). Да и вообще осенью обостряется тяга к необычным задачам ! :)

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

Добавлено: 29 Октябрь 2020, 16:37
finsoftrz
Для mdi окон контролируется выход окна за пределы фрейма.
Для not mdi теоретически ситуация может возникнуть. Мне кажется, довольно редкий случай. Еще может быть 2 монитора, как тогда?

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

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

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

Добавлено: 29 Октябрь 2020, 16:54
kreator
finsoftrz писал(а): 29 Октябрь 2020, 16:37 Еще может быть 2 монитора, как тогда?
И один из них выключен. Интересная задача - узнать не выключен ли монитор?

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

Добавлено: 29 Октябрь 2020, 16:57
Игорь Столяров
kreator писал(а): 29 Октябрь 2020, 16:54 Интересная задача - узнать не выключен ли монитор?
В 2020 г. намного интересней смежная задача - узнать не спёрли ли единственный монитор ... ;)

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

Добавлено: 29 Октябрь 2020, 18:22
Игорь Столяров
Кстати, есть ещё одно применение (подсказал идею юзер).

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

Но не дай бог хоть чуть изменить размер рабочей области AppFrame ... но сейчас даже не об этом.
Если использовать AnyFont - то рано или поздно окно не попадёт в рабочую область AppFrame -
это связано с погрешностью округления при пересчёте размеров в целочисленные значения +
переходы пиксели в условные единицы измерения и обратно. :(
Код есть, смотрел, ничего с этим сделать нельзя ... кроме как каждый раз контролировать попадание
окна в рабочую область с последующей коррекцией его размера.

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

Добавлено: 29 Октябрь 2020, 18:25
finsoftrz
Чтобы отследить окна, задвинутые за пределы фрейма - древняя задача, которая не раз обсуждалась.

Тема какая-то депрессивная. :-)

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

Добавлено: 29 Октябрь 2020, 18:29
finsoftrz
Вместо максимизации окон есть разумное решение - выставлять размеры окна по рабочей области фрейма. На мое восприятие это и без цели обхода бага с максимизацией более юзабельно. Тоже много раз обсуждалось. Скучно.

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

Добавлено: 29 Октябрь 2020, 19:44
Игорь Столяров
finsoftrz писал(а): 29 Октябрь 2020, 18:25 задвинутые за пределы фрейма - древняя задача
Я бы сказал - вечная. Ибо в штатных классах она не решена, а дальше кто как смог - тот так и сделал. :)
И решать её надо вместе со смежной задачей - окно за пределами рабочего стола Windows.
Что в общем-то я и делаю на досуге. :)
finsoftrz писал(а): 29 Октябрь 2020, 18:29 Тоже много раз обсуждалось. Скучно.
Да, не актуально, т.к. баг давно устранён ещё в C7/C8.
Но сама техника развёртывания окна на максимальный размер интересна для тестирования. ;)
Ибо, как обсуждалось ранее, получить расчётным путём максимальный размер MDI окна - нетривиально. :(
finsoftrz писал(а): 29 Октябрь 2020, 18:29 без цели обхода бага с максимизацией более юзабельно
Уф ! Да, но пока Вы работаете Вы работаете с общим масштабом во всём приложении, а значит
можете использовать штатные условные единицы измерения окон. Переход на пиксели всё меняет.
Я уже думал, а не проще ли вообще весь класс INIClass переписать на пиксели, чем долбиться с
точностью и округлением пересчёта координат и размеров окон ... ;)

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

Добавлено: 29 Октябрь 2020, 20:13
finsoftrz
После открытия фрейма запоминаем его высоту и ширину в глобальных переменных. После открытия окна проверяем левую и верхнюю границы. Все просто.

А проверять положение окна приложения относительно экрана это как-то идейно не правильно. Это уровень операционной системы. ИМХО, конечно. Но я бы сто раз подумал, прежде чем лезть в эти дебри.

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

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