使用CMFCPropertyGridCtrl及CMFCPropertyGridProperty控件的心得體會

最近在MFC編程時使用到了CMFCPropertyGridCtrl及CMFCPropertyGridProperty這倆控件,記錄下使用時遇到的問題及解決方法

1、當CMFCPropertyGridProperty控件內的內容改變時,會觸發CMFCPropertyGridCtrl的PropertyChanged事件,根據CMFCPropertyGridCtrl類的源代碼所述,事件發生後,CMFCPropertyGridCtrl會在OnPropertyChanged函數中做處理,且會發送AFX_WM_PROPERTY_CHANGED消息,(OnPropertyChanged(CMFCPropertyGridProperty *pProp)且發送消息的代碼爲

GetOwner()->SendMessage(AFX_WM_PROPERTY_CHANGED,GetDlgCtrlID(),LPARAM(pProp));
這說明wparam爲CMFCPropertyGridCtrl控件的ID,lparam爲CMFCPropertyGridProperty控件指針,在消息處理函數中可通過pProp指針來獲取改變的值。

2、我想在CMFCPropertyGridProperty控件內容改變後將焦點set到SDI文檔的VIEW視圖上,採用的方法是在OnPropertyChanged函數SendMessage的消息處理函數中發送消息到VIEW,讓VIEW類自己SetFocus(),而一開始我用的是SendMessage(.....),但無論如何焦點都無法set到VIEW處,而是一直在CMFCPropertyGridCtrl控件處。後來無意中發現當CMFCPropertyGridCtrl控件處於浮動窗口時,重複上一過程時發現CMFCPropertyGridCtrl控件出現短暫的焦點消失現象,但處於停靠窗口時則沒有此現象。於是我猜上述編程過程中VIEW獲得了焦點,只是後來焦點又回到CMFCPropertyGridCtrl控件了。再接着想到CMFCPropertyGridCtrl的PropertyChanged事件處理函數發送消息時用的是SendMessage,由於這一函數需要等消息處理函數返回後,他才返回。而我在消息處理函數中也使用了SendMessage,所以實質上VIEW窗口確實是獲得了焦點,但在兩個SendMessage返回後,焦點就又回到了CMFCPropertyGridCtrl控件處。因此最後我在消息處理函數中用PostMessage代替SendMessage,結果成功得把焦點set在了VIEW窗口處而焦點不會返回到CMFCPropertyGridCtrl控件處。
發佈了16 篇原創文章 · 獲贊 2 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章