方式一:适用于.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
效果图如下: