0

多くの異なる MFC CDialog 派生ダイアログ ウィンドウを表示するかなり大きなアプリがあります。すべてのダイアログは、次のような中央関数から表示されます。

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

ここで、基本的にすべてのダイアログの OnInitDialog メソッドで関数を呼び出す必要があります。技術的には OnInitDialog 内にある必要はありませんが、ダイアログが表示される前にあることが望ましいです。

強引な方法は、コードを調べて最後のすべてのダイアログを見つけ、関数呼び出しを OnInitDialog メソッドに追加することです (存在する場合は追加し、存在しない場合は追加します)。しかし、もっとエレガントな方法が必要なようです...

dlg は実際には CDialog ではなく、そこから派生したものであることに注意してください。

アイデア、トリック、ハックはありますか? 私はメッセージ マップにパッチを適用する以上のことはしませんが、よりクリーンで安全なものを見つけたいと思っています。

4

2 に答える 2

1

すべてのダイアログに共通の祖先がある場合は、その共通の祖先のコードを選択した適切な場所に配置するだけです。たとえば、OnInitDialog()仮想です。

于 2011-03-10T18:47:12.643 に答える
-1

実行するのは非常に簡単です。

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);
}

おそらく、高性能アプリには適していませんが、シンプルな GUI であれば完璧に機能します。他のコード変更は必要ありません。

于 2011-03-12T21:53:16.260 に答える