使用GDI+创建具有透明PNG支持的自定义按钮

在Windows应用程序开发中,有时需要使用自定义按钮来提升用户界面的美观度。PNG格式因其支持透明度而成为制作高质量按钮的首选。然而,标准的Windows按钮控件并不直接支持PNG格式的图像。为了解决这个问题,可以利用GDI+库来创建一个自定义按钮类,该类能够加载并显示PNG图像,同时支持透明度。

GDI+是微软Windows SDK的一部分,它提供了丰富的图形和图像处理功能。在应用程序启动时,需要初始化GDI+。如果之前没有使用过GDI+,可以通过查看示例项目的源代码和阅读相关文章来开始。

特性

自定义按钮类提供了以下功能:

  • 灰度图像:当按钮处于禁用状态时,自动生成并显示灰度图像。
  • 高亮图像:当鼠标悬停在按钮边界上时,自动生成并显示高亮图像。
  • 可选图像:可以添加一个可选图像,该图像将在通过函数调用设置或按钮被点击且切换模式启用时显示。
  • 切换模式:启用后,按钮会在标准图像和可选图像之间切换。
  • 按下状态:当按钮被按下时,图像会向下和向右移动1像素。
  • 工具提示:可以添加可选的工具提示。

这些特性使得自定义按钮在不同状态下都能保持良好的视觉效果,同时保持图像质量。

使用代码

要使用这个自定义按钮类,需要按照以下步骤操作:

  1. 添加文件到项目:将GdipButton.h、GdipButton.cpp、MemDC.h和CGdiPlusBitmap.h文件添加到项目中。
  2. 添加资源、成员变量和图像:使用资源编辑器向对话框中添加按钮,设置资源ID,并清除Caption框中的文本。然后,使用类向导为刚刚创建的ID添加变量。
  3. 添加LoadStdImage()函数:在OnInitDialog()函数中加载图像到按钮。
  4. 构建和运行:现在应该能够运行程序并看到新PNG按钮。如果程序崩溃,可能是因为没有初始化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构建问题

// 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
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485