在Windows应用程序开发中,有时需要使用自定义按钮来提升用户界面的美观度。PNG格式因其支持透明度而成为制作高质量按钮的首选。然而,标准的Windows按钮控件并不直接支持PNG格式的图像。为了解决这个问题,可以利用GDI+库来创建一个自定义按钮类,该类能够加载并显示PNG图像,同时支持透明度。
GDI+是微软Windows SDK的一部分,它提供了丰富的图形和图像处理功能。在应用程序启动时,需要初始化GDI+。如果之前没有使用过GDI+,可以通过查看示例项目的源代码和阅读相关文章来开始。
自定义按钮类提供了以下功能:
这些特性使得自定义按钮在不同状态下都能保持良好的视觉效果,同时保持图像质量。
要使用这个自定义按钮类,需要按照以下步骤操作:
以下是创建测试程序中按钮所需的所有代码:
// 加载标准图像和可选图像
m_cPlay.LoadStdImage(IDR_PLAY, _T("PNG"));
m_cPlay.LoadAltImage(IDR_PAUSE, _T("PNG"));
m_cPlay.EnableToggle(TRUE);
// 仅显示高亮状态
m_cPlayHi.LoadStdImage(IDR_PLAY, _T("PNG"));
// 设置为禁用
m_cPlayDis.LoadStdImage(IDR_PLAY, _T("PNG"));
m_cPlayDis.EnableButton(FALSE);
// 显示更大的按钮类型
m_cGear.LoadStdImage(IDR_GEAR, _T("PNG"));
// 替换OK按钮
m_cShutDn.LoadStdImage(IDR_EXIT, _T("PNG"));
m_cShutDn.SetToolTipText(_T("关闭程序"));
按钮控件本身并不知道它下面的背景应该是什么;它从当前DC关联的位图中获取这个信息。在大多数情况下,这可以正常工作,背景就是控制被绘制之前屏幕上的内容。然而,当应用程序启动时,它可能不是最顶层的。一个始终位于顶部的应用程序,如任务管理器,可能会干扰,所以当它获取背景图像时,得到的数据是错误的。这可以通过调用SetBkGnd()函数来克服,该函数由实际创建背景的代码调用。
// VC6
#if defined(_MSC_VER) && _MSC_VER == 1200
#ifndef ULONG_PTR
#define ULONG_PTR unsigned long*
#endif
#include
#include
#pragma comment(lib, "gdiplus.lib")
using namespace Gdiplus;
// VS2005
#else
#include
#pragma comment(lib, "gdiplus.lib")
using namespace Gdiplus;
#endif