1

このチュートリアルに従ってアプリケーションを作成しています。このチュートリアルの日付を知っているので、Unicodeを考慮してコードを調整しました。

MDIのようなメインウィンドウがあります。次に、表示と非表示を切り替えるツールバーダイアログを切り替える[表示]メニューがあります。

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

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

リソース(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);
    }
}

これが、 WinMain関数のメッセージループでメインウィンドウとダイアログのさまざまなメッセージを処理する方法です。

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. ダイアログのボタンをクリックしようとすると、メインウィンドウのメッセージへの応答が非常に遅くなります。

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

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

ありがとう!

4

1 に答える 1

0

問題は、DReJが上記のコメントで述べたように、私のメッセージポンプにあります。

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

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

そして、私が書くこと:

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

したがって、特定のウィンドウ、hWndインスタンスのメッセージを取得していたため、ToolbarDialogは、それ自体を完全に描画するための時間が不足しているように見えました。そのシナリオでhWndNULLに置き換えると、問題は完全に解決しました。

于 2010-12-16T20:48:40.217 に答える