您的位置:首页 > 其它

创建支持更多图片格式的按钮 使用VC6和GDI+

2008-10-11 12:29 387 查看
在CSDN看到有人问支持更多图片格式按钮的帖子
觉得挺有意思 这几天接触了一下GDI+ 感觉可以实现 就动手试验了一下

还可以 有效果 呵呵
原来界面可以这样做的~~

我用的是PNG图片 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



鼠标悬停后 也就是切换一张图片显示

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: