MFC重绘的按钮控件
2015-06-04 22:02
225 查看
算是MFC重绘中最基础的一个部分了,重绘一个按钮控件!自己结合网上代码写的,给大家参考一下!
#pragma once // CNormalButton class CNormalButton : public CButton { private: //各种颜色 COLORREF m_normalBorderColor;//正常边框颜色 COLORREF m_overBorderColor;//鼠标位于按钮之上的按钮边框颜色 COLORREF m_downBorderColor;//鼠标按下的边框颜色 COLORREF m_textColor;//按钮文本颜色 COLORREF m_overBgColor;//鼠标位于按钮之上的按钮背景颜色 COLORREF m_normalBgColor;//按钮正常背景颜色 COLORREF m_downBgColor;//鼠标按下的背景颜色 COLORREF m_disabledBgColor;//按钮被禁用背景颜色 CFont m_textFont;//按钮文本字体 //按钮的状态 bool m_bOver; //鼠标位于按钮之上时该值为true,反之为flase bool m_bTracking; //在鼠标按下没有释放时该值为true bool m_bSelected; //按钮被按下是该值为true bool m_bFocus; //按钮为当前焦点所在时该值为true bool m_bDisabled;//按钮被禁用时值为true DECLARE_DYNAMIC(CNormalButton) public: CNormalButton(); virtual ~CNormalButton(); protected: DECLARE_MESSAGE_MAP() public: afx_msg void OnMouseHover(UINT nFlags, CPoint point); afx_msg void OnMouseMove(UINT nFlags, CPoint point); afx_msg void OnMouseLeave(); virtual void PreSubclassWindow(); virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct); };
// NormalButton.cpp : 实现文件 // #include "stdafx.h" #include "NormalButton.h" // CNormalButton IMPLEMENT_DYNAMIC(CNormalButton, CButton) CNormalButton::CNormalButton() { m_normalBorderColor = RGB(196, 196 ,196); m_overBorderColor = RGB(142, 174 ,212); m_downBorderColor = RGB(117, 150 ,191); m_textColor = RGB(0, 0, 0); m_overBgColor = RGB(230 ,240, 247); m_normalBgColor = RGB(243, 243, 243); m_downBgColor = RGB(208, 229, 250); m_disabledBgColor = RGB(240, 240, 240); m_textFont.CreatePointFont(100, _T("宋体")); m_bOver = false; m_bTracking = false; m_bSelected = false; m_bFocus = false; m_bDisabled = false; } CNormalButton::~CNormalButton() { m_textFont.DeleteObject(); } BEGIN_MESSAGE_MAP(CNormalButton, CButton) ON_WM_MOUSEHOVER() ON_WM_MOUSEMOVE() ON_WM_MOUSELEAVE() END_MESSAGE_MAP() // CNormalButton 消息处理程序 void CNormalButton::OnMouseHover(UINT nFlags, CPoint point) { // TODO: 在此添加消息处理程序代码和/或调用默认值 m_bOver = TRUE; InvalidateRect(NULL); CButton::OnMouseHover(nFlags, point); } void CNormalButton::OnMouseMove(UINT nFlags, CPoint point) { // TODO: 在此添加消息处理程序代码和/或调用默认值 if (!m_bTracking) { TRACKMOUSEEVENT tme; tme.cbSize = sizeof(tme); tme.hwndTrack = m_hWnd; tme.dwFlags = TME_LEAVE | TME_HOVER; tme.dwHoverTime = 1; m_bTracking = _TrackMouseEvent(&tme); } CButton::OnMouseMove(nFlags, point); } void CNormalButton::OnMouseLeave() { // TODO: 在此添加消息处理程序代码和/或调用默认值 m_bOver = FALSE; m_bTracking = FALSE; InvalidateRect(NULL, FALSE); CButton::OnMouseLeave(); } void CNormalButton::PreSubclassWindow() { // TODO: 在此添加专用代码和/或调用基类 CButton::PreSubclassWindow(); ModifyStyle(0, BS_OWNERDRAW); } void CNormalButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { // TODO: 添加您的代码以绘制指定项 //从lpDrawItemStruct获取控件的相关信息 CRect rect = lpDrawItemStruct->rcItem; CDC *pDC=CDC::FromHandle(lpDrawItemStruct->hDC); int nSaveDC=pDC->SaveDC(); UINT state = lpDrawItemStruct->itemState; TCHAR strText[MAX_PATH + 1]; ::GetWindowText(m_hWnd, strText, MAX_PATH); //获取按钮的状态 if (state & ODS_DISABLED) { m_bDisabled = true; } else { m_bDisabled = false; } if (state & ODS_FOCUS) { m_bFocus = true; m_bSelected = false; if (state & ODS_SELECTED) { m_bSelected = true; } } else { m_bFocus = false; m_bSelected = false; } //根据按钮的状态画出按钮 CPen* pBorderPen = new CPen(); pBorderPen->CreatePen(PS_INSIDEFRAME | PS_SOLID, 1, m_normalBorderColor); pDC->SelectObject(pBorderPen); CBrush* pBgBrush = new CBrush(); COLORREF nowBgColor; if (m_bDisabled) { nowBgColor = m_disabledBgColor; } else { if (m_bSelected) { nowBgColor = m_downBgColor; pBorderPen->DeleteObject(); pBorderPen->CreatePen(PS_INSIDEFRAME | PS_SOLID, 1, m_downBorderColor); pDC->SelectObject(pBorderPen); } else if (m_bOver || m_bFocus) { nowBgColor = m_overBgColor; pBorderPen->DeleteObject(); pBorderPen->CreatePen(PS_INSIDEFRAME | PS_SOLID, 1, m_overBorderColor); pDC->SelectObject(pBorderPen); } else { nowBgColor = m_normalBgColor; } } pBgBrush->CreateSolidBrush(nowBgColor); pDC->SelectObject(pBgBrush); pDC->Rectangle(rect); //显示按钮的文本 if (strText != NULL) { CFont* hOldFont = pDC->SelectObject(&m_textFont); pDC->SetBkColor(nowBgColor); CSize szExtent = pDC->GetTextExtent(strText, lstrlen(strText)); CPoint pt( rect.CenterPoint().x - szExtent.cx / 2, rect.CenterPoint().y - szExtent.cy / 2); if (m_bSelected) pt.Offset(1, 1); pDC->TextOutW(pt.x, pt.y, strText, lstrlen(strText)); pDC->SelectObject(hOldFont); } pDC->RestoreDC(nSaveDC); pBorderPen->DeleteObject(); pBgBrush->DeleteObject(); }
相关文章推荐
- 如何停止一个Java线程
- Android 开源框架Universal-Image-Loader完全解析(一)--- 基本介绍及使用
- 面试题:this、super、以及程序初始化的顺序问题
- 手机共享电脑Wifi软件网络抓包
- Azure SQL 数据库新服务级别现已正式发布
- rails4.2~devise邮箱测试
- IOS GameCenter编程入门
- jquery实现弹出确认是否删除的一个简单代码
- Eclipse安装windowbuilder插件,实现Java的可视化编程
- [博弈论]hiho#1173 : 博弈游戏·Nim游戏·三
- 今天执行grep命令差点把服务器搞崩
- CvRect、RECT和Rect
- Hibernate 对象的三种状态 transient persistent detached
- 汇编语言学习笔记(3)——寄存器,内存访问
- EPUB弹出窗口式脚注
- webapp 外部css的引用
- C#代码实现邮箱验证C#中及一些常用的正则表达式
- 实验三 敏捷开发与XP实践(改)
- Java NIO--初步认识
- JavaScript学习笔记(二)