Привет!
Пишу на WTL, так как в своё время неплохо с ней работал, как и с WinAPI, которое она довольно минимально оборачивает в плюсики, но, как оказалось, подзабыл многое.
Задача:
При старте определить, на каком мониторе винда запустила приложение, и задать размеры и положение окна как мне нужно, на том мониторе, на котором винда запустила приложение.
При перемещении окна определить, на какой монитор его переместили (по окончании перемещения), и установить нужные мне размеры и положение на том мониторе.
Сохранить положение окна (и, соответственно, монитор — как я понял, координаты окна глобальны между мониторами), и восстановить при перезапуске — это наверное осилю сам, если разберусь с предыдущими пунктами
Пока разбираюсь с первым пунктом.
С мониторами разобрался — по 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 с моими размерами.
Во время перемещения (схватили мышкой за заголовок, или через меню клавишами) — никаких вычислений/изменений размера окна не должно происходить. Только когда окно бросили на новый (или старый) монитор — мне нужно пересчитать размеры и положение окна, и только тогда подкорректировать его положение и размер, как мне надо