VC++2015,新建一个对话框工程;

添加4个按钮;

添加对话框类成员变量;

把变量类型由CButton改为CXPButton;为变量起一个名字;一般为m_xxxx;

运行一下;XP按钮效果有了;

CXPButton继承自MFC的CButton;代码完全可自己修改;

搞点颜色;

CXPButton代码;

// XPButton.cpp : implementation file#include "stdafx.h"
#include "XPButton.h"#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif/
// CXPButtonCXPButton::CXPButton()
{m_BoundryPen.CreatePen(PS_INSIDEFRAME | PS_SOLID, 1, RGB(0, 0, 0));m_InsideBoundryPenLeft.CreatePen(PS_INSIDEFRAME | PS_SOLID, 3, RGB(250, 196, 88)); m_InsideBoundryPenRight.CreatePen(PS_INSIDEFRAME | PS_SOLID, 3, RGB(251, 202, 106));m_InsideBoundryPenTop.CreatePen(PS_INSIDEFRAME | PS_SOLID, 2, RGB(252, 210, 121));m_InsideBoundryPenBottom.CreatePen(PS_INSIDEFRAME | PS_SOLID, 2, RGB(229, 151, 0));m_FillActive.CreateSolidBrush(RGB(223, 222, 236));m_FillInactive.CreateSolidBrush(RGB(222, 223, 236));m_InsideBoundryPenLeftSel.CreatePen(PS_INSIDEFRAME | PS_SOLID, 3, RGB(153, 198, 252)); m_InsideBoundryPenTopSel.CreatePen(PS_INSIDEFRAME | PS_SOLID, 2, RGB(162, 201, 255));m_InsideBoundryPenRightSel.CreatePen(PS_INSIDEFRAME | PS_SOLID, 3, RGB(162, 189, 252));m_InsideBoundryPenBottomSel.CreatePen(PS_INSIDEFRAME | PS_SOLID, 2, RGB(162, 201, 255));m_bOver = m_bSelected = m_bTracking = m_bFocus = FALSE;}CXPButton::~CXPButton()
{m_BoundryPen.DeleteObject();m_InsideBoundryPenLeft.DeleteObject();m_InsideBoundryPenRight.DeleteObject();m_InsideBoundryPenTop.DeleteObject();m_InsideBoundryPenBottom.DeleteObject();m_FillActive.DeleteObject();m_FillInactive.DeleteObject();m_InsideBoundryPenLeftSel.DeleteObject();m_InsideBoundryPenTopSel.DeleteObject();m_InsideBoundryPenRightSel.DeleteObject();m_InsideBoundryPenBottomSel.DeleteObject();}BEGIN_MESSAGE_MAP(CXPButton, CButton)//{{AFX_MSG_MAP(CXPButton)ON_WM_MOUSEMOVE()ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave)ON_MESSAGE(WM_MOUSEHOVER, OnMouseHover)//}}AFX_MSG_MAP
END_MESSAGE_MAP()/
// CXPButton message handlers//添加Owner Draw属性
void CXPButton::PreSubclassWindow()
{// TODO: Add your specialized code here and/or call the base classCButton::PreSubclassWindow();ModifyStyle(0, BS_OWNERDRAW);
}void CXPButton::OnMouseMove(UINT nFlags, CPoint point)
{// TODO: Add your message handler code here and/or call defaultif (!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);
}LRESULT CXPButton::OnMouseLeave(WPARAM wParam, LPARAM lParam)
{m_bOver = FALSE;m_bTracking = FALSE;InvalidateRect(NULL, FALSE);return 0;
}LRESULT CXPButton::OnMouseHover(WPARAM wParam, LPARAM lParam)
{m_bOver = TRUE;InvalidateRect(NULL);return 0;
}void CXPButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{//从lpDrawItemStruct获取控件的相关信息CRect rect =  lpDrawItemStruct->rcItem;CDC *pDC=CDC::FromHandle(lpDrawItemStruct->hDC);int nSaveDC=pDC->SaveDC();UINT state = lpDrawItemStruct->itemState;POINT pt ;TCHAR strText[MAX_PATH + 1];::GetWindowText(m_hWnd, strText, MAX_PATH);//画按钮的外边框,它是一个半径为5的圆角矩形pt.x = 5;pt.y = 5;CPen* hOldPen = pDC->SelectObject(&m_BoundryPen);pDC->RoundRect(&rect, pt);//获取按钮的状态if (state & ODS_FOCUS){m_bFocus = TRUE;m_bSelected = TRUE;}else{m_bFocus = FALSE;m_bSelected = FALSE;}if (state & ODS_SELECTED || state & ODS_DEFAULT){m_bFocus = TRUE;}pDC->SelectObject(hOldPen);rect.DeflateRect(CSize(GetSystemMetrics(SM_CXEDGE), GetSystemMetrics(SM_CYEDGE)));//根据按钮的状态填充按钮的底色CBrush* pOldBrush;if (m_bOver){pOldBrush = pDC->SelectObject(&m_FillActive);DoGradientFill(pDC, &rect);}else{pOldBrush = pDC->SelectObject(&m_FillInactive);DoGradientFill(pDC, &rect);}//根据按钮的状态绘制内边框if (m_bOver || m_bSelected)DrawInsideBorder(pDC, &rect);pDC->SelectObject(pOldBrush);//显示按钮的文本if (strText!=NULL){CFont* hFont = GetFont();CFont* hOldFont = pDC->SelectObject(hFont);CSize szExtent = pDC->GetTextExtent(strText, lstrlen(strText));CPoint pt( rect.CenterPoint().x - szExtent.cx / 2, rect.CenterPoint().y - szExtent.cy / 2);if (state & ODS_SELECTED) pt.Offset(1, 1);int nMode = pDC->SetBkMode(TRANSPARENT);if (state & ODS_DISABLED)pDC->DrawState(pt, szExtent, strText, DSS_DISABLED, TRUE, 0, (HBRUSH)NULL);elsepDC->DrawState(pt, szExtent, strText, DSS_NORMAL, TRUE, 0, (HBRUSH)NULL);pDC->SelectObject(hOldFont);pDC->SetBkMode(nMode);}pDC->RestoreDC(nSaveDC);
}//绘制按钮的底色
void CXPButton::DoGradientFill(CDC *pDC, CRect* rect)
{CBrush brBk[64];int nWidth = rect->Width();    int nHeight = rect->Height();CRect rct;for (int i = 0; i < 64; i ++){if (m_bOver){if (m_bFocus)//brBk[i].CreateSolidBrush(RGB(255 - (i / 4), 255 - (i / 4), 255 - (i / 3)));brBk[i].CreateSolidBrush(RGB(128 - (i / 4), 255 - (i / 4), 128 - (i / 3)));elsebrBk[i].CreateSolidBrush(RGB(255 - (i / 4), 255 - (i / 4), 255 - (i / 5)));}else{if (m_bFocus)brBk[i].CreateSolidBrush(RGB(255 - (i / 3), 255 - (i / 3), 255 - (i / 4)));elsebrBk[i].CreateSolidBrush(RGB(255 - (i / 3), 255 - (i / 3), 255 - (i / 5)));}}for (int i = rect->top; i <= nHeight + 2; i ++) {rct.SetRect(rect->left, i, nWidth + 2, i + 1);pDC->FillRect(&rct, &brBk[((i * 63) / nHeight)]);}for (int i = 0; i < 64; i ++)brBk[i].DeleteObject();
}//绘制按钮的内边框
void CXPButton::DrawInsideBorder(CDC *pDC, CRect* rect)
{CPen *pLeft, *pRight, *pTop, *pBottom;if (m_bSelected && !m_bOver){pLeft = & m_InsideBoundryPenLeftSel;pRight = &m_InsideBoundryPenRightSel;pTop = &m_InsideBoundryPenTopSel;pBottom = &m_InsideBoundryPenBottomSel;}else{pLeft = &m_InsideBoundryPenLeft;pRight = &m_InsideBoundryPenRight;pTop = &m_InsideBoundryPenTop;pBottom = &m_InsideBoundryPenBottom;}CPoint oldPoint = pDC->MoveTo(rect->left, rect->bottom - 1);CPen* pOldPen = pDC->SelectObject(pLeft);pDC->LineTo(rect->left, rect->top + 1);pDC->SelectObject(pRight);pDC->MoveTo(rect->right - 1, rect->bottom - 1);pDC->LineTo(rect->right - 1, rect->top);pDC->SelectObject(pTop);pDC->MoveTo(rect->left - 1, rect->top);pDC->LineTo(rect->right - 1, rect->top);pDC->SelectObject(pBottom);pDC->MoveTo(rect->left, rect->bottom);pDC->LineTo(rect->right - 1, rect->bottom);pDC->SelectObject(pOldPen);pDC->MoveTo(oldPoint);if (m_bSelected && !m_bOver)DrawFocusRect(pDC->m_hDC,rect);
}

#if !defined(AFX_XPBUTTON_H__44CD5B2A_756E_4939_9261_E0034E0F2DEF__INCLUDED_)
#define AFX_XPBUTTON_H__44CD5B2A_756E_4939_9261_E0034E0F2DEF__INCLUDED_#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// XPButton.h : header file
///
// CXPButton windowclass CXPButton : public CButton
{
// Construction
public:CXPButton();// Attributes
protected://按钮的外边框CPen m_BoundryPen;//鼠标指针置于按钮之上时按钮的内边框CPen m_InsideBoundryPenLeft;CPen m_InsideBoundryPenRight;CPen m_InsideBoundryPenTop;CPen m_InsideBoundryPenBottom;//按钮获得焦点时按钮的内边框CPen m_InsideBoundryPenLeftSel;CPen m_InsideBoundryPenRightSel;CPen m_InsideBoundryPenTopSel;CPen m_InsideBoundryPenBottomSel;//按钮的底色,包括有效和无效两种状态CBrush m_FillActive;CBrush m_FillInactive;//按钮的状态BOOL m_bOver;  //鼠标位于按钮之上时该值为true,反之为flaseBOOL m_bTracking; //在鼠标按下没有释放时该值为trueBOOL m_bSelected;    //按钮被按下是该值为trueBOOL m_bFocus;   //按钮为当前焦点所在时该值为true// Operations
public:// Overrides// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CXPButton)protected:virtual void PreSubclassWindow();//}}AFX_VIRTUAL// Implementation
public:virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);virtual void DoGradientFill(CDC *pDC, CRect* rect);virtual void DrawInsideBorder(CDC *pDC, CRect* rect);virtual ~CXPButton();// Generated message map functions
protected://{{AFX_MSG(CXPButton)afx_msg void OnMouseMove(UINT nFlags, CPoint point);afx_msg LRESULT OnMouseLeave(WPARAM wParam, LPARAM lParam);afx_msg LRESULT OnMouseHover(WPARAM wParam, LPARAM lParam);//}}AFX_MSGDECLARE_MESSAGE_MAP()
};///{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.#endif // !defined(AFX_XPBUTTON_H__44CD5B2A_756E_4939_9261_E0034E0F2DEF__INCLUDED_)

使用VC++2015 实现XP按钮效果相关推荐

  1. shazam 算法_类似于Shazam的变形按钮效果

    shazam 算法 View demo 查看演示Download Source 下载源 Today we'd like to show you how to create a fun little m ...

  2. 利用ViewDragHelper实现菜鸟裹裹的悬浮按钮效果

    一起来看看菜鸟裹裹的悬浮按钮效果是怎么样的: 看到那个免费送电影票了么,那个就是悬浮的按钮,这是一个View,可以是Button或者其他,都可以 然后我们需要用到ViewDragHelper,就要先去 ...

  3. [转]VC无负担实现XP风格界面

    VC无负担实现XP风格界面 有件事情必须说一下,按照上面的方法,test.exe必须先调用InitCommonControls函数(已经废除,不建议使用)或者InitCommonControlsEx函 ...

  4. php手绘功能,基于纯CSS3的6种手绘涂鸦按钮效果

    简要教程 这是一组非常有趣的纯CSS3手绘风格卡通按钮设计效果.这组手绘风格按钮共6种不同的效果,它们以手绘涂鸦的方式,以不同的按钮边框线条宽度和虚线来构成按钮,效果非常不错. 使用方法 HTML结构 ...

  5. php3d按钮,CSS实现3D按钮效果

    这次给大家带来CSS实现3D按钮效果,CSS实现3D按钮效果的注意事项有哪些,下面就是实战案例,一起来看一下. css巧妙利用了box-shadow来实现3D物体的立体感,当按钮按下的时候再去修改bo ...

  6. 山寨“饿了么”应用中添加菜品数量按钮效果

    山寨"饿了么"应用中添加菜品数量按钮效果 本人视频教程系类   iOS中CALayer的使用 最终效果: 山寨源头: 源码:(此源码解决了重用问题,可以放心的放在cell中使用) ...

  7. html涟漪动画效果,CSS+JS实现水滴涟漪动画按钮效果的示例代码

    代码如下所示: Document .btn{ display: block; width: 300px; height: 100px; margin: 50px; outline: 0; overfl ...

  8. 【第3版emWin教程】第55章 emWin6.x按钮Button控件自定义回调函数,实现各种按钮效果

    教程不断更新中:链接 第55章       emWin6.x按钮Button控件自定义回调函数,实现各种按钮效果 本章节为大家讲解按钮控件自定义回调函数,通过其回调函数就可以实现各种按钮效果.这方面的 ...

  9. 在VC中编程实现按钮的启用(enable)和禁用(disable)

    在VC中编程实现按钮的启用(enable)和禁用(disable)- - 方法总的说只有一个,就是调用CButton::EnableWindow()函数[毕竟CButton是从CWnd继承下来的] 具 ...

最新文章

  1. Python脚本语言写法
  2. C++与Lua交互(四)
  3. 【caffe】基本数据结构blob
  4. snakeyaml读取yaml/yml配置文件数据
  5. [蛋蛋无厘头日记]约会ing~~
  6. lambd 创建线程_连接到Qt信号的Python lambda函数在其他线程中创建时不运行
  7. int与string互转
  8. NLPCC 2021 Final Call For Papers
  9. Jenkins定时自动构建项目
  10. 【转】pom.xml详解
  11. python win32api messagebox_如何在Python中使用Win32 API?
  12. 大写数字时钟屏保下载
  13. Matlab仿真偶极子天线激励
  14. mysql error1682_mysql5.7报错 1546、1577和1682问题分析
  15. 【社会经验】如何高效的学习?
  16. 紫光集团或入股武汉新芯 赵伟国将任董事长
  17. 自建网络加速服务器,自建DNS缓存服务器加快上网速度
  18. vue调用本地摄像头实现拍照
  19. matlab rloess,比较ggplot loess拟合和loess拟合函数
  20. 修炼系列(八),你真的会写注释吗

热门文章

  1. linux管理员工作目录,密码管理员 - FPM2
  2. layui使用方法——图标
  3. 默认访问首页 || 国际化||设置全局字符编码的默认设置
  4. java的知识点27——lambda推导
  5. 查看Mat对象的数据的三种方法
  6. matlab+snapshot采集图片
  7. Ubuntu 14.04 64bit + CUDA 6.5 配置说明
  8. linux db2乱码,DB2乱码(开始和结束,字符串中间没有好的办法)
  9. java servlet helloworld,Java如何创建HelloWorld Servlet?
  10. 异步爬虫(爬取小说30秒12MB!)Python实现