0

我正在尝试在我的对话框(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&DownloadId=7549

4

2 回答 2

0

您能否通过在按钮控件上“渲染”PNG来更具体地说明您的意思...

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

如果这不是你的意思,那么我可能会建议研究

System.Drawing.Image 和使用 GDI+

当我们说话时,我实际上坐在这里学习 GDI+。请注意,这是一个半年的学习时间。

于 2012-11-16T04:55:04.977 回答
0

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

就如何对多个图像执行解码和渲染而言,这取决于您要查找的内容,我不确定。让我发表一些评论。您现在可以做的和正在做的(通过按钮的背景图像选项)是对图像进行一次解码并将它们保存为位图,因此当必须完成绘画时,位图已准备好并且不需要进行解码。这也是按钮的背景图像绘制所做的事情,按钮组件保留您传递的位图句柄,并且每次必须重新绘制时都会绘制相同的。我认为您不必担心绘制位图的性能,因为它是使用 Bitblt 直接在显示设备上完成的。

于 2012-11-16T05:38:56.040 回答