【转】WM_MESSAGE、WM_COMMAND、WM_NOTIFY等消息有什么不同
轉(zhuǎn)自:https://blog.csdn.net/newstarao/article/details/3775690
WM_MESSAGE是最普通的WINDOWS消息,對于這種類型的消息沒什么好說的。那WM_COMMAND和WM_NOTIFY消息都是WINDOWS CONTROL給它的父窗體發(fā)的消息,那這兩種消息有什么不同呢?WM_COMMAND消息其實(shí)是早期的(WIN3.X時(shí)代)子窗體消息,子窗體給父窗體發(fā)送消息,父窗體就捕獲WM_COMMAND來處理子窗體的消息。但是這個(gè)消息只包括了有限的信息,例如wParam包括了子窗口ID和通知碼,lParam則包括了子窗口句柄,就這點(diǎn)信息了,如果想知道一些額外的信息的話(例如,鼠標(biāo)點(diǎn)在了子控件的什么位置)就要借助于其他的WM_*消息。所以對于新型的WIN32控件,微軟就增加了一個(gè)新的NOTIFICATION消息,這個(gè)消息的參數(shù)是這樣的:wParam包含了控件ID,而lParam則包含了一個(gè)結(jié)構(gòu)體的指針,這個(gè)結(jié)構(gòu)體是NMHDR結(jié)構(gòu)或者以NMHDR結(jié)構(gòu)為第一項(xiàng)的一個(gè)更大的結(jié)構(gòu)體。這樣就可以包含了很多的子控件想給父窗體提供的信息了,甚至可以自己去定義這種的結(jié)構(gòu)體。
???? 這就是這幾種消息的差別點(diǎn)了。
控件的自畫:
???? 首先在創(chuàng)建控件的時(shí)候增加BS_OWNERDRAW選項(xiàng),這個(gè)STYLE是告訴控件,別自己處理外觀,讓主程序來處理你的外觀,這時(shí)你就有權(quán)決定這個(gè)控件是畫成什么樣子了。然后就是處理WM_DRAWITEM的消息,利用 LPDRAWITEMSTRUCT pdis = (LPDRAWITEMSTRUCT) lParam; 來取得一些必要的信息,如按鈕的DC,位置等,通過這些參數(shù)實(shí)現(xiàn)對這個(gè)DC的內(nèi)容進(jìn)行繪畫。COMMON Ctronller的STYLE都在COMMCTRL.H頭文件里。
按鈕在以下狀態(tài)時(shí)會對它的父窗口發(fā)送WM_COMMAND的消息:
按了一次(BN_CLICKED),取得焦點(diǎn)(BN_SETFOCUS),失去焦點(diǎn)(BN_KILLFOCUS)等。
這個(gè)是按鈕的發(fā)送WM_COMMAND的條件,其他的控件什么時(shí)候會發(fā)送WM_COMMAND消息可查看該控件的通知碼(在wParam的高位HIWORD)。例如,滾動(dòng)條控件在被滾動(dòng)的時(shí)候會向它的父窗體發(fā)送消息,但是不是WM_COMMAND消息,而是WM_VSCROLL和WM_HSCROLL消息。這只是為了說明凡是子控件,都會在適當(dāng)?shù)臈l件下向它的父窗體發(fā)送消息。無論是WM_COMMAND還是WM_NOTIFY或是WM_VSCROLL消息等。
另外,MoveWindow會產(chǎn)生WM_SIZE消息。
總結(jié)
以上是生活随笔為你收集整理的【转】WM_MESSAGE、WM_COMMAND、WM_NOTIFY等消息有什么不同的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 沪深300etf期权什么时候上市?沪深3
- 下一篇: LSGO软件技术团队2015~2016学