Проблемы с :: MoveWindow - оставляя пустое пространство - PullRequest
2 голосов
/ 12 октября 2011

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

Вот пример кода:

HWND hwnd  // Comes from external function. Was defined as WS_CHILD previously
HWND hwndParent     = ::GetParent(hwnd);  
RECT parentRect     = {0,0,0,0};  
RECT childRect      = {0,0,0,0};  
::GetClientRect(hwndParent, &parentRect);  // Suppose it returns {0,0,600,300}  

BOOL ok = ::MoveWindow(hwnd, 0, 0, 600, 300, true);  
::GetClientRect(hwnd, &childRect);  // Will return {0,0,584,297}  

ПОЧЕМУ ?????

Что я делаю не так? Я забыл некоторые флаги с инициализацией окна?!

Ответы [ 4 ]

1 голос
/ 12 октября 2011

Вместо использования GetClientRect используйте GetWindowRect и MapWindowPoints(NULL,hwndParent,&parentRect,2), чтобы настроить его в координатах родительского окна.GetWindowRect будет включать в себя не-клиентскую область, которая требуется MoveWindow.

Редактировать: Если вы хотите окно, не имеющее не-клиентской области, то окно прямоугольное иклиентские прямоугольники имеют тот же размер, вам нужно обрезать стили окна , которые вы применяете к окну.Избегайте стилей WS_BORDER, WS_CAPTION, WS_DLGFRAME, WS_OVERLAPPED, WS_SIZEBOX и WS_THICKFRAME.

0 голосов
/ 18 октября 2011

Проблема заключалась в том, что WS_POPUP указывал на родительское окно.Очень странно.Насколько я знаю, такого эффекта не было.

Спасибо всем!

0 голосов
/ 12 октября 2011

MoveWindow работает с координатами окна, включая не клиентскую область (границы, строку заголовка и т. Д.).

GetClientRect получает площадь клиентской части окна, игнорируя границы, строку заголовка и т. Д.

Вот где несоответствие. Если вы хотите MoveWindow до желаемого клиента размера, вам нужно просто AdjustWindowRect, чтобы попытаться предсказать, что передать в MoveWindow. Обратите внимание, что это не всегда возможно и не всегда точно. Например, минимальный / максимальный размеры окон, меню (которые могут переноситься на несколько строк) и т. Д.

0 голосов
/ 12 октября 2011

MoveWindow обновляет положение окна, в то время как GetClientRect получает часть окна в клиентской области, которая не обязательно должна быть одинаковой. Если у вашего окна есть не клиентская область, то все в порядке и работает как положено.

Если у вас все еще создается впечатление, что дочернее окно не полностью покрывает клиентскую область родителя, тогда интервал принадлежит дочернему элементу управления / окну, и вам нужно искать способы его удаления (флаги управления, параметры и т. Д.).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...