2010-12-16 78 views
1

我正在編寫一個應用程序this tutorial。我知道本教程的日期,因此,我已經調整了代碼以考慮unicode。Win32:工具欄對話框似乎永遠不會獲得焦點並導致主窗口處理緩慢?

我有一個看起來像MDI的主窗口。然後,我有一個菜單,它可以切換工具欄對話框來顯示和隱藏。

當我顯示對話框時,顯示對話框,但PUSHBUTTON s顯示不正確。他們只在我再次點擊我的主窗口時出現。

另外,我似乎沒有能夠單擊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); 
    } 
} 

這裏是我處理主窗口和我的消息循環中的對話框的不同消息的方式,在我的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. 當我嘗試點擊我的對話框的按鈕時,我的主窗口對響應它自己的消息變得非常慢。

也就是說,當我想表明我的工具欄對話框爲無模式對話框,因爲當我表現出來的模態,它完美的作品!

解決此問題的任何線索?

謝謝!

+0

你的代碼看起來很不錯。從你的描述看來,問題出現在消息泵中,但看起來沒問題。我們需要查看ToolbarDlgProc中是否有任何特殊代碼? – DReJ 2010-12-16 20:08:23

+0

編輯'ToolbarDlgProc'以反映其中的內容。感謝您花時間看我的問題。 =)我也懷疑消息泵,但由於我仍然在學習Win32的,我無法正確調試。 – 2010-12-16 20:17:05

+1

剛剛嘗試使用您的代碼的MDI和SDI應用程序,它對我來說工作正常。不知道...我知道它不會幫助你的問題,但如果你想使用Win32Api,我會建議你看看WTL,這是WinApi的良好包裝,好東西:) – DReJ 2010-12-16 20:50:44

回答

0

問題是,正如DReJ在上面的評論中所說的,在我的消息泵中。

麻煩的是,我寫:

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

不把我寫的:

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

所以,因爲我得到的消息對於一個給定的窗口,的hWnd例如,我的ToolbarDialog似乎沒有時間完全繪製自己或類似的東西。在該場景中替換hWnd for NULL完全解決了該問題。