//按下按钮并弹起 IDC_BUTTON1 1001 /* Button:WindowProc():message=0x20 , WPARAM=1879210944 , HLPARAM =513 , LWPARAM =1 Button:WindowProc():message=0x87 , WPARAM=1 , HLPARAM =5 , LWPARAM =976 WM_GETDLGCODE 后跟消息函数OnGetDlgCode() 鼠标按下 Button:WindowProc():message=0x201 ,WPARAM=1 , HLPARAM =20 , LWPARAM =33 WM_LBUTTONDOWN Button:WindowProc():message=0xf3 , WPARAM=1 , HLPARAM =0 , LWPARAM =0 BM_SETSTATE 后跟重载函数OnDrawItem() Button:WindowProc():message=0x87 , WPARAM=1 , HLPARAM =5 , LWPARAM =976 WM_GETDLGCODE 后跟消息函数OnGetDlgCode() 鼠标移动 Button:WindowProc():message=0x200 ,WPARAM=1 , HLPARAM =20 , LWPARAM =33 WM_MOUSEMOVE Button:WindowProc():message=0xf3 , WPARAM=1 , HLPARAM =0 , LWPARAM =0 BM_SETSTATE @此处f3后没有跟重装函数OnDrawItme() Button:WindowProc():message=0x119 ,WPARAM=1 , HLPARAM =16 , LWPARAM =0 Button:WindowProc():message=0x119 ,WPARAM=10 , HLPARAM =16 , LWPARAM =0 Button:WindowProc():message=0x119 ,WPARAM=2 , HLPARAM =16 , LWPARAM =0 Button:WindowProc():message=0x87 , WPARAM=0 , HLPARAM =5 , LWPARAM =976 WM_GETDLGCODE 后跟消息函数OnGetDlgCode() 鼠标弹起 Button:WindowProc():message=0x202 ,WPARAM=0 , HLPARAM =20 , LWPARAM =33 WM_LBUTTONUP Button:WindowProc():message=0xf3 , WPARAM=0 , HLPARAM =0 , LWPARAM =0 BM_SETSTATE 后跟重载函数OnDrawItem() Button:WindowProc():message=0x215 ,WPARAM=0 , HLPARAM =0 , LWPARAM =0 WM_CAPTURECHANGED 分析得出重装函数DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)只在按下和弹起 f3消息后调用一次 分析: 鼠标按下后f3消息wparam为1,调用DrawItem; 鼠标移动后f3消息wparam扔为1,没有改变状态,没调用DrawItem; 鼠标弹起后f3消息wparam改为0,调用DrawItem; 网络: OnDrawItem( int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct );: 当自绘按钮(owner-draw button),下拉列表框(combo box), 列表框(list box)视觉属性,或者菜单发生变化时,框架为他们的owner调用该函数。本例没产生WM_DRAWITEM(0x002B)消息 OnDrawItem是画窗口中的子控件的,因为它的入口参数LPDRAWITEMSTRUCT带入不同子控件的相关参数, 而且,你得把字控件设置成“自画”类型,才会调用到OnDrawItem, 顺便说一下自画,不是所有设置成自画类型的控件都会调用父窗口的OnDrawItem, 例如ListBox的自画,你就必须重载CListBox的DrawItem方法和MeasureItem方法才可以, 但象菜单,按钮等的自画则会调用OnDrawItem。 OnPaint和OnDrawItem不在一个范畴内,他是WM_PAINT的响应函数, 凡是基于CWnd的类都有OnPaint事件发生,就是说凡是窗口都有WM_PAINT事件发生。 来自:http://www.cnblogs.com/sqzxcv/archive/2009/12/06/1618117.html ??: 消息函数OnDrawItem( int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct );是在父窗口中调用,对子控件处理? 在子控件类中不会有控制自己的WM_DRAWITEM消息?不会调用OnDrawItem( int , LPDRAWITEMSTRUCT )? 在子控件自身类中调用重载函数DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct); 最后:1 在对话框中添加自绘按钮,如果设置owner draw属性为真,按下、弹起按钮,父对话框会接收到WM_DRAWITEM消息, 并会调用对话框的OnDrawItem函数,可在函数或消息中对按钮进行处理。 其中lpDrawItemStruct->CtlID,nIDCtl两个参数表明按钮的ID, 对于自绘按钮类自身,按下弹起会调用重载函数DrawItem() 其中LPDRAWITEMSTRUCT.itemState 按下等于17,弹起等于16 2 如果owner draw消息设置为假,则,父窗口不会收到WM_DRAWITEM消息,也不会调用OnDrawItem()函数 按钮自身类也不会调用重载的DrawItem()函数。 按钮的自绘效果都会不起作用,表现出来一个白框框样子的标准MFC控件 但owner draw为假的情况下,自绘按钮类对WM_PAINT/WM_ERASEBKGND消息或OnPaint/OnEraseBkgnd的重载仍起作用 可以改变按钮的初始样子,只能看不能用,点一次按钮后就恢复为标准的MFC控件按钮了。 仍有0x00f3消息 */