【MFC】Button控件美化(自绘)

这篇具有很好参考价值的文章主要介绍了【MFC】Button控件美化(自绘)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在MFC中Button控件不能通过OnCtlColor()函数对外观做太多的改变。

HBRUSH C按钮控件自绘Dlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
	HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);

	switch (pWnd->GetDlgCtrlID())
	{

	case IDC_BUTTON1:
	{
		pDC->SetBkMode(TRANSPARENT);
		pDC->SetBkColor(RGB(255, 0, 255));
		pDC->SetTextColor(RGB(255, 0, 0));
		static CBrush brush(RGB(255, 0, 255));
		return brush;
	}
	break;
	return hbr;
	}
}

欲设置按钮的背景为紫色,文字为红色,但是通过OnCtlColor()函数并不能实现预期的结果
【MFC】Button控件美化(自绘),MFC,mfc,c++
为了能够修改Button控件字体、字体大小、背景色、背景图片,需要对Button控件进行自绘。

设置Button控件的自绘属性

方法一:在资源视图中将所有者描述设置为true
【MFC】Button控件美化(自绘),MFC,mfc,c++
方法二:在OnInitDialog函数里给按钮添加BS_OWNERDRAW风格

GetDlgItem(IDC_BUTTON1)->ModifyStyle(0, BS_OWNERDRAW);

建立一个以CButton为基类的派生类并重载DrawItem()函数

【MFC】Button控件美化(自绘),MFC,mfc,c++
通过类向导添加DrawItem()函数
【MFC】Button控件美化(自绘),MFC,mfc,c++

为按钮添加关联变量

变量类型将CButton改成MyButton
【MFC】Button控件美化(自绘),MFC,mfc,c++

MyButton类的设计

#pragma once
#include <afxwin.h>
class MyButton :
    public CButton
{


public:
    virtual void DrawItem(LPDRAWITEMSTRUCT lpDIS);
public:
    //三种颜色分别为文字,Button Down的背景颜色,Button Up的背景颜色
    COLORREF m_TextColor, m_DownColor, m_UpColor;
    //Button Down的背景颜色,Button Up的背景颜色标志位
    bool bDownColor, bUpColor;
    //设置文字大小
    int nWordSize = 100;
    UINT    imageID;//记录图片ID
public:
    //设置Button Down的背景颜色
    void SetDownColor(COLORREF color);
    //设置Button Up的背景颜色
    void SetUpColor(COLORREF color);
    //设置背景图片
    void SetBkImage(UINT ID);
    //设置文字大小,默认为10号
    void SetWordSize(int wordsize);
    //设置文字颜色默认为黑色
    void SetWordColor(COLORREF wordColor);
    // 文字处理
    void SetWord(CRect rect, CDC* pDc, int size);
    //绘制背景图片
    void DrawBkImage(CRect rect, CDC* pDc, UINT ID);

};
#include "pch.h"
#include "MyButton.h"

