MFC下按钮自绘的实现

MFC下按钮自绘的实现

ID:37854256

大小:103.00 KB

页数:7页

时间:2019-06-01

MFC下按钮自绘的实现_第1页
MFC下按钮自绘的实现_第2页
MFC下按钮自绘的实现_第3页
MFC下按钮自绘的实现_第4页
MFC下按钮自绘的实现_第5页
资源描述:

《MFC下按钮自绘的实现》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、MFC下按钮自绘的实现(一)在MFC下编程,很多时候对于标准的按钮控件不是很满意,想要弄的美观点。这就需要按钮自绘。这里简单记录一下方法,以免过个十天半个月的,自己又忘的一干二净了。首先给工程添加一个MFC类,基类为CButton。要想让按钮具备自绘功能,就要为按钮添加BS_OWNERDRAW属性。为类CButton重载PreSubclassWindow虚函数。在该函数中添加如下一行代码:ModifyStyle(0,BS_OWNERDRAW);当按钮控件具有了自绘功能之后,每次控件状态改变都会触发DrawItem函数,在该函数中来绘制按钮的形态外观,所以第二步就要重载DrawI

2、tem虚函数。在这个函数中就可以自由发挥了,比如绘制外边框,底色,按钮标题,内边框等等。一般都会为按钮定义几种不同状态时的外观,比如光标滑过时的状态,按钮按下时的状态,按钮禁用时的状态,以及按钮的正常状态等等。这就要为新的按钮添加几种重要的消息响应。比如WM_MOUSELEAVE消息,WM_MOUSEHOVER消息和WM_MOUSEMOVE消息等等,值得一提的是前两个消息的响应函数需要自己手动添加,微软提供了一个TrackMouseEvent函数在光标离开一个窗口时投递WM_MOUSELEAVE消息,光标滑过窗口时投递WM_MOUSEHOVER消息。一般来说可以在WM_MOUS

3、EMOVE消息响应函数中调用TrackMouseEvent函数来投递WM_MOUSELEAVE消息和WM_MOUSEHOVER消息。然后在WM_MOUSELEAVE消息的响应函数中标记“光标已经离开按钮”,然后调用InvalidateRect函数让按钮重绘。在WM_MOUSEHOVER消息的响应函数中标记“光标正在按钮上方”,并调用InvalidateRect函数让按钮重绘。典型代码:if(!m_bTracking)//判断此时按钮是否已经按下{TRACKMOUSEEVENTtme;tme.cbSize=sizeof(tme);tme.hwndTrack=m_hWnd;tme.

4、dwFlags=TME_LEAVE

5、TME_HOVER;tme.dwHoverTime=1;m_bTracking=_TrackMouseEvent(&tme);}这几天都是这么困,不知道是怎么搞的,呆会接着写。MFC下按钮自绘的实现(二)上篇文章中提到使用WM_MOUSELEAVE消息,但是在WindowsCE操作系统下,手动添加WM_MOUSELEAVE消息响应函数之后,编译会发现WM_MOUSELEAVE没有定义。之前在WindowsXP操作系统下执行的程序没有这个提示。找到原来的程序,发现WM_MOUSELEAVE的定义在microsoftvisualstudio8

6、vcplatformsdkincludewinuser.h文件中。#if(WINVER>=0x0500)#defineWM_NCMOUSEHOVER0x02A0#defineWM_NCMOUSELEAVE0x02A2#endif/*WINVER>=0x0500*/据此手动添加如下代码:#ifndefWM_MOUSELEAVE#defineWM_MOUSELEAVE0x02A3#endif对于WM_MOUSEHOVER消息也是一样:#ifndefWM_MOUSEHOVER#defineWM_MOUSEHOVER0x02A1#endif重新编译即可。另外上篇文章中说道Trac

7、kMouseEvent函数用来投递WM_MOUSELEAVE和WM_MOUSEHOVER消息。貌似这个函数在WindowsCE操作系统下也找不到。找不到就不用它了,自己直接调用PostMessage投递出去算了。比如:::PostMessage(m_hWnd,WM_MOUSELEAVE,0,0);那么当光标滑过按钮时,会触发WM_MOUSEMOVE消息,在这个函数中如何判断光标是在按钮上停留着还是离开了,从而是发送WM_MOUSELEAVE消息还是WM_MOUSEHOVER消息呢?这个不难吧,至少PtInRect函数可以搞定。自己测试了一下,完全可以。MFC下按钮自绘的实现(三

8、)按钮的绘制主要在DrawItem函数中来完成,下面来简单的绘制一下。第一步先绘制按钮的外边框。定义了一个成员变量:CPenm_OutBorderPen;这是一个用来绘制按钮外边框的画笔,在类的构造函数中创建它,在类的析构函数中销毁之。然后在DrawItem函数中开始绘制按钮的外边框:CRectrect=lpDrawItemStruct->rcItem;CDC*pDC=CDC::FromHandle(lpDrawItemStruct->hDC);intnSavedDC=pDC->SaveDC

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。