Как связать дочерние окна с родительским окном в относительных положениях?
Каковы наилучшие методы для размещения дочерних окон (общих элементов управления) в диалоговом окне или в главном окне? Я имею в виду, есть механизм привязки, который фиксирует относительные позиции элемента управления на границе родительского окна, как в WPF. И при изменении размера окна дочерний элемент управления будет изменять размер вместе с основным окном.
В настоящее время у меня есть:
![List view dialog]()
Как вы можете видеть из красных строк, это выглядит не очень красиво, когда я изменяю размер родительского окна элемента управления списком. Я хотел бы привязать, например, правую сторону ListView к правой границе DialogBox и аналогичным другим элементам управления.
Я знаю, что могу играть с функциями GetWindowRect, GetClientRect и MoveWindow. Но верно ли это?
В настоящее время я работаю с чистым Win32 Api без MFC.
Ответы
Ответ 1
Если вы используете API Win32, вы обычно обрабатываете это, обрабатывая сообщение WM_SIZE, и отвечаете, вызывая GetClientRect в родительском окне и MoveWindow для детей, чтобы переместить/изменить размер дочерних элементов, чтобы правильно заполнить родительский элемент.
Если вы хотите достаточно сильно, вы можете (конечно) реализовать менеджер компоновки, поэтому остальной программе не нужно обращаться с такими вещами напрямую. По крайней мере, IME, делая это хорошо, достаточно сложно, что редко стоит того, чтобы вы не могли использовать этот код макета.
Ответ 2
Во время своего ручного процесса я считаю полезным работать в координатах относительно каждого родительского окна управления.
Я использую следующую функцию, чтобы вернуть текущую позицию управления относительно ее родителя, чтобы ее можно было легко перемещать/изменять с помощью 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 parent
ScreenToClient(GetParent(hWnd), (LPPOINT) &((LPPOINT)rc)[0]);
ScreenToClient(GetParent(hWnd), (LPPOINT) &((LPPOINT)rc)[1]);
}
Возвращает размер RECT
относительно родительского окна/элемента управления. В качестве примера, если вы хотите изменить размер дочернего элемента управления на "ближний" нижний край родителя, просто отбросьте несколько пикселей от rc.bottom до вызова SetWindowPos (childHWND,...)
У меня также есть некоторые функции "привязки", которые помогают управлять позициями относительно других опорных точек. Тем не менее, он по-прежнему является ручным -at-code-time-process, но дает отличные результаты с ручной настройкой.
Некоторые другие параметры, которые я добавил в закладки, все могут потребовать настройки для ваших нужд, но это дает вам представление о некоторых инструментах, которые другие создали для решения этой проблемы.
Ответ 3
Попробуйте выбрать элемент управления и играть со своим свойством "Dock". При этом вы можете прикрепить элемент управления к некоторым сторонам или даже по всем сторонам родительского элемента управления.