void MyButton::SetDownColor(COLORREF color)
{
	m_DownColor = color;
	bDownColor = TRUE;//颜色是否设置标志位
}
void MyButton::SetUpColor(COLORREF color)
{
	m_UpColor = color;
	bUpColor = TRUE;
}
void MyButton::SetBkImage(UINT ID)
{
	imageID = ID;
}
void MyButton::SetWordSize(int wordsize)
{
	nWordSize = wordsize;
}
void MyButton::SetWordColor(COLORREF wordColor = RGB(255, 255, 255))
{
	m_TextColor = wordColor;
}
void MyButton::DrawBkImage(CRect rect, CDC* pDc, UINT ID)
{
	CDC   dcBmp;             //定义并创建一个内存设备环境
	dcBmp.CreateCompatibleDC(pDc);             //创建兼容性DC
	CBitmap   bmpBackground;
	bmpBackground.LoadBitmap(ID);    //载入资源中图片
	BITMAP   m_bitmap;                         //图片变量               
	bmpBackground.GetBitmap(&m_bitmap);       //将图片载入位图中
	//将位图选入临时内存设备环境
	CBitmap* pbmpOld = dcBmp.SelectObject(&bmpBackground);
	//调用函数显示图片StretchBlt显示形状可变
	pDc->SetStretchBltMode(HALFTONE);
	pDc->StretchBlt(rect.left, rect.top, rect.Width(), rect.Height(), &dcBmp, 0, 0, m_bitmap.bmWidth, m_bitmap.bmHeight, SRCCOPY);
}
// 文字处理
void MyButton::SetWord(CRect rect, CDC* pDc, int nWordSize)
{
	CString str;
	GetWindowText(str);//获取文字
	CFont font;
	font.CreatePointFont(nWordSize, L"仿宋");//设置控件文字大小与字体
	pDc->SelectObject(&font);
	pDc->SetTextColor(m_TextColor);//设置文字颜色
	// dc.SetBkColor(RGB(255, 0, 0));//设置文字背景颜色
	pDc->SetBkMode(TRANSPARENT);//设置文字背景透明
	pDc->DrawText(str, rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE | DT_TABSTOP);//绘制文字
}
void MyButton::DrawItem(LPDRAWITEMSTRUCT lpDIS)
{
	CDC dc;
	dc.Attach(lpDIS->hDC);//得到绘制的设备环境CDC
	dc.SelectStockObject(NULL_BRUSH);//按钮为默认颜色
	dc.Rectangle(&lpDIS->rcItem);//画出按钮框
	CString str;
	CRect rect = lpDIS->rcItem;
	GetClientRect(&rect);//得到客户端坐标 //ScreenToClient();将屏幕坐标转换为客户端坐标
	//加载背景图片,判断是否加载背景图片,没有则使用默认背景
	if (imageID != 0) DrawBkImage(rect, &dc, imageID);
	//按钮按下时改变背景色
	if (lpDIS->itemState & ODS_SELECTED)
	{
		if (bDownColor)
		{
			CBrush brush(m_DownColor);
			dc.FillRect(&(lpDIS->rcItem), &brush);//利用画刷brush,填充矩形框
		}
	}
	else//当按钮不操作或者弹起时改变背景色
	{
		if (bUpColor)
		{
			CBrush brush(m_UpColor);
			dc.FillRect(&(lpDIS->rcItem), &brush);//利用画刷brush,填充矩形框
		}
	}
	//文字处理(绘制文字)
	SetWord(rect, &dc, nWordSize);
	dc.Detach();
}

效果

/*放在OnInitDialog函数或OnPaint函数里*/

m_button1.SetUpColor(RGB(255, 0, 0));
m_button1.SetDownColor(RGB(0, 0, 255));

【MFC】Button控件美化(自绘),MFC,mfc,c++
如果要在按钮上显示图片,不要设置按钮按下和弹起的颜色,这会覆盖图片

void C按钮控件自绘Dlg::OnPaint()
{
	CPaintDC dc(this);
	CRect rect;
	GetDlgItem(IDC_BUTTON1)->GetWindowRect(&rect);//获取控件的屏幕坐标
	ScreenToClient(&rect);//转换为窗口的的客户区坐标
	m_button1.SetBkImage(IDB_BITMAP1);
	m_button1.DrawBkImage(rect, &dc, IDB_BITMAP1); 
}

【MFC】Button控件美化(自绘),MFC,mfc,c++
这个时候点击按钮并没有什么变化(这里指视觉上的变化,消息还是有的)
那么可以在DrawItem()函数里添加一些功能,比如按钮按下的时候绘制边框,弹起时销毁边框

if ((lpDIS->itemState & ODS_SELECTED) && (lpDIS->itemAction & (ODA_SELECT | ODA_DRAWENTIRE)))
	{
		//设置按钮边框颜色为蓝色
		COLORREF color = RGB(0, 0, 255);
		CBrush brush(color);
		dc.FrameRect(&(lpDIS->rcItem), &brush);//用画刷brush,填充矩形边框
	}
	//控制的选中状态结束,去掉边框
if (!(lpDIS->itemState & ODS_SELECTED) && (lpDIS->itemAction & ODA_SELECT))
	{
		CBrush brush(m_UpColor);
		dc.FrameRect(&lpDIS->rcItem, &brush);
	}

