Как привязать дочерние окна к родительскому окну в относительных позициях? - PullRequest
11 голосов
/ 29 ноября 2011

Каковы наилучшие практики для размещения дочерних окон (общих элементов управления) в диалоговом окне или главном окне? Я имею в виду, существует ли механизм привязки, который фиксирует относительные позиции элемента управления к границе родительского окна, как в WPF. И во время изменения размера окна дочерний элемент управления будет изменять размеры вместе с основным окном. В настоящее время у меня есть это: List view dialog

Как вы можете видеть из красных линий, это не выглядит красиво, когда я изменяю размер родительского окна элемента управления представления списка. Я хотел бы, например, привязать правую сторону ListView к правой границе DialogBox и аналогичным образом другим элементам управления.

Я знаю, что могу поиграться с функциями GetWindowRect, GetClientRect и MoveWindow. Но так ли это?

В настоящее время я работаю с чистым Win32 Api без MFC.

Ответы [ 3 ]

10 голосов
/ 29 ноября 2011

Если вы просто используете Win32 API, вы обычно обрабатываете это, обрабатывая сообщение WM_SIZE и отвечаете, вызывая GetClientRect в родительском окне и MoveWindow для дочерних элементов, чтобы переместить / изменить размер дочерних элементов, чтобы соответствующим образом заполнить родительский элемент.

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

10 голосов
/ 29 ноября 2011

Хотя это ручной процесс, я считаю полезным работать в координатах относительно родительского окна каждого элемента управления.

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

void GetRelativeCtrlRect(HWND hWnd, RECT *rc) {
   // Get the position of the window relative to the entire screen
   GetWindowRect(hWnd, rc);

   // Now convert those with regards to the control's parent
   ScreenToClient(GetParent(hWnd), (LPPOINT) &((LPPOINT)rc)[0]);
   ScreenToClient(GetParent(hWnd), (LPPOINT) &((LPPOINT)rc)[1]);
}

Возвращает размер RECT относительно в родительское окно / элемент управления.Например, если вы хотите изменить размер дочернего элемента управления до «ближнего» нижнего края родительского элемента, просто отведите несколько пикселей от rc.bottom, прежде чем вызывать SetWindowPos (childHWND, ...)

Iтакже есть некоторые функции «привязки», которые помогают позиционировать элементы управления относительно других опорных точек.Тем не менее, он по-прежнему выполняется вручную в режиме кода-времени, но дает отличные результаты настройки вручную.

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

2 голосов
/ 29 ноября 2011

Попробуйте выбрать элемент управления и поиграть с его свойством «Док». При этом вы можете прикрепить элемент управления к некоторым сторонам или даже ко всем сторонам родительского элемента управления.

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