MFC: скрытое поле вокруг CMainFrame - PullRequest
0 голосов
/ 08 мая 2018

Основной кадр в моем приложении является общим: класс CMainFrame: public CFrameWndEx.

В моем коде я ищу положение MainFrame на экране и, если оно отсутствует, (например, когда какой-либо монитор выключен или отключен), я перемещаю окно в допустимую область.

int VIRTSCR_Left = GetSystemMetrics(SM_XVIRTUALSCREEN);
int VIRTSCR_Top = GetSystemMetrics(SM_YVIRTUALSCREEN);
int VIRTSCR_Width = GetSystemMetrics(SM_CXVIRTUALSCREEN);
int VIRTSCR_Height = GetSystemMetrics(SM_CYVIRTUALSCREEN);
int VIRTSCR_Right = VIRTSCR_Left + VIRTSCR_Width;
int VIRTSCR_Bottom = VIRTSCR_Top + VIRTSCR_Height;

Так что в моем случае я получаю (за один экран) 0, 1920, 0, 1200.

Размер CMainFrame и положение, когда оно развернуто:

CRect rc;
pMainFrame->GetWindowRect(rc);

Дайте мне -8, -8, 1928, 1168. (Внизу находится главная панель задач Windows высотой 40px).

Таким образом, вокруг видимой основной рамки находится следующий невидимый 8-пиксельный отступ. Где я могу найти это значение 8px?
Это повторно для GetSystemMetrics (...)?
Является ли значение 8px одинаковым для других разрешений экрана (например, 2k, 3k мониторов)?

Спасибо за идеи и помощь:)
Любомир

1 Ответ

0 голосов
/ 08 мая 2018

8 пикселей - это толщина границы (это не всегда 8).Вам не нужны границы, когда окно в максимальном установленном размере, поэтому ОС скрывает границы, выталкивая их из поля зрения.

Ни одна часть клиентской области не скрывается.Элементы управления и рисунки в клиентской области не затрагиваются.

Рисунок строки заголовка может слегка измениться.Например, текст строки заголовка центрируется вертикально, когда строка заголовка становится тоньше, а текст слегка поднимается вверх.Итак, вы хотите оставить это в покое.

Развернутое окно не охватывает весь экран.Внизу есть панель задач (обычно она внизу и может иметь высоту 40 пикселей). Нам нужна область рабочего стола, которая не включает панель задач.Это может быть получено из SystemParametersInfo(SPI_GETWORKAREA, 0, &rc, 0), оно отличается от максимальной области экрана.

В практической программе вы можете запустить программу в развернутом состоянии.Затем используйте CWnd::ShowWindow(SW_SHOWMAXIMIZED).Если вы не хотите максимизировать состояние, используйте другой метод, например SetWindowPos

. Используйте GetWindowPlacement, чтобы узнать, находится ли окно в максимизированном состоянии.


DwmGetWindowAttribute с DWMWA_EXTENDED_FRAME_BOUNDS можно использовать для поиска прозрачных границ Windows 10, когда окно не развернуто.Это не относится в этом случае.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...