Как связать дочерние окна с родительским окном в относительных положениях?

Каковы наилучшие методы для размещения дочерних окон (общих элементов управления) в диалоговом окне или в главном окне? Я имею в виду, есть механизм привязки, который фиксирует относительные позиции элемента управления на границе родительского окна, как в 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". При этом вы можете прикрепить элемент управления к некоторым сторонам или даже по всем сторонам родительского элемента управления.