WIN32:ツールバーダイアログは決してフォーカスを得ることができず、メインウィンドウを処理しますか?

StackOverflow https://stackoverflow.com/questions/4464740

  •  11-10-2019
  •  | 
  •  

質問

以下のアプリケーションを書いています このチュートリアル. 。このチュートリアルの日付があることを知っているので、Unicodeを考慮するためにコードを適応させました。

MDIのように見えるメインウィンドウがあります。それから、私は持っています 意見 表示および非表示のツールバーダイアログを切り替えるメニュー。

ダイアログを表示すると表示されますが、 PUSHBUTTONSは正しく表示されません。メインウィンドウをもう一度クリックしたときにのみ表示されます。

さらに、私はどちらもクリックできないようです PUSHBUTTON私のツールバーダイアログにs。

リソース(resource.h)は次のように定義されています(この質問に関連するもののみを示しています):

#define IDD_TOOLBAR              102
#define IDC_PRESS               1000
#define IDC_OTHER               1001
#define ID_VIEW_SHOWTOOLBAR    40002
#define ID_VIEW_HIDETOOLBAR    40003

次のようなダイアログ .rc ファイル:

IDD_TOOLBAR DIALOGEX 0, 0, 85, 50
    STYLE    DS_FIXEDSYS | DS_MODALFRAME | WS_CAPTION | WS_POPUP
    EXSTYLE  WS_EX_TOOLWINDOW
    CAPTION  L"Toolbar"
    FONT     8, "MS Shell Dlg"
BEGIN
    PUSHBUTTON     L"&Press this button",     IDC_PRESS, 7,  7, 70, 14
    PUSHBUTTON     L"&Or this one",           IDC_OTHER, 7, 28, 70, 14
END

そして、私の中に次のように表示されます wndproc 働き:

// As a global variable I have my toolbar handler.
HWND g_hToolbar = NULL;

BOOL CALLBACK ToolbarDlgProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) {
    switch (Msg) {
        case IDC_OTHER:
            MessageBoxW(hWnd, L"You just clicked IDC_OTHER!", L"Information", MB_OK | MB_ICONINFORMATION);
            break;
        case IDC_PRESS:
            MessageBoxW(hWnd, L"You just clicked ODC_PRESS!", L"Information", MB_OK | MB_ICONINFORMATION);
            break;
        default:
            return FALSE;
    }

    return TRUE;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) {
    switch (Msg) {
        case WM_COMMAND:
            switch (LOWORD(wParam)) {
                case ID_VIEW_HIDETOOLBAR:
                    ShowWindow(g_hToolbar, SW_HIDE);
                    break;
                case ID_VIEW_SHOWTOOLBAR: 
                    if (NULL == g_hToolbar) 
                        g_hToolbar = CreateDialogW(GetModuleHandle(NULL)
                                                    , MAKEINTRESOURCE(IDD_TOOLBAR)
                                                    , hWnd
                                                    , ToolbarDlgProc);

                    ShowWindow(g_hToolbar, SW_SHOW);
                    break;
            }
            break;
        default:
            return DefWindowProcW(hWnd, Msg, wParam, lParam);
    }
}

そして、これが私のメインウィンドウのさまざまなメッセージを処理する方法と、私のメッセージループでのダイアログを私の ウィンメイン 働き。

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) {
    // Declaring, registring and creating my main window to hWnd here...
    MSG Msg;

    ShowWindow(hWnd, nShowCmd);
    UpdateWindow(hWnd);

    while (GetMessageW(&Msg, hWnd, 0, 0) > 0) {
        if (!IsDialogMessageW(g_hToolbar, &Msg)) {
            TranslateMessage(&Msg);
            DispatchMessageW(&Msg);
        }
    }
}

私の問題は次のとおりです。

  1. ダイアログのボタンをクリックできないようです。

  2. ダイアログのボタンをクリックしようとすると、メインウィンドウが独自のメッセージに応答するのが非常に遅くなります。

つまり、モーダルを表示すると完全に機能するため、ツールバーダイアログをモードレスダイアログとして表示したい場合です。

この問題を解決する手がかりはありますか?

ありがとう!

役に立ちましたか?

解決

問題は、Drejが上記のコメントで言ったように、私のメッセージポンプでです。

問題は私が書くことです:

while (GetMessageW(&Msg, hWnd, 0, 0) > 0) {
    // Processing message here...
}

そして、私が書くこと:

while (GetMessageW(&Msg, NULL, 0, 0) > 0) {
    // Processing message here...
}

だから、私は特定のウィンドウのメッセージを受け取っていたので、 hwnd たとえば、私のツールバルディアログは、完全に自分自身やそのようなものを描く時間がないように見えました。交換 hwnd にとって ヌル そのシナリオでは、問題が完全に解決されました。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top