編集:
最初に奇妙なことを調査する必要があります。質問を「保留」にする方法はありますか?
オリジナル:
CDialog ベースの GUI を使用して、既存のコードベースに取り組んでいます。アプリケーションは、CDialog.DoModal を使用して他の CDialog "SubWindow" を生成する CDialog "MainWindow" で構成されます。これは、サブウィンドウ、メインウィンドウ ブロックなどを表示するときに機能します。
"SubWindow" から AfxMessageBox を呼び出すと、MainWindow が再び有効になり、フォーカスされます。
AfxMessagebox へのデバッグは、関数が mainWindow を取得して再度有効にすることを示しています。これにより、さまざまなバグが発生します。::MesageBox を使用すると正常に動作しますが、約 50 の異なるサブウィンドウがあり、可能であれば、小さなローカライズされた変更のみを行いたいと考えています。
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\atlmfc\src\mfc\appui1.cpp
int CWinApp::ShowAppMessageBox(CWinApp *pApp, LPCTSTR lpszPrompt, UINT nType, UINT nIDPrompt)
...
HWND hWndTop;
HWND hWnd = CWnd::GetSafeOwner_(NULL, &hWndTop);
// re-enable the parent window, so that focus is restored
// correctly when the dialog is dismissed.
if (hWnd != hWndTop)
EnableWindow(hWnd, TRUE);
...
エントリ ポイントでは、次のようにします。
::AfxGetApp()->m_pMainWnd = &mainDlg;
mainDlg.DoModal();
好ましい方法は何ですか?メンバーが NULL のままになるように、行をコメントする必要がありますか?
またはそれは副作用を引き起こす可能性がありますか?
私は(まだテストされていない)私も設定できると思います
AfxGetApp()->m_pMainWnd = &subDlg;
subDlg.DoModal() の前に、後でリセットしますが、これは、サブウィンドウごとに 1 つずつ、50 の異なるファイルを変更することも意味します。
MFC は m_pMainWnd に依存していますか、それとも NULL のままにしておくべきですか? ありがとう。
編集:
MainWindow を SubWindow のコンストラクターに渡そうとしましたが、役に立ちませんでした。
これは、MainWindow が再度有効になる場所です。
これは、MFC が MainWindow を検出する場所です:
m_pActiveWnd を手動で設定する必要がありますか?
(トピック外: mfc のソース コードが利用できるのが気に入っています。)
編集2:
MFC アプリは実際には DLL であり、2 つの方法で呼び出すことができます。単純な loader.exe によって読み込まれるか、他の大きなアプリケーションによって読み込まれます。この他のアプリケーションも MFC を使用する可能性があるため、2 つの異なる CWinApp オブジェクトが存在する可能性があります。
loader.exe によって読み込まれる場合、エラーは発生しません。