- 在對話框內(nèi)添加button控件,button控件屬性中 所有者 描述改為TRUE
- 添加COwerButton類。代碼如下:
COwerButton.h
#pragma once
#include <afxwin.h>
class COwerButton :
public CButton
{
DECLARE_DYNAMIC(COwerButton)
public:
COwerButton();
virtual ~COwerButton();
void SetButtonBgColor(COLORREF color);
void SetButtonTextColor(COLORREF color);
int SwitchDlgMouseMoveState;
private:
COLORREF m_bgColor;
COLORREF m_textColor;
COLORREF m_DownColor;
BOOL m_bPressed;
protected:
DECLARE_MESSAGE_MAP()
BOOL m_bTracking; //在鼠標按下沒有釋放時該值為true
afx_msg void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
afx_msg LRESULT OnMouseLeave(WPARAM wParam, LPARAM lParam);
};
COwerButton.cpp文章來源:http://www.zghlxwxcb.cn/news/detail-518096.html
#include "pch.h"
#include "COwerButton.h"
IMPLEMENT_DYNAMIC(COwerButton, CButton)
COwerButton::COwerButton()
{
m_bgColor = RGB(39, 58, 91);
m_textColor = RGB(255, 255, 255);
m_bPressed = FALSE;
SwitchDlgMouseMoveState = 0;
}
COwerButton::~COwerButton()
{
}
BEGIN_MESSAGE_MAP(COwerButton, CButton)
ON_WM_DRAWITEM()
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_MOUSEMOVE()
ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave)
END_MESSAGE_MAP()
// COwerButton 消息處理程序
void COwerButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
CString btnCaption = L"";
//設(shè)置標題
CFont font;
CWnd* pItemCWnd = FromHandle(lpDrawItemStruct->hwndItem);
pItemCWnd->GetWindowText(btnCaption);
CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
CRect drawRect;
CBrush pBrush;
CRect rect = lpDrawItemStruct->rcItem;//空間選擇
//獲得繪圖DC
//得到原Button的矩形大小
drawRect.CopyRect(&(lpDrawItemStruct->rcItem));
//繪制控件框架
pDC->DrawFrameControl(&drawRect, DFC_BUTTON, lpDrawItemStruct->CtlType);
if (ODS_SELECTED & lpDrawItemStruct->itemState)
{
font.CreateFontW(0, 0, 0, 0, 400, NULL, NULL, NULL, DEFAULT_CHARSET, 0, 0, 0, 0, L"黑體");
pDC->SelectObject(&font);
pBrush.CreateSolidBrush(RGB(100, 149, 237));
}
else if (SwitchDlgMouseMoveState == 1)
{
font.CreateFontW(0, 0, 0, 0, 400, NULL, NULL, NULL, DEFAULT_CHARSET, 0, 0, 0, 0, L"黑體");
pDC->SelectObject(&font);
pBrush.CreateSolidBrush(RGB(30, 144, 255));
}
else
{
font.CreateFontW(0, 0, 0, 0, 400, NULL, NULL, NULL, DEFAULT_CHARSET, 0, 0, 0, 0, L"黑體");
pDC->SelectObject(&font);
pBrush.CreateSolidBrush(RGB(39, 58, 91));
}
//畫矩形
pDC->FillRect(drawRect, &pBrush);
//定義一個CRect用于繪制文本
CRect textRect;
//拷貝矩形區(qū)域
textRect.CopyRect(&drawRect);
//獲得字符串尺寸
CSize sz = pDC->GetTextExtent(btnCaption);
//調(diào)整文本位置 居中
textRect.top += (textRect.Height() - sz.cy) / 2;
//設(shè)置文本背景透明
pDC->SetBkMode(TRANSPARENT);
//設(shè)置文本顏色
pDC->SetTextColor(RGB(255, 255, 255));
//繪制文本內(nèi)容
pDC->DrawText(btnCaption, &textRect, DT_RIGHT | DT_CENTER | DT_BOTTOM);
}
//設(shè)置按鈕背景的顏色
void COwerButton::SetButtonBgColor(COLORREF color)
{
m_bgColor = color;
}
//設(shè)置按鈕字體的顏色
void COwerButton::SetButtonTextColor(COLORREF color)
{
m_textColor = color;
}
void COwerButton::OnMouseMove(UINT nFlags, CPoint point)
{
if (!m_bTracking)
{
TRACKMOUSEEVENT tme;
tme.cbSize = sizeof(tme);
tme.hwndTrack = m_hWnd;
SwitchDlgMouseMoveState = 1;
// 重畫按鈕
Invalidate(TRUE);
tme.dwFlags = TME_LEAVE | TME_HOVER;
tme.dwHoverTime = 1;
m_bTracking = _TrackMouseEvent(&tme);
}
CButton::OnMouseMove(nFlags, point);
}
LRESULT COwerButton::OnMouseLeave(WPARAM wParam, LPARAM lParam)
{
SwitchDlgMouseMoveState = 0;
m_bTracking = FALSE;
InvalidateRect(NULL, FALSE);
return 0;
}
- 給button按鈕添加變量,變量類型設(shè)為COwerButton,也可在主界面XXXDlg.h中修改button類型
COwerButton m_button1;文章來源地址http://www.zghlxwxcb.cn/news/detail-518096.html
- 運行完成,效果如下:
當鼠標移動到按鈕上以及點擊按鈕時按鈕顏色會發(fā)生變化:
到了這里,關(guān)于MFC重載CButton類,實現(xiàn)改變按鈕背景色、字體樣式更改、鼠標滑動按鈕變色功能的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!