我前面翻譯了一篇文章簡單的談了一下在對話框處理ON_UPDATE_COMMAND_UI 消息。又在www.codeguru.com上看到在屬性頁中處理ON_UPDATE_COMMAND_UI 消息的方法和在對話框中稍有不同。兩者的處理大體上一樣。只是在屬性頁中還需要一個步驟。
?????????需要從CPropertySheet派生類,并攔截消息WM_KICKIDLE。
1、利用Class Wizard常見一個新類CMyPropSheet,其基類為CPropertySheet。
2、在頭文件中添加消息函數:
?????afx_msg LRESULT OnKickIdle(WPARAM?wParam, LPARAM?lParam);
3、在源文件中包含afxpiv.h
4、添加消息映射 ON_MESSAGE(WM_KICKIDLE, OnKickIdle);
5、實現函數
?LRESULT CMyPropSheet::OnKickIdle(WPARAM, LPARAM)
{
????????SendMessgeToDescendants(WM_KICKIDLG, 0,?0,?FALSE, FALSE);
?????????return 0;
}
屬性表現在將所有的WM_KICKIDLE消息傳遞給屬性頁,在屬性頁類中,添加WM_KICKIDLE的消息映射,并調用UpdateDialogjControls
LRESULT?CMyPropPage::OnKickIdle(WPARAM, LPARAM)
{
????????UpdateDialogjControls(this,FALSE);
???????? return 0;
}
???????? 接下來就是和對話框類似的處理ON_UPDATE_COMMAND_UI?消息映射。
???????? 對無模式屬性表不起作用,需要在屬性表的所有窗口中處理WM_IDLEUPDATECMDUI消息,并發送WM_KICKIDLE消息給它。
??????????
附: 這里還討論幾個有關屬性頁的問題
1???如何在屬性表的兩個頁之間傳遞數據?
?????? CPropertyPage有一個成員函數QuerySiblings(WPARAM, LPARAM)。應用程序可以使用這個函數。QuerySiblings生成一條PSM_QUERYSIBLINGS消息,它傳遞給所有的兄弟,也就是屬性表上的其他屬性頁。
????? 一般可創建一個所有頁可見的枚舉,如:
?enum{QUERY_MY_STRING,? QUERY_SOMETHING_ELSE,.......}
然后,在一個屬性頁需要其他屬性頁中的信息時,使用代碼:
CString myString;
if(lL == QuerySiblings(QUERY_MY_STRING,(LPARAM)&myString))
{
???????? ....//獲取字符串
}
提供字符串的頁處理PSM_QUERYSIBLINGS消息:
LRESULT CPageThatHasString::OnQuerySiblings(WPARAM wParam, LPARAM lParam)
{
??????? if(QUERY_MY_STRING == wParam)
?????? {
????????????? *((CString *)lParam) = _T(“Test String“);
???????????????return 1L;
???????}
?????? else
????????????? return 0L;
}
2??? 如何讓屬性頁具有兩行標簽?
?????? 從CPropertySheet派生一個自己的類,添加一個PreCreateWindow的處理,然后在調用基類的處理前加如下代碼:
????? cs.style |= TCS_MULTILINE;
3??? 如何隱藏屬性頁的標題欄?
?????? 從CPropertySheet派生一個自己的類,并覆蓋OnInitDialog,在轉到默認的情況以后,使用ModifyStyle來刪除標題欄標志WS_CAPTION。
?????? ModifyStyle(WS_CAPTION,0);
轉載于:https://www.cnblogs.com/hehe520/archive/2004/12/09/6330142.html