• MFC按钮自绘消息分析



    //按下按钮并弹起				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消息
    		*/
    

      

  • 相关阅读:
    Go组件学习——Web框架Gin
    一次线上接口超时的排查过程
    Go组件学习——手写连接池并没有那么简单
    终于跑通分布式事务框架tcc-transaction的示例项目
    Go语言学习——如何实现一个过滤器
    Go组件学习——database/sql数据库连接池你用对了吗
    我们这一年 | 诗人呀
    NodeMan架构
    NodeMan介绍
    微信小程序录音实现
  • 原文地址:https://www.cnblogs.com/ezhong/p/2171460.html
Copyright © 2020-2023  润新知