Итак, как таки окну правильно задать нужный размер? HWND/HMONITOR и всё такое пр
От: пффф  
Дата: 16.01.23 21:17
Оценка:
Привет!

Пишу на WTL, так как в своё время неплохо с ней работал, как и с WinAPI, которое она довольно минимально оборачивает в плюсики, но, как оказалось, подзабыл многое.

Задача:
  1. При старте определить, на каком мониторе винда запустила приложение, и задать размеры и положение окна как мне нужно, на том мониторе, на котором винда запустила приложение.
  2. При перемещении окна определить, на какой монитор его переместили (по окончании перемещения), и установить нужные мне размеры и положение на том мониторе.
  3. Сохранить положение окна (и, соответственно, монитор — как я понял, координаты окна глобальны между мониторами), и восстановить при перезапуске — это наверное осилю сам, если разберусь с предыдущими пунктами

Пока разбираюсь с первым пунктом.
С мониторами разобрался — по hwnd окна и по координатам left-top умею получать HMONITOR, по HMONITOR'у получаю его размеры и положение и размер и положение рабочей области, тут всё работает.

А далее — не очень пошло. Какие сообщения и в какой момент обрабатывать — не особо понятно.

Попробовал перехватить WM_CREATE — в этот момент m_hWnd ещё не инициализирован хэндлом окна — не работает.

ISysInfo и SysInfoImplWin32 — интерфейс абстракции от ОС и его реализация под винду (SysInfo — изначально было только получение всяких данных систем специфик, потом отрефакторю, возможно). Всякие хэндлы везде разные, поэтому hwnd главного окна присовываю в статик член реализации, чтобы остальной код ничего о них не знал.

Попробовал перехватить WM_SHOWWINDOW:
    void OnShowWindow(BOOL bShow, UINT nStatus)
    {
        // SetMsgHandled(FALSE);
        // SysInfoImplWin32::init(m_hWnd);

        if (bShow)
        {
            SysInfoImplWin32::init(m_hWnd);
            ISysInfo *pSysInfo = ISysInfo::getSysInfoPtr();
            tryAdjustAppMainWindowPosSize(pSysInfo); // Тут унутре вызывается MoveWindow. Проверил - размеры и положение вычисляются и передаются в MoveWindow правильно, но эффекта не дает
        }
    }

Окно отображается в том виде, в каком его по дефолту винда запускает, игнорируя мой MoveWindow.

Попробовал перехватить WM_WINDOWPOSCHANGING
Автор: пффф
Дата: 16.01.23
— получил, что окно отображается в том виде, в каком его по дефолту винда запускает, игнорируя мои установки, но GetClientRect почему-то начинает возвращать размер, как-будто окно большое, как если бы сработал мой вызов MoveWindow с моими размерами.

Во время перемещения (схватили мышкой за заголовок, или через меню клавишами) — никаких вычислений/изменений размера окна не должно происходить. Только когда окно бросили на новый (или старый) монитор — мне нужно пересчитать размеры и положение окна, и только тогда подкорректировать его положение и размер, как мне надо
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.