使用带有按钮控件的PNG

Using PNGs with Button Controls

本文关键字:控件 PNG 按钮      更新时间:2023-10-16

我正试图在对话框(Visual Studio 2010 Professional)的按钮控件上呈现PNG。经过一些研究,我发现了以下适用于BMP文件的方法:

HBITMAP hBitmap = (HBITMAP) LoadImage(NULL, L"test.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
SendMessage(GetDlgItem(hDlg, IDC_BUTTON1), BM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hBitmap);

不过,这不适用于PNG文件。经过更多的研究,我发现使用GDI+有一种简单的方法:

HBITMAP hBitmap;
Gdiplus::Bitmap b(L"a.png");
b.GetHBITMAP(NULL, &hBitmap);
SendMessage(GetDlgItem(hDlg, IDC_BUTTON1), BM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hBitmap);

我没有在程序中的任何其他地方使用GDI+,但我仍然需要包括标题、链接到库并初始化它,以完成这个简单的任务。这么麻烦值得吗?有更标准的方法吗?

我计划在一个按钮上呈现多个PNG(有些是透明的)。

编辑:我用来创建HBITMAP的CreateDIBSectionFromBitmapSource()函数(稍作修改)可以在这里找到:

http://archive.msdn.microsoft.com/Project/Download/FileDownload.aspx?ProjectName=win7wicsamples&下载Id=7549

你能更具体一点吗?你的意思是在按钮控件上"渲染"PNG。。。

如果你的意思是你试图在按钮上粘贴一个.PNG图像,那么是的,有一个更简单的方法。只需单击按钮,然后转到属性菜单中的"外观"。单击"BackgroundImage",选择本地资源,然后浏览到图像并加载。完成。

如果这不是你想要做的,那么我可能建议研究

System.Drawing.Image和使用GDI+

实际上,我坐在这里学习GDI+。事先警告,这是一个半时间的学习。

GDI+是读取和呈现不同格式图像的标准方法。另一种方法是创建PNG解码器组件,从中获取流,并将其传递给LoadImage函数,这正是GDI+在后台为您所做的。图像格式编码器和解码器是窗口成像组件的一部分。

在解码和渲染如何执行多个图像取决于你在寻找什么,我不确定。让我只留下一些评论。您现在可以做的和正在做的(通过按钮的背景图像选项)是对图像进行一次解码,并将其保留为位图,因此当必须进行绘制时,位图已准备好,无需进行解码。这也是按钮的背景图像绘制的作用,按钮组件会保留您传递的位图句柄,并且每次重新绘制时都会绘制相同的位图句柄。我认为您不需要担心绘制位图的性能,因为它是使用Bitblt直接对显示设备进行绘制的。