LPDRAWITEMSTRUCT结构体
【MFC】Button控件美化(自绘),MFC,mfc,c++
【MFC】Button控件美化(自绘),MFC,mfc,c++文章来源地址https://www.toymoban.com/news/detail-704143.html

到了这里,关于【MFC】Button控件美化(自绘)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MFC Tab 控件使用

      接下来两步,每个子对话框都要操作:    TCN_SELCHANGE 消息处理函数中添加代码如下:

    2024年02月08日
    浏览(29)
  • MFC自定义控件使用

    用VS2005新建一个MFC项目,添加一个Custom Control控件在窗体 我们需要为自定义控件添加一个类。项目,添加类,MFC类 设置类名字,基类为CWnd,你也可以选择CDialog作为基类 类创建完成后,在它的构造函数中注册一个新的自定义窗体,取名为\\\"MyWindowClass\\\"

    2024年02月15日
    浏览(59)
  • MFC自定义控件ID操作————MFC+Halcon学习中的那些坑

    趁着大三寒假抓紧学习halcon与mfc,为未来职业发展做准备,今天和大家分享一个我在学习mfc与halcon过程中踩到的坑,足足困扰了我半天.... 程序很简单..就是在halcon中读取摄像头,并且用mfc开发一个简单的界面,将视频显示出来,完成体内容如下 发现这个图片控件的ID有些奇怪

    2024年02月05日
    浏览(26)
  • MFC 自定义控件添加 tip

    一、要求 1. 自定义 tip 提示并实时提示,跟随鼠标移动 2. 避免重复刷导致 tip 闪烁 3. picture 控件添加自定义变量 二、tip 涉及 2.1 CMFCToolTipCtrl、CMFCToolTipInfo - 示例:https://www.cnblogs.com/kuaixue/p/13723093.html 2.2 CToolTipCtrl - 示例:https://www.cnblogs.com/htj10/p/11704225.html 三、分析 3.1 对操作

    2024年01月18日
    浏览(30)
  • MFC 更改控件的大小和位置

    获取当前主窗体的位置rect 获取某一个控件当前的位置 修改位置 移动位置

    2024年02月09日
    浏览(28)
  • MFC创建和使用OCX控件

    2024年02月13日
    浏览(32)
  • MFC 与 QT“常用控件”对比

    1、 常用控件 MFC QT 1.静态文本框/标签 CStatic QLabel 按钮 CButton包含了 3种样式 的按钮,Push Button,Check Box,Radio Box 4种不同的类 2.按钮:推动按钮 Push Button(同一个类CButton) QPushButton 3.按钮:单选按钮 Radio Box(同一个类CButton) QRadioButton 4.按钮:复现框 Check Box(同一个类CButton) Qcheck

    2024年02月09日
    浏览(28)
  • MFC为控件添加背景图片

    1、 添加选择Bitmap导入图片,图片文件最好放在项目res目录中,同时是BMP格式。上传后的图片在资源视图,命名为IDB_BITMAP_M_BACK。 2、在cpp的C***Dlg::OnPaint()函数下添加如下代码 如果是主程序的cpp文件中已有OnPaint函数,则修改else部分代码: 运行效果:

    2024年02月12日
    浏览(40)
  • MFC - 控件的消息和控件的事件(命令)有什么区别?

    MFC的控件都能添加事件处理程序( 类向导称事件为命令 ) 控件的 消息 和控件的**事件(命令)**有什么区别? 事件 可能由多个消息组成, 事件是消息的封装 。控件的事件也是通过消息机制来处理的,所以这两者在 本质上是一样的。函数本身没什么太大区别只不过函数的

    2023年04月13日
    浏览(24)
  • MFC 对话框与控件的使用

    1、 熟悉 Windows 对话框应用程序开发的基本过程; 2、 学习标准控件的使用; 3、 学些 CommonDialog ActiveX 控件的使用; 4、 练习较复杂的交互式操作的控制流程; 5、 练习文件输入/输出流的使用。 实现一个具有一定实用价值的通讯录程序设计。界面如图所示 ①界面的基本设计

    2024年02月05日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包