MFC 图片按钮的实现

tech2022-09-26  75

1.CBitmapButton 方式实现

在MFC工具栏,添加按钮到界面,然后会修改按钮的属性,设置Owner draw为true;

CBitmapButton只用于添加bmp位图,其他图片会有一些兼容性问题,不会显示出来。具体原因没有深究,有空可自行深入学习。

LoadBitmaps加载状态图片,注意顺序为Up,Down,Focused,Disabled。并且添加的位图id后缀必须也是对应 Up,Down,Focused,Disabled,方便LoadBitmaps导入,否则可能因此抛出异常。

这边使用 SubclassDlgItem 将 CBitmapButton 变量 m_bitmapbtn 绑定按钮ID。也可以通过在MFC操作界面,对按钮鼠标右键添加变量,并将变量类型将CButton修改为他的派生类CBitmapButton。

最后在对话框的OnInitDialog函数中添加如下代码,就可以实现图片按钮。

m_bitmapbtn.SubclassDlgItem(IDC_BTN_BMP, this); //CbitmapButton 变量绑定按钮 ​​​​​​​  m_bitmapbtn.LoadBitmaps(IDB_BITMAP_DOWN, IDB_BITMAP_UP);//为变量按钮添加bmp图片,LoadBitmaps加载状态图片,注意顺序为Up,Down,Focused,Disabled。     m_bitmapbtn.SizeToContent(); // 设置按钮适应图片大小

2.GDI+ 方式实现

这边使用了MFC Button 控件,属性设置,image type 设置为无,transparent设置为true(是否透明)

首先先添加对应的头文件和库到工程中,

#include <gdiplus.h> #pragma comment(lib, "gdiplus.lib") using namespace Gdiplus; #define ULONG_PTR ULONG

其次在对话框的OnInitDialog函数中添加如下代码,就可以实现图片按钮。

// GDI+ 重绘,实现图片按钮 // 绑定控件变量 m_pMfcButton = (CMFCButton *)GetDlgItem(IDC_MFCBTN1); m_pMfcButton->SetFaceColor(RGB(0, 0, 0), true); // 设置背景色 // 初始化GDI+ ULONG_PTR gdiplus_token = 0; Gdiplus::GdiplusStartupInput StartupInput; GdiplusStartup(&gdiplus_token, &StartupInput, NULL); // 读取图片 Gdiplus::Bitmap *bmBtn = Gdiplus::Bitmap::FromFile(L"res/a1.png"); Gdiplus::Bitmap *bmBtn2 = Gdiplus::Bitmap::FromFile(L"res/a2.png"); HBITMAP hBmp, hBmpHot; bmBtn->GetHBITMAP(NULL, &hBmp); bmBtn2->GetHBITMAP(NULL, &hBmpHot); m_pMfcButton->SetImage(hBmp, TRUE, hBmpHot); m_pMfcButton->m_bTransparent = TRUE; // 设置按钮为透明的 m_pMfcButton->SizeToContent(); // 去初始化 //Gdiplus::GdiplusShutdown(gdiplus_token);

 

3.CButtonST 方式实现

使用CButtonST时需要注意这个异常,也可能是我下载的版本有问题。因为Button控件,需要重绘,当按钮的属性设置Owner draw为true时程序会抛异常,所以我这边做了适当修改。

CButtonST和CBitmapButton有点类似,都是继承CButton做了新的封装,话不多说,直接上代码。

m_btnST.SetBitmaps(::LoadBitmap(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BITMAP_DOWN)), RGB(0xFF, 0x00, 0xFF));//为变量按钮添加bmp图片 //m_btnST.SetIcon(IDR_MAINFRAME); //为变量按钮添加ico图片 m_btnST.SetFlat(FALSE); //设置为平面按钮 m_btnST.SizeToContent();

最后,由于自己水平限制,也没有太多时间深究MFC这种比较古老的东西,在试了以上三种方式,效果都不是很理想,最后还是换成qt了项目。在这边也做了简单的整理希望给有用到这部分的人提供一些参考。

最后也给了整理上传的demo路径,1积分,可自行下载学习或留言(可能会很久很久以后才看到评论)。不喜勿碰,请略过。

下载地址:https://download.csdn.net/download/hallyz945/12803422

最新回复(0)