Как получить родительскую структуру, как это дает Spy ++? - PullRequest
0 голосов
/ 12 ноября 2018

В нашем коде создается экземпляр класса C ++, производного от CMDIChildWnd, и вызывается его функция Create(), которая на самом деле CMDIChildWnd::Create(). Пятый параметр pParentWnd устанавливается для объекта CMDIFrameWnd. Это в свою очередь (в коде MFC) устанавливает объект CREATESTRUCT, устанавливает его hwndParent для этого параметра и затем вызывает PreCreateWindow() с этим объектом, переданным в качестве одного из параметров.

Однако при переходе вверх по списку родительских окон с помощью CWnd::GetParent() (оригинал) GetAncestor(hwnd, GA_PARENT) (просто попытка, поскольку оригинал не работает, а этому коду более 20 лет) и даже GetWindow(hwnd, GW_OWNER) просто посмотрим, устанавливает ли он владельца окна по какой-то причине. В каждом случае я не вижу дескриптор, который связан с объектом CMDIFrameWnd. Вместо этого показанный родительский элемент - рабочий стол, а владелец - NULL.

Используя Spy ++, он показывает то, что я ожидал. Как получить макет, заданный Spy ++ программно?

1 Ответ

0 голосов
/ 13 ноября 2018

В интерфейсе MDI CMDIChildWnd обычно передается CMultiDocTemplate, затем мы создаем новое окно через CDocManager::OnFileNew, которое, в свою очередь, вызывает CFrameWnd::LoadFrame, которое передает NULL для родительского дочернего окна (по крайней мере, в VS 2017 )

Обычно мы не вызываем mdi_child->Create напрямую, если только мы не инициализируем все остальное вручную. Возможно, вы имеете в виду, что базовый класс CMDIChildWnd::Create называется, или вы можете переопределить его.

В дочернем окне,

::GetAncestor(m_hWnd, GA_ROOT) или ::GetAncestor(m_hWnd, GA_ROOTOWNER)

Должен возвращать ссылку на основной фрейм, в противном случае используйте AfxGetMainWnd()

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