MFC设置按钮图标

方式一:适用于.bmp格式图片(CBitmapButton+bmp图片)

原文内容如下:
1、在资源编辑的时候选中按钮的 Owner draw 即可,不需要选择 Bitmap 属性. 
2、在程序中定义一个CBitmapButton成员变量。
 不能使用ClassWizard为按钮映射一个CButton变量,然后改为CBitmapButton,
 这么做并不能将按钮直接映射为CBitmapButton类的对象,反而会出现初始化错误。 
3-1、使用CBitmapButton::LoadBitmaps装载各种状态的图片,
 使用SubclassDlgItem关联到想要的按钮,
 使用CBitmapButton::SizeToContent函数使按钮适合图片大小。
 注意Loadbitmaps一定要在关联到按钮之前进行! 
3-2、或者是使用CBitmapButton::AutoLoad函数关联到想要的按钮。需要注意:
 A、之前不能使用CBitmapButton::LoadBitmaps装载各种状态的图片,否则会出错。
 B、AutoLoad函数完成的关联和改变按钮大小的CBitmapButton::SizeToContent函数的功能。
 C、CBitmapButton::AutoLoad使用的位图是默认资源ID的,
  即它会自动装载相关资源位图。
  位图的资源ID格式为:
  "按钮Caption+U"、"按钮Caption+D"、"按钮Caption+F"、"按钮Caption+X",
  分别代表Up、Down、Focus、Disable状态。
  如资源编辑时,希望关联的按钮的Caption为Test,
  那么其默认装载的位图资源的ID为:"TestU"/"TestD"/"TestF"/"TestX",
  注意分号""也是其ID的一部分。
 
 
总算做出来了
原来是这样

首先,你得选中按钮的owner Draw属性,在资源中加载两副*.bmp格式的位图,然后在你的对话框类中加入:
CBitmapButton m_btnX1;//必须放在函数外面才能正常实现

BOOL CXXXXXXX::OnInitDialog()
{
CDialog::OnInitDialog();

m_btnX1.LoadBitmaps(IDB_XXXX_UP,IDB_XXXX_DOWN);//这里是两副位图,鼠标按下和弹起,
                                              //  也可以只加一个ID资源;
m_btnX1.SubclassDlgItem(IDC_DASEN_X1,this);
m_btnX1.SizeToContent();
}

效果图如下:(仅显示图片)

 

方式二:适用于.bmp格式图片(CMyBitmapButton+bmp图片)

MFC 自定义按钮实现文字和图片同时显示效果_PJ-CSDN博客

原文内容如下:

添加类CImgButton,继承自CBitmapButton。选择CImgButton类的property,通过重载DrawItem(不是Message下的WM_DRAWITEM,其响应函数OnDrawItem不会被调用。),实现在bitmap上写入文字的功能。
.h文件代码

#pragma once
#include <afxext.h>
class CImgButton :
    public CBitmapButton
{
    //DECLARE_DYNAMIC(CImgButton)

public:
    CImgButton();
    virtual ~CImgButton();

protected:
    //DECLARE_MESSAGE_MAP()
    public:
    
public:
    COLORREF TextColor;
    void SetTextColor(COLORREF crColor);    
    virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
};


.cpp文件代码

#include "stdafx.h"
#include "ImgButton.h"


CImgButton::CImgButton()
{
}


CImgButton::~CImgButton()
{
}

// BEGIN_MESSAGE_MAP(CImgButton, CBitmapButton)
// END_MESSAGE_MAP()

void CImgButton::SetTextColor(COLORREF crColor)
{
    TextColor = crColor;
}

void CImgButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
    CRect rect = lpDrawItemStruct->rcItem;
    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);

    CBitmapButton::DrawItem(lpDrawItemStruct);

    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);
}

最后在调用验证效果:
1)在dialog中拖入一个button,设置ownerdraw。
2)装载需要的位图资源。
3)对话框头文件中

 #include "ImgButton.h" 
 .......
 .......
 CImgButton m_cImgBtn;
 .......

4)对话框cpp中进行初始化

m_cImgBtn.SubclassDlgItem(IDC_BUTTON5, this);
m_cImgBtn.LoadBitmaps(IDB_BTNLONGU, IDB_BTNLONGD, IDB_BTNLONGU);
m_cImgBtn.SizeToContent();  
m_cImgBtn.SetTextColor(RGB(0,0,0));

 效果图如下:(显示图片和文字,文字在图片之上)

方式三:适用于.ico格式图片(CButton+icon图片)

在MFC中给按钮添加图标_sywcxx的成长空间-CSDN博客

原文内容如下:

在MFC中的按钮,本身只有文字,比较简单,现在想实现在按钮上添加图标(.ico格式)的效果。如果想改变窗体的Icon利用的是SetIcon函数,而SetIcon函数其实是CWnd的成员函数。而CButton也是一种窗口,即继承自CWnd,所以Button也可以利用这个函数来实现自定义的图标。
1、引入Icon资源。
    将后缀为.ico的图标资源添加进工程里,记录资源号,如IDI_ICON1。
2、给要添加图标的Button绑定控件变量
    类型选择Control,名称可以取为m_BtnTest。
3、修改对话框的初始化函 数 OnInitDialog
    在OnInitDialog函数中,添加如下代码:
HICON m_IconBtn=AfxGetApp()->LoadIcon(IDI_ICON1);//导入Icon资源,利用m_hIconBtn来存储句柄。
 
  m_BtnTest.SetIcon(m_IconBtn); 
    经过以上三步,就可以实现按钮上同时显示文字和图标的效果。

参考资料:
1、 MFC中为按钮添加图片,图标
http://blog.csdn.net/popstars5207/article/details/7408694

效果图如下: 

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值