2013-04-10 115 views
1

我有一個常見的顏色對話框,我想在菜單按下時激活。 不幸的是,每當我按下該項目時,窗口就會失去焦點,就好像一個對話框即將出現,但對話框從不出現。常見對話框Win32

我現在使用的代碼如下:

case ID_TOOL_CHOOSECOLOR: 
//show colour dialog 
ChooseColor(&cc); 

,我已經初始化,這樣我CHOOSECOLOR結構:

cc.lStructSize = sizeof (CHOOSECOLOR) ; 
cc.hwndOwner  = NULL ; 
cc.hInstance  = NULL ; 
cc.rgbResult  = RGB (0x80, 0x80, 0x80) ; 
cc.lpCustColors = crCustColor ; 
cc.Flags   = CC_RGBINIT | CC_FULLOPEN ; 
cc.lCustData  = 0 ; 
cc.lpfnHook  = NULL ; 
cc.lpTemplateName = NULL ; 

有什麼奇怪的是,該對話框只顯示了我按下「ALT」鍵(並且只有alt鍵)後。有小費嗎?

我試圖在MDI文件中這樣做。

感謝

+0

努力表現更完整的源代碼。 – 2013-04-10 00:06:13

+0

只是提供的代碼中的單個東西,我發現它並不好,即應該將'hInstance'設置爲'GetModuleHandle(0)'的結果。一個可能的其他問題可能是未初始化整個結構。只需將其聲明爲'CHOOSECOLOR cc = {sizeof(cc)};',它負責零初始化和'lStructSize'初始化。 – 2013-04-10 00:57:09

+0

@Cheers文檔不同意。 hInstance:*如果既沒有設置CC_ ENABLETEMPLATEHANDLE也沒有設置CC_ENABLETEMPLATE,這個成員被忽略。*此外,所有的字段都被初始化,所以zero-init不會解決這個問題。 – 2013-04-10 01:04:31

回答

5

唯一的問題,我可以看到的是,你沒有指定對話框的所有者。這可能會導致對話框顯示在主窗口後面。指定主窗口的句柄作爲對話框的所有者。

閱讀更多關於窗口所有權的Window Features page on MSDN

+0

是的,我試過了,(我把箱子的主人設置爲hwndFrame,因爲它是MDI),但是還是什麼都沒有。我仍然需要按ALT鍵才能顯示出來。 – docaholic 2013-04-10 00:15:07

+0

使主窗口成爲主人。閱讀我給你的鏈接:*只有重疊窗口或彈出窗口才能成爲窗口的所有者 ;一個子窗口不能成爲擁有者窗口。* – 2013-04-10 00:18:05

+0

對不起,@對話框沒有任何內容。這實際上並沒有出現在我的桌面上的任何地方;如果我隱藏主窗口,那裏什麼也沒有。 – docaholic 2013-04-10 00:25:34

0

修好了!

原來,我的問題是在主窗口的WndProc。

我已經把我的WM_PAINT命令return 0;而不是break;

更改我的return 0break解決了一切! 我認爲這是因爲我的return會退出wndproc,而break會讓我繼續到return MDIFrameProc(hwnd, message, wparam, lparam)

我可能是錯的,但這是我能想出的最好解釋,這就解釋了爲什麼break有效,但return 0沒有。

0

你畫後,請務必打電話ValidateRect(HWND,CONST RECT*);