2

IDD_WINDOW_INFOC++ Win32 アプリケーションで、ユーザーがボタンまたはメニュー項目をクリックしたときに開かなければならないダイアログがあります。ダイアログを開くために使用する方法は、次の行にあります。

DialogBox(hInstance, MAKEINTRESOURCE(IDD_WINDOW_INFO), hMainWindow, WindowInfoProc);

しかし、私の問題は、そのダイアログ ボックスが開いたときに、ユーザーがアプリケーションのメイン ウィンドウで操作できないことです。では、両方のウィンドウをアクティブにするにはどうすればよいでしょうか?

4

2 に答える 2

6

DialogBoxダイアログをモーダルに表示する呼び出しを行っています。モーダル ダイアログが表示されると、他の所有ウィンドウは無効になり、モーダル ダイアログのみが入力を受け入れることができます。これこそが、モーダル ダイアログの本質であり意図です。アイデアは、ダイアログとのみ対話でき、他のウィンドウとは対話できないということです。

別の答えは、パラメータNULLとして に渡すことを提案しています。それは解決策ではありません。その結果、所有されていないウィンドウが作成されます。はい、メイン ウィンドウを操作できますが、その場合、メイン ウィンドウがダイアログの上に表示されます。これは、所有権が正しく設定されていないためです。この問題をよりよく理解するために、ウィンドウの所有権について読むことをお勧めします。hWndParentDialogBox

問題の正しい解決策は、モードレス ダイアログを表示することです。モードレス ダイアログを使用すると、アプリケーション内の他のウィンドウと対話できます。そして、それはまさにあなたが質問で求めていることです。

を呼び出してから を呼び出すと、モードレス ダイアログが表示CreateDialogされShowWindowます。この MSDN の記事に例が示されています: Using Dialog Boxes

于 2013-02-03T15:35:01.457 に答える
2

私の記憶が正しければ、ハンドルの代わりに NULL を親ウィンドウに渡すか、リソース エディターでダイアログ ボックスの種類を変更することができます。

これは簡単な方法ですが、所有されていないダイアログを持つことは最良の選択ではないため、次の方法の方が確実に優れています。要点は、DialogBox() はモーダル ダイアログ ウィンドウを作成しますが、CreateDialog は作成しないということです。モーダル ダイアログは、親ウィンドウを無効にします。MSDN から:モードレス ダイアログ ボックスは、オーナー ウィンドウを無効にすることも、メッセージを送信することもありません。 それはあなたの問題を解決するはずです。

CreateDialog(hInstance, MAKEINTRESOURCE(IDD_WINDOW_INFO), hMainWindow, WindowInfoProc);

ShowWindow(hWnd, SW_SHOW);
于 2013-02-03T15:10:08.370 に答える