WTL_消息處理.doc_第1頁(yè)
WTL_消息處理.doc_第2頁(yè)
WTL_消息處理.doc_第3頁(yè)
WTL_消息處理.doc_第4頁(yè)
WTL_消息處理.doc_第5頁(yè)
已閱讀5頁(yè),還剩1頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

處理控件發(fā)送的通知消息在WTL中處理通知消息與使用API方式編程相似,控件以WM_COMMAND 或 WM_NOTIFY 消息的方式向父窗口發(fā)送通知事件,父窗口相應(yīng)并做相應(yīng)處理。少數(shù)其它的消息也可以看作是通知消息,例如:WM_DRAWITEM,當(dāng)一個(gè)自畫(huà)控件需要畫(huà)自己時(shí)就會(huì)發(fā)送這個(gè)消息,父窗口可以自己處理這個(gè)消息,也可以再將它反射給控件,MFC采用得就是消息反射方式,使得控件能夠自己處理通知消息,提高了代碼的封裝性和可重用性。在父窗口中響應(yīng)控件的通知消息以WM_NOTIFY和WM_COMMAND消息形式發(fā)送的通知消息包含各種信息。WM_COMMAND消息的參數(shù)包含發(fā)送通知消息的控件ID,控件的窗口句柄和通知代碼,WM_NOTIFY消息的參數(shù)還包含一個(gè)NMHDR數(shù)據(jù)結(jié)構(gòu)的指針。ATL和WTL有各種消息映射宏用來(lái)處理這些通知消息,我在這里只介紹WTL宏,因?yàn)楸疚木褪侵vWTL得。使用這些宏需要在消息映射鏈中使用BEGIN_MSG_MAP_EX并包含atlcrack.h文件。消息映射宏要處理WM_COMMAND通知消息需要使用COMMAND_HANDLER_EX宏:COMMAND_HANDLER_EX(id, code, func) 處理從某個(gè)控件發(fā)送得某個(gè)通知代碼。 COMMAND_ID_HANDLER_EX(id, func) 處理從某個(gè)控件發(fā)送得所有通知代碼。 COMMAND_CODE_HANDLER_EX(code, func) 處理某個(gè)通知代碼得所有消息,不管是從那個(gè)控件發(fā)出的。 COMMAND_RANGE_HANDLER_EX(idFirst, idLast, func) 處理ID在idFirst和idLast之間得控件發(fā)送的所有通知代碼。 COMMAND_RANGE_CODE_HANDLER_EX(idFirst, idLast, code, func) 處理ID在idFirst和idLast之間得控件發(fā)送的某個(gè)通知代碼。 例子: COMMAND_HANDLER_EX(IDC_USERNAME, EN_CHANGE, OnUsernameChange): 處理從ID是IDC_USERNAME的edit box控件發(fā)出的EN_CHANGE通知消息。 COMMAND_ID_HANDLER_EX(IDOK, OnOK): 處理ID是IDOK的控件發(fā)送的所有通知消息。 COMMAND_RANGE_CODE_HANDLER_EX(IDC_MONDAY, IDC_FRIDAY, BN_CLICKED, OnDayClicked): 處理ID在IDC_MONDAY和IDC_FRIDAY之間控件發(fā)送的BN_CLICKED通知消息。 還有一些宏專門(mén)處理WM_NOTIFY消息,和上面的宏功能類似,只是它們的名字開(kāi)頭以“NOTIFY_”代替“COMMAND_”。WM_COMMAND 消息處理函數(shù)的原型是: void func ( UINT uCode, int nCtrlID, HWND hwndCtrl );WM_COMMAND通知消息不需要返回值,所以處理函數(shù)也不需要返回值,WM_NOTIFY消息處理函數(shù)的原型是: LRESULT func ( NMHDR* phdr );消息處理函數(shù)的返回值用作消息相應(yīng)的返回值,這不同于MFC,MFC的消息響應(yīng)通過(guò)消息處理函數(shù)的LRESULT*參數(shù)得到返回值。發(fā)送通知消息的控件的窗口句柄和通知代碼包含在NMHDR結(jié)構(gòu)中,分別是code和hendFrom成員。和MFC一樣的是如果通知消息發(fā)送的不是普通的NMHDR結(jié)構(gòu),你的消息處理函數(shù)應(yīng)該將phdr參數(shù)轉(zhuǎn)換成正確的類型。我們將為CMainDlg添加LVN_ITEMCHANGED通知的處理函數(shù),處理從list控件發(fā)出的這個(gè)通知,在對(duì)話框中顯示當(dāng)前選擇的項(xiàng)目,先從添加消息映射宏和消息處理函數(shù)開(kāi)始:class CMainDlg : public . BEGIN_MSG_MAP_EX(CMainDlg) NOTIFY_HANDLER_EX(IDC_LIST, LVN_ITEMCHANGED, OnListItemchanged) END_MSG_MAP() LRESULT OnListItemchanged(NMHDR* phdr);/.;下面是消息處理函數(shù):LRESULT CMainDlg:OnListItemchanged ( NMHDR* phdr )NMLISTVIEW* pnmlv = (NMLISTVIEW*) phdr;int nSelItem = m_wndList.GetSelectedIndex();CString sMsg; / If no item is selected, show none. Otherwise, show its index. if ( -1 = nSelItem ) sMsg = _T(none); else sMsg.Format ( _T(%d), nSelItem ); SetDlgItemText ( IDC_SEL_ITEM, sMsg ); return 0; / retval ignored該處理函數(shù)并未用到phdr參數(shù),我將他強(qiáng)制轉(zhuǎn)換成NMLISTVIEW*只是為了演示用法。反射通知消息如果你是用CWindowImpl的派生類封裝控件,比如前面使用的CEditImpl,你可以在類的內(nèi)部處理通知消息而不是在對(duì)話框中,這就是通知消息的反射,它和MFC的消息反射相似。不同的是在WTL中父窗口和控件都可以處理通知消息,而在MFC中只有控件能處理通知消息(譯者加:除非你重載 WindowProc函數(shù),在MFC反射這些消息之前截獲它們)。如果需要將通知消息反射給控件封裝類,只需在對(duì)話框的消息映射鏈中添加REFLECT_NOTIFICATIONS()宏:class CMainDlg : public .public: BEGIN_MSG_MAP_EX(CMainDlg) /. NOTIFY_HANDLER_EX(IDC_LIST, LVN_ITEMCHANGED, OnListItemchanged) REFLECT_NOTIFICATIONS() END_MSG_MAP();這個(gè)宏向消息映射鏈添加了一些代碼處理那些未被前面的宏處理的通知消息,它檢查消息傳遞的HWND窗口句柄是否有效并將消息轉(zhuǎn)發(fā)給這個(gè)窗口,當(dāng)然,消息代碼的數(shù)值被改變成OLE控件所使用的值,OLE控件有與之相似的消息反射系統(tǒng)。新的消息代碼值用OCM_xxx代替了WM_xxx,但是消息的處理方式和未反射前一樣。有18中被反射的消息: 控件通知消息: WM_COMMAND, WM_NOTIFY, WM_PARENTNOTIFY 自畫(huà)消息: WM_DRAWITEM, WM_MEASUREITEM, WM_COMPAREITEM, WM_DELETEITEM List box 鍵盤(pán)消息: WM_VKEYTOITEM, WM_CHARTOITEM 其它: WM_HSCROLL, WM_VSCROLL, WM_CTLCOLOR* 在你想添加反射消息處理的控件類內(nèi)不要忘了使用DEFAULT_REFLECTION_HANDLER()宏,DEFAULT_REFLECTION_HANDLER()宏確保將未被處理的消息交給DefWindowProc()正確處理。 下面的例子是一個(gè)自畫(huà)按鈕類,它相應(yīng)了從父窗口反射的WM_DRAWITEM消息。class CODButtonImpl : public CWindowImplpublic: BEGIN_MSG_MAP_EX(CODButtonImpl) MSG_OCM_DRAWITEM(OnDrawItem) DEFAULT_REFLECTION_HANDLER() END_MSG_MAP() void OnDrawItem ( UINT idCtrl, LPDRAWITEMSTRUCT lpdis ) / do drawing here. ;用來(lái)處理反射消息的WTL宏 我們現(xiàn)在只看到了WTL的消息反射宏中的一個(gè):MSG_OCM_DRAWITEM,還有17個(gè)這樣的反射宏。由于WM_NOTIFY和WM_COMMAND消息帶的參數(shù)需要展開(kāi),WTL提供了特殊的宏MSG_OCM_COMMAND和MSG_OCM_NOTIFY做這些事情。這些宏所作的工作與COMMAND_HANDLER_EX和NOTIFY_HANDLER_EX宏相同,只是前面加了“REFLECTED_”,例如,一個(gè)樹(shù)控件類可能存在這樣的消息映射鏈:class CMyTreeCtrl : public CWindowImplpublic: BEGIN_MSG_MAP_EX(CMyTreeCtrl) REFLECTED_NOTIFY_CODE_HANDLER_EX(TVN_ITEMEXPANDING, OnItemExpanding) DEFAULT_REFLECTION_HANDLER() END_MSG_MAP() LRESULT OnItemExpanding ( NMHDR* phdr );在ControlMania1對(duì)話框中用了一個(gè)樹(shù)控件,和上面的代碼一樣處理TVN_ITEMEXPANDING消息,CMainDlg類的成員m_wndTree使用DDX連接到控件上,CMainDlg反射通知消息,樹(shù)控件的處理函數(shù)OnItemExpanding()是這樣的:LRESULT CBuffyTreeCtrl:OnItemExpanding ( NMHDR* phdr )NMTREEVIEW* pnmtv = (NMTREEVIEW*) phdr; if ( pnmtv-action & TVE_COLLAPSE ) return TRUE; / dont allow it else return FALSE; / allow it運(yùn)行ControlMania1,用鼠標(biāo)點(diǎn)擊樹(shù)控件上的+/-按鈕,你就會(huì)看到消息處理函數(shù)的作用節(jié)點(diǎn)展開(kāi)后就不能再折疊起來(lái)。容易出錯(cuò)和混淆的地方對(duì)話框的字體如果你像我一樣對(duì)界面非常講究并且正在只用windows 2000或XP,你就會(huì)奇怪為什么對(duì)話框使用MS Sans Serif字體而不是Tahoma字體,因?yàn)閂C6太老了,它生成的資源文件在NT 4上工作的很好,但是對(duì)于新的版本就會(huì)有問(wèn)題。你可以自己修改,需要手工編輯資源文件,據(jù)我所知VC 7不存在這個(gè)問(wèn)題。在資源文件中對(duì)話框的入口處需要修改3個(gè)地方:1. 對(duì)話框類型: 將DIALOG改為DIALOGEX 2. 窗口類型: 添加DS_SHELLFONT 3. 對(duì)話框字體: 將MS Sans Serif改為MS Shell Dlg 不幸的是前兩個(gè)修改會(huì)在每次保存資源文件時(shí)丟失(被VC又改回原樣),所以需要重復(fù)這些修改,下面是改動(dòng)之前的代碼:IDD_ABOUTBOX DIALOG DISCARDABLE 0, 0, 187, 102STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENUCAPTION AboutFONT 8, MS Sans SerifBEGIN .E

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論