Перехват CDialog создание - PullRequest
       38

Перехват CDialog создание

0 голосов
/ 10 марта 2011

У меня довольно большое приложение, которое отображает множество различных диалоговых окон, полученных из MFC CDialog. Все диалоги отображаются из центральной функции, которая похожа на эту:

void ShowDialog(CDialog& dlg)
{
  dlg.DoModal();
}

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

Метод грубой силы должен был бы пройти через код и найти каждое последнее диалоговое окно и добавить вызов функции в метод OnInitDialog (если он есть, а если нет, добавить его). Но, похоже, должен быть более элегантный способ ...

Обратите внимание, что dlg на самом деле не CDialog, а что-то, что вытекает из него.

Есть мысли, хитрости или взломы? Я не собираюсь исправлять карту сообщений, но надеюсь найти что-то более чистое / безопасное.

Ответы [ 2 ]

1 голос
/ 10 марта 2011

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

0 голосов
/ 13 марта 2011

Оказывается, это довольно легко сделать:

HHOOK gPrevHook = SetWindowsHookEx(WH_CALLWNDPROCRET, HookProc, NULL, myGUIThreadID);


LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    if(NULL != wParam)
    {
         CWPRETSTRUCT* pS = (CWPRETSTRUCT*)lParam;
         if(WM_INITDIALOG == pS->message)
             CallFuncOnWindow(pS->hwnd);
    }

    return CallNextHookEx(gPrevHook, nCode, wParam, lParam);
}

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

...