我正在尝试在对话框(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()函数可以在这里找到:
答案 0 :(得分:0)
你可以通过在按钮控件上“渲染”PNG来更具体地了解你的意思......
如果你的意思是试图在按钮上粘贴.PNG图像,那么是的,有一种更简单的方法。只需单击按钮,然后转到属性菜单中的“外观”。单击“BackgroundImage”,选择本地资源,然后浏览到该图像并加载它。完成。
如果这不是您的意思,那么我可能会建议进行研究
System.Drawing.Image并使用GDI +
我实际上坐在这里学习GDI +。预先警告,这是一个学习的时间。
答案 1 :(得分:0)
GDI +是以不同格式读取和渲染图像的标准方式。其他方法是创建PNG解码器组件并从中获取流并将其传递给LoadImage函数,这正是GDI +在后台为您所做的。图像格式编码器和解码器是窗口成像组件的一部分。
就多个图像的解码和渲染效果而言,取决于您所寻找的内容,我不确定。我只想留言。您现在可以做和正在做的事情(通过按钮的背景图像选项)是对图像进行一次解码并将它们保留为位图,因此在必须进行绘制时,位图已准备就绪,无需进行解码。这就是按钮的背景图像绘制也是如此,按钮组件保持您传递它的位图句柄,并且只需要每次重绘时都绘制相同的颜色。我不认为您需要担心绘制位图的性能,因为它是直接使用Bitblt到显示设备。