当前位置: 首页> 健康> 母婴 > 贴图法美化Button按钮

贴图法美化Button按钮

时间:2025/7/11 7:54:07来源:https://blog.csdn.net/m0_53485135/article/details/139809119 浏览次数:0次

贴图法美化Button按钮

项目是在下面这篇文章里的基础上进行美化的:MFC实现INI配置文件的读取

1. 初始效果

image

2.最终效果

image

3. 增加 CImgButton 类

image

1.1 ImgButton.h 头文件

#pragma once
// CImgButtonclass CImgButton : public CBitmapButton
{DECLARE_DYNAMIC(CImgButton)
public:CImgButton();virtual ~CImgButton();protected:DECLARE_MESSAGE_MAP()
public:COLORREF TextColor; void SetTextColor(COLORREF crColor); virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
};

1.2 ImgButton.cpp 文件

// ImgButton.cpp : 实现文件
#include "stdafx.h"
#include "READINI.h"
#include "ImgButton.h"
// CImgButton
IMPLEMENT_DYNAMIC(CImgButton, CBitmapButton)
CImgButton::CImgButton()
{
}CImgButton::~CImgButton()
{
}BEGIN_MESSAGE_MAP(CImgButton, CBitmapButton)
END_MESSAGE_MAP()// CImgButton 消息处理程序
void CImgButton::SetTextColor(COLORREF crColor) 
{ TextColor = crColor; 
} 
void CImgButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{// 获取按钮的矩形区域CRect rect = lpDrawItemStruct->rcItem;// 从 lpDrawItemStruct 中获取设备上下文指针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);// 设置按钮背景颜色pDC->FillSolidRect(&rect, ::GetSysColor(COLOR_3DFACE));// 获取按钮位图BITMAP bmp;m_bitmap.GetBitmap(&bmp);// 创建内存DC,并选择位图CDC memDC;memDC.CreateCompatibleDC(pDC);CBitmap* pOldBitmap = memDC.SelectObject(&m_bitmap);// 调整位图大小以适应按钮大小pDC->StretchBlt(0, 0, rect.Width(), rect.Height(), &memDC, 0, 0, bmp.bmWidth, bmp.bmHeight, SRCCOPY);// 恢复原位图memDC.SelectObject(pOldBitmap);// 设置文本颜色pDC->SetTextColor(TextColor);// 如果按钮有文本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);}else // 否则,绘制正常状态的文本{pDC->DrawState(pt, szExtent, strText, DSS_NORMAL, TRUE, 0, (HBRUSH)NULL);}// 恢复旧字体pDC->SelectObject(hOldFont);// 恢复背景模式pDC->SetBkMode(nMode);}// 恢复设备上下文状态pDC->RestoreDC(nSaveDC);
}

4. 修改按钮的 Owner Draw 属性

image

5. 在资源视图中增加位图

在项目文件中新建一个文件存放位图资源,名字随意。笔者这里是 Extern

image

image

image

导入刚刚存放位图资源的文件夹,因为这里图片资源少,所以位图名字改不改都行

image

6. 在 READINIDlg.h 增加声明

// READINIDlg.h : 头文件
。。。。。。
public:CImgButton m_BitmapButton;CImgButton m_SelectButton, m_FreshButton, m_ShowButton, m_GetButton, m_WriteButton;

7. 修改READINIDlg.cpp文件

每一个 Button 控件对应一个上面声明的成员函数

void CREADINIDlg::DoDataExchange(CDataExchange* pDX)
{CDialog::DoDataExchange(pDX);。。。。。。DDX_Control(pDX, IDC_SELECT_FILE_BUTTON, m_SelectButton);DDX_Control(pDX, IDC_FLUSH_BUTTON, m_FreshButton);DDX_Control(pDX, IDC_SHOW_INI_BUTTON, m_ShowButton);DDX_Control(pDX, IDC_GET_BUTTON, m_GetButton);DDX_Control(pDX, IDC_WRITE_BUTTON, m_WriteButton);。。。。。。
}
BOOL CREADINIDlg::OnInitDialog()
{CDialog::OnInitDialog();。。。。。。// TODO: 在此添加额外的初始化代码m_SelectButton.LoadBitmaps(IDB_BITMAP1, IDB_BITMAP2);m_SelectButton.SetTextColor(RGB(0,0,0));m_FreshButton.LoadBitmaps(IDB_BITMAP1, IDB_BITMAP2);m_FreshButton.SetTextColor(RGB(0,0,0));m_ShowButton.LoadBitmaps(IDB_BITMAP1, IDB_BITMAP2);m_ShowButton.SetTextColor(RGB(0,0,0));m_GetButton.LoadBitmaps(IDB_BITMAP1, IDB_BITMAP2);m_GetButton.SetTextColor(RGB(0,0,0));m_WriteButton.LoadBitmaps(IDB_BITMAP1, IDB_BITMAP2);m_WriteButton.SetTextColor(RGB(0,0,0));return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}
关键字:贴图法美化Button按钮

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: