使用带有按钮控件的PNG
Using PNGs with Button Controls
我正试图在对话框(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直接对显示设备进行绘制的。
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- WinAPI 在单击第一个对话框上的按钮控件并销毁第一个对话框后创建第二个对话框
- 在编译时,C++项目抛出错误 C2228,这是预期的,因为控件在运行时未达到该点
- 如何更改窗体上所有控件的标题?[C++生成器]
- 双击更改 mfc 中列表控件中的行的颜色
- 派生的 wxPanel 控件如何访问其中包含 wxDialog 中的数据?
- 如何从代码本身向 wxwidgets 中的文本控件插入字符?
- 如何在MFC中的静态文本控件上插入图标?
- 我的主窗口在创建时或单击更新区域时是否会收到编辑控件?
- 如何在Qt C++中向自定义控件添加属性?
- C/C++ 检测双击 TVItem 的常用控件
- 从C++标头中导入常量而不是硬编码它们:扩展 .net 控件?
- 控件不会在选择函数旁边移动
- MFC:我们能否扩展CEditView中存在的CEdit控件类行为
- 通过嵌入式 IWebBrowser2 控件中的链接打开 youtube 搜索失败
- 查找素数:错误:控件到达非void函数的末尾
- C++ 获取"控件可能会到达约翰逊-特罗特代码上的非空函数的末尾
- C++WIN32-将RTF数据加载到Rich Edit控件
- 由非托管(C++)COM服务器实例化的托管(C#)控件在Windows更新后损坏
- 使用带有按钮控件的PNG