Posted on 2010-04-11 16:31
vk 閱讀(2999)
評(píng)論(3) 編輯 收藏 引用
最近在做個(gè)小例子,在對(duì)話框中放了一個(gè)CListCtrl,為CListCtrl增加了雙擊消息的處理,也在對(duì)話框中增加了這個(gè)CListCtrl的雙擊消息處理,這時(shí)問題出現(xiàn)了,我發(fā)現(xiàn)每次在對(duì)話框和CListCtrl中只有一個(gè)能收到鼠標(biāo)的雙擊消息,而且CListCtrl優(yōu)先。如果既想讓CListCtrl來處理它的內(nèi)部事務(wù),也想通知到對(duì)話框,“CListCtrl有雙擊消息了!”,怎么辦呢?
先看VS2008中自動(dòng)生成的對(duì)話框的雙擊消息:
1 ON_NOTIFY(NM_DBLCLK, IDC_LIST1, &CTemp07Dlg::OnNMDblclkList1)
2
3 void CTemp07Dlg::OnNMDblclkList1(NMHDR *pNMHDR, LRESULT *pResult)
4 {
5 LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<NMITEMACTIVATE>(pNMHDR);
6 AfxMessageBox(_T("CTemp07Dlg::OnNMDblclkList1"));
7 *pResult = 0;
8 }
還有CLList繼承于CListCtrl中的雙擊消息:
1 ON_NOTIFY_REFLECT(NM_DBLCLK, &CLList::OnNMDblclk)
2
3 void CLList::OnNMDblclk(NMHDR *pNMHDR, LRESULT *pResult)
4 {
5 LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<NMITEMACTIVATE>(pNMHDR);
6 AfxMessageBox(_T("CLList::OnNMDblclk"));
7 *pResult = 0;
8 }
我的目的就是,先彈出一個(gè)“CLList::OnNMDblclk”的對(duì)話框,再彈出一個(gè)“CTemp07Dlg::OnNMDblclkList1”的對(duì)話框,這樣的要求很過分嗎?
于是,打開網(wǎng)頁搜索,搜索了一圈,終于發(fā)現(xiàn)一個(gè)有用的信息:
對(duì)于一個(gè)控件來說,比如一個(gè)listctrl,當(dāng)DBCLICK發(fā)生時(shí),如果有WM_DBCLICK處理程序,則該函數(shù)處理,其他包括
NM_**,NM_**_REFLECT都沒有機(jī)會(huì)處理,如果沒有WM_DBCLICK,則REFLECT處理,若沒有REFLECT映射,則NM_才有機(jī)會(huì)處理。其中,REFLECT有包括REFLECT_EX,它可以通過返回值決定是否給NM_處理機(jī)會(huì)。原來,ON_NOTIFY_REFLECT這個(gè)宏太自私,不懂得分享!好了,在你后面加個(gè)_EX,再把函數(shù)CLList::OnNMDblclk改一下,變成這樣:
1 ON_NOTIFY_REFLECT_EX(NM_DBLCLK, &CLList::OnNMDblclk)
2
3 BOOL CLList::OnNMDblclk(NMHDR *pNMHDR, LRESULT *pResult)
4 {
5 LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<NMITEMACTIVATE>(pNMHDR);
6 AfxMessageBox(_T("CLList::OnNMDblclk"));
7 // TRUE表示不讓上級(jí)處理了,F(xiàn)ALSE給別人處理的機(jī)會(huì)
8 return FALSE;
9 }
好了,好東西就是這樣分享的嘛