Работа с:
- Visual Studio 2017;
- MFC, C ++.
Я пытаюсь изменить проект MFC дляCDialog
производный класс для определения, когда к нему добавлен дочерний элемент управления (CButton
производные классы). Желательно получить дескриптор (HWND
) для этих CButtons для дальнейшей их обработки, как я могу получить из родительского диалогового окна со следующим кодом:
HWND handleParent = ::GetTopWindow(this->GetSafeHwnd());
Я прочиталодин способ сделать это, обработав WM_PARENTNOTIFY
, но я не могу запустить его каким-либо образом, используя функцию основного события: OnParentNotify (или WindowProc
из некоторых источников).
Я сделал следующее, по крайней мере для OnParentNotify
:
- добавил экспорт сообщения:
ON_WM_PARENTNOTIFY ()
в функции-члене
DerivedDialog::OnInitDialog()
удален стиль
WS_EX_NOPARENTNOTIFY
из всех возможных дескрипторов управления после
CDialog::OnInitDialog()
строки кода:
CDialog::OnInitDialog();
HWND hwnd = ::GetTopWindow(this->GetSafeHwnd());
while (hwnd)
{
LONG lExStyle;
lExStyle = GetWindowLong(hwnd, GWL_EXSTYLE);
if (lExStyle & WS_EX_NOPARENTNOTIFY)
{
lExStyle &= ~WS_EX_NOPARENTNOTIFY;
SetWindowLong(hwnd, GWL_EXSTYLE, lExStyle);
}
hwnd = ::GetNextWindow(hwnd, GW_HWNDNEXT);
}
объявленная и определенная функция только для того, чтобы увидеть, вызывается ли она:
OnParentNotify(UINT message, LPARAM lParam)
{
CDialog::OnParentNotify(message, lParam)
{
switch (LOWORD(message))
{
case WM_CREATE:
{
int a = 3;
int b = 2;
}
break;
case WM_PARENTNOTIFY:
{
int c = 1;
int d = 0;
}
}
}
К сожалению, только WM_CREATE
вызывается один раз (не думайте, что она связанаили правильно, так как у меня есть 2 кнопки, которые должны быть добавлены в диалоге .. так что я ожидаю 2 WM_CREATES, если это так ??).
Я действительно не уверен, как вызвать это сообщение для вызова. Любой совет будет очень полезным!