【问题标题】:Using PNGs with Button Controls使用带有按钮控件的 PNG
【发布时间】:2012-11-04 19:41:20
【问题描述】:

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

【问题讨论】:

    标签: c++ visual-studio-2010 button gdi+ direct2d


    【解决方案1】:

    您能否更具体地了解您的意思是在按钮控件上“渲染”PNG...

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

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

    System.Drawing.Image 和使用 GDI+

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

    【讨论】:

    • 是的,我的意思是在按钮上粘贴 PNG 图像。我在属性菜单的外观下看不到 BackgroundImage。这是否适用于使用 VS 资源编辑器的 C++ 应用程序?
    • 显然,System.Drawing.Image 是 .net 的东西,但你想要原生 C++,对吧?
    • 完全是我的错。我在问题中看到了 VS2010 和 GDI+,并假设他使用的是 C#。
    • 对不起,我忘了在帖子中提到这一点(底部只有一个很小的 ​​C++ 标签)。但是,是的,我正在寻找本机 C++ 解决方案。如果您认为可以提供帮助,请查看我对 nanda 的回复,了解我的问题的当前状态。
    【解决方案2】:

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

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

    【讨论】:

    • 我使用 WIC 将 PNG 显示在按钮上。具体来说,我正在使用 MSDN 示例项目中的 CreateDIBSectionFromBitmapSource() 函数来创建 HBITMAP。我唯一的问题是,如何使用透明度在按钮上显示多个 PNG 图像?我想在启用透明度的按钮上循环显示多个 PNG。这可能吗?请记住,我对这个特定的编程领域很陌生。 :)
    • 编辑了我的原始帖子,以包含一个指向 MSDN 项目的链接,其中包含我用来创建位图的 CreateDIBSectionFromBitmapSource() 函数。
    猜你喜欢
    • 1970-01-01
    • 2013-12-22
    • 2013-02-07
    • 2015-02-24
    • 1970-01-01
    • 2011-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多