1

編集:

最初に奇妙なことを調査する必要があります。質問を「保留」にする方法はありますか?

オリジナル:

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 によって読み込まれる場合、エラーは発生しません。

4

1 に答える 1