0

私はこれについて途方に暮れており、どのコードを投稿すればよいかさえよくわかりません。

C++ アプリケーションがあります。初期ウィンドウには、編集コントロール、カスタム コントロール、およびメニューがあります。ユーザーが F5 を押すと、新しいウィンドウが開き、独自のメッセージ ループが表示されます。新しいウィンドウは DialogBox を開き、予想どおりモーダルです。

奇妙な部分は、DialogBox が 2 番目のウィンドウの後ろに隠れているように見えることです。最初のウィンドウに alt-tab で移動し、次に alt-tab で 2 番目のウィンドウに戻り、ダイアログ ボックスに移動する必要があります。

DialogBox をキャンセルすると、2 番目のウィンドウが (予想どおり) 破棄され、MessageBox が (予想どおり) 表示されますが、そのメッセージ ボックスは最初のウィンドウの後ろに隠れているようです。繰り返しますが、メッセージ ボックスを最前面に表示するには、Alt-Tab を 2 回押して、OK を出します。

DialogBox と MessageBox の両方でこの奇妙なポップアンダー動作を引き起こす可能性のあるアイデアはありますか?

ありがとう!

ダイアログ ボックスを作成するコード

INT_PTR ip = DialogBox(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_AMBIGUOUS), this->hWnd, DlgAmbiguous);

DlgAmbiguous プロシージャーのコード

INT_PTR CALLBACK DlgAmbiguous(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_INITDIALOG:
        {
            HWND hStaticTerm = GetDlgItem(hDlg, IDC_TERM);
            SetWindowText(hStaticTerm, lpAmbiguousTerm);

            if (wcscmp(lpAmbiguousTerm, L"canvas") == 0)
            {
                HWND hComboBox = GetDlgItem(hDlg, IDC_MEANING);
                SendMessage(hComboBox, CB_ADDSTRING, NULL, reinterpret_cast<LPARAM>(_T("Program Window")));
                SendMessage(hComboBox, CB_ADDSTRING, NULL, reinterpret_cast<LPARAM>(_T("Region in Program Window")));
            }

            return (INT_PTR)TRUE;
        }
    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK)
        {
            HWND hComboBox = GetDlgItem(hDlg, IDC_MEANING);
            iAmbiguousResult = SendMessage(hComboBox, CB_GETCURSEL, NULL, NULL);
            EndDialog(hDlg, iAmbiguousResult + 100);
            return (iAmbiguousResult == -1) ? FALSE : TRUE;
        }
        else if (LOWORD(wParam) == IDCANCEL)
        {
            EndDialog(hDlg, DLG_CANCEL);
            return (INT_PTR)FALSE;
        }
        break;
    }
    return (INT_PTR)FALSE;
4

1 に答える 1

1

同じスレッドで実行されているかどうかに関係なく、ウィンドウを開くときは、その親ウィンドウを指定するのが理にかなっています。これにより、新しいウィンドウがその親の上に強制的に表示されます。同じことがダイアログ ボックスにも当てはまります。

INT_PTR WINAPI DialogBox(
  _In_opt_  HINSTANCE hInstance,
  _In_      LPCTSTR lpTemplate,
  _In_opt_  HWND hWndParent,
  _In_opt_  DLGPROC lpDialogFunc
);

3 番目のパラメーターに注意してください。ウィンドウを一番上に表示する他のオプションは、 SetWindowPos関数を呼び出すことです。

于 2012-08-19T20:27:18.023 に答える