使用GDI+创建支持更多图片格式的按钮
派生一个 CButtonEx类
重载 OnCreate 利用GDI+贴图到 按钮上
- int CButtonEx::OnCreate(LPCREATESTRUCT lpCreateStruct)
- {
- if (CButton::OnCreate(lpCreateStruct) == -1)
- return -1;
- CRect rc;
- GetClientRect(&rc);
- CDC dc;
- using namespace Gdiplus;//应用 GDI+前必须的设置
- Graphics graph(GetDC()->m_hDC);
- Image image(L"E:\\图片相关\\我的作品\\GDI+BUTTON.png");
- graph.DrawImage(&image,0,0,rc.right-rc.left,rc.bottom-rc.top);
- return 0;
- }
为了好一点的效果处理 MouseMove 和MouseLeave
- void CButtonEx::OnMouseMove(UINT nFlags, CPoint point)
- {
- CRect rc;
- GetClientRect(&rc);
- CDC dc;
- using namespace Gdiplus;//应用 GDI+前必须的设置
- Graphics graph(GetDC()->m_hDC);
- Image image(L"E:\\图片相关\\我的作品\\GDI+BUTTON2.png");
- graph.DrawImage(&image,0,0,rc.right-rc.left,rc.bottom-rc.top);
- TRACKMOUSEEVENT event ;
- event.cbSize = sizeof( event );
- event.dwFlags = TME_LEAVE ;
- event.dwHoverTime = 0 ;
- event.hwndTrack = GetSafeHwnd() ;
- VERIFY (_TrackMouseEvent( &event )) ;
- CButton::OnMouseMove(nFlags, point);
- }
- int CButtonEx::OnCreate(LPCREATESTRUCT lpCreateStruct)
- {
- if (CButton::OnCreate(lpCreateStruct) == -1)
- return -1;
- CRect rc;
- GetClientRect(&rc);
- CDC dc;
- using namespace Gdiplus;//应用 GDI+前必须的设置
- Graphics graph(GetDC()->m_hDC);
- Image image(L"E:\\图片相关\\我的作品\\GDI+BUTTON.png");
- graph.DrawImage(&image,0,0,rc.right-rc.left,rc.bottom-rc.top);
- return 0;
- }
- LRESULT CButtonEx::OnMouseLeave( WPARAM wParam , LPARAM lParam )
- {
- CRect rc;
- GetClientRect(&rc);
- CDC dc;
- using namespace Gdiplus;//应用 GDI+前必须的设置
- Graphics graph(GetDC()->m_hDC);
- Image image(L"E:\\图片相关\\我的作品\\GDI+BUTTON.png");
- graph.DrawImage(&image,0,0,rc.right-rc.left,rc.bottom-rc.top);
- return 1;
- }
其中MouseLeave函数要手动添加消息响应
- afx_msg LRESULT OnMouseLeave( WPARAM wParam , LPARAM lParam ) ;
- ON_MESSAGE( WM_MOUSELEAVE , OnMouseLeave )
如果是用VC直接添加的按钮要设置为 所有者绘制 样式
动态创建要加上 BS_OWNERDRAW 类型
重载DrawItem函数
- void CButtonEx::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
- {
- // TODO: Add your code to draw the specified item
- CRect rc;
- GetClientRect(&rc);
- CDC dc;
- using namespace Gdiplus;//应用 GDI+前必须的设置
- Graphics graph(GetDC()->m_hDC);
- USES_CONVERSION; // 很复杂的定义 头文件添加了#include "atlbase.h"
- wchar_t* TempBoardPath=A2W(m_ResoucePath);//CString 转 wchar_t
- if(m_ResoucePath.IsEmpty())
- {
- Image image(L"E:\\图片相关\\我的作品\\GDI+BUTTON 水晶1.png");
- graph.DrawImage(&image,0,0,rc.right-rc.left,rc.bottom-rc.top);
- }
- else
- {
- Image image(TempBoardPath);
- graph.DrawImage(&image,0,0,rc.right-rc.left,rc.bottom-rc.top);
- }
- }
再添加一个函数用来接收外部传来的资源
- void CButtonEx::SetResoucePath(CString path)
- {
- m_ResoucePath=path;
- }
在Dlg类初始化部分
用
- m_btnex.SetResoucePath("E:\\图片相关\\我的作品\\Recycle_bin_blue2.ico");
- m_btnex2.SetResoucePath("E:\\图片相关\\我的作品\\Recycle_bin_full.ico");
- m_btnex.Create(" ",BS_OWNERDRAW|WS_VISIBLE | WS_CHILD, CRect(0,0,50,50),this,11111);
- m_btnex2.Create(" ",BS_OWNERDRAW|WS_VISIBLE | WS_CHILD, CRect(0,50,50,100),this,11112);
OK 快点Create一个试试看~~
左上角那个是在初始化中动态创建的
中间的是用VC添加的控件
效果图1
鼠标悬停后 也就是切换一张图片显示
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步