日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

使用VC++2015 实现XP按钮效果

發(fā)布時間:2025/4/14 c/c++ 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用VC++2015 实现XP按钮效果 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

VC++2015,新建一個對話框工程;

添加4個按鈕;

添加對話框類成員變量;

把變量類型由CButton改為CXPButton;為變量起一個名字;一般為m_xxxx;

運(yùn)行一下;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獲取控件的相關(guān)信息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);//獲取按鈕的狀態(tài)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)));//根據(jù)按鈕的狀態(tài)填充按鈕的底色CBrush* pOldBrush;if (m_bOver){pOldBrush = pDC->SelectObject(&m_FillActive);DoGradientFill(pDC, &rect);}else{pOldBrush = pDC->SelectObject(&m_FillInactive);DoGradientFill(pDC, &rect);}//根據(jù)按鈕的狀態(tài)繪制內(nèi)邊框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(); }//繪制按鈕的內(nèi)邊框 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;//鼠標(biāo)指針置于按鈕之上時按鈕的內(nèi)邊框CPen m_InsideBoundryPenLeft;CPen m_InsideBoundryPenRight;CPen m_InsideBoundryPenTop;CPen m_InsideBoundryPenBottom;//按鈕獲得焦點時按鈕的內(nèi)邊框CPen m_InsideBoundryPenLeftSel;CPen m_InsideBoundryPenRightSel;CPen m_InsideBoundryPenTopSel;CPen m_InsideBoundryPenBottomSel;//按鈕的底色,包括有效和無效兩種狀態(tài)CBrush m_FillActive;CBrush m_FillInactive;//按鈕的狀態(tài)BOOL m_bOver; //鼠標(biāo)位于按鈕之上時該值為true,反之為flaseBOOL m_bTracking; //在鼠標(biāo)按下沒有釋放時該值為trueBOOL m_bSelected; //按鈕被按下是該值為trueBOOL m_bFocus; //按鈕為當(dāng)前焦點所在時該值為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_)

?

總結(jié)

以上是生活随笔為你收集整理的使用VC++2015 实现XP按钮效果的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 男男gay动漫 | 操人视频在线观看 | 日韩欧美国产激情 | 少妇视频在线播放 | 国产做受高潮动漫 | 国产乱码精品一区二区三区中文 | 中文字幕2021 | 久久深夜福利 | 久久国产精品久久 | 日韩国产欧美在线视频 | 欧美精品二区三区 | 日韩青青草 | 欧美有码在线 | 樱井莉亚av | 色xxxxxx | 欧美丰满bbw| 国模视频一区二区 | 久久久久久亚洲av无码专区 | 亚洲黄色网页 | 91浏览器在线观看 | 高清成人免费视频 | 免费在线播放黄色片 | 免费观看理伦片在线播放视频软件 | 日色视频 | 99精品视频在线播放免费 | 黄色三级视频 | 婷婷色在线观看 | 影音先锋人妻啪啪av资源网站 | 国产综合欧美 | 黄色一级视屏 | 九九色网 | 国产特黄大片aaaa毛片 | 亚洲美女www午夜 | 7777在线视频 | 三级中文字幕 | 男生操女生在线观看 | 成年人三级网站 | 高hnp视频| 日韩射| 欧美精品一区二区免费 | 亚洲欧美日韩精品色xxx | 亚洲视频h | 日本国产网站 | 少妇高潮一69aⅹ | 中文字幕欧美日韩 | 国产理论视频在线观看 | 偷拍女澡堂一区二区三区 | 久久国产精品影院 | 日本免费黄色 | 国产成人精品亚洲精品色欲 | 超碰97人人在线 | 欧美激情一区二区三区免费观看 | 白峰美羽在线播放 | a天堂资源在线 | 公交顶臀绿裙妇女配视频 | 大陆农村乡下av | 欧美日韩综合在线观看 | 激情文学综合网 | 美丽的姑娘在线观看免费 | 大尺度做爰呻吟62集 | www.在线观看麻豆 | 怡红院av亚洲一区二区三区h | 欧美激情一区二区三级高清视频 | 理论片中文 | 久久看片 | av老司机在线播放 | 蜜臀av免费一区二区三区水牛 | 日日夜夜免费精品 | 美女福利在线观看 | 国产高清日韩 | 成人一级网站 | 性爱视频免费 | 最新国产中文字幕 | 91视频综合 | 日本高清免费不卡视频 | 欧美日韩亚 | 波多野结衣一区在线 | 79日本xxxxxxxxx18 婷婷亚洲一区 | 在线观看免费黄网站 | 日本精品视频 | 久草毛片| 午夜福利一区二区三区 | 亚洲免费a | 一区二区在线看 | 嫩模一区二区三区 | 五月婷婷狠狠 | 日韩精品人妻一区二区三区免费 | 亚洲一区国产精品 | 亚洲乱码精品 | 欧美成人一二区 | av人人干| 人人人干| 久久精品在线视频 | 草在线视频 | 日本xxx在线播放 | 精品人妻一区二区三区四区 | 国产精品视频久久久久 | 免费婷婷 | 国产第一页屁屁影院 |