在本文中,我们将深入探讨如何在Microsoft Foundation Class (MFC) 库中使用PNG图像来创建具有透明效果的按钮,并且会提供一个基于VS2015的完整工程示例。MFC是Microsoft为Windows应用程序开发提供的C++类库,它简化了Windows API的使用,使得开发者能够更方便地构建桌面应用程序。 PNG(Portable Network Graphics)是一种支持透明度的位图格式,通过使用Alpha通道,可以实现半透明和完全透明的效果。在MFC应用中,我们通常使用CBitmap和CDC类来处理图像,但它们并不直接支持PNG的透明特性。因此,我们需要引入额外的库,如libpng或GDI+,来解析PNG文件并利用其透明度信息。 1. **libpng库集成**:在MFC项目中,首先需要链接libpng库。这通常涉及到下载libpng源码,编译为动态或静态库,然后将库文件添加到项目的链接器设置中。同时,还需将对应的头文件路径加入到项目配置中。 2. **解析PNG图像**:使用libpng库提供的API,例如`png_create_read_struct()`和`png_init_io()`,来初始化读取结构并设置输入流。接着调用`png_read_image()`和`png_read_end()`读取图像数据。 3. **创建设备上下文对象**:在MFC中,CDC类代表设备上下文,用于图形绘制。创建一个CDC实例,并使用`CreateCompatibleDC()`创建一个兼容的设备上下文,以便绘制到内存位图。 4. **加载PNG到内存位图**:利用libpng解析出的像素数据,创建一个CBitmap对象,并将其绑定到兼容设备上下文。这个过程可能需要一些转换,因为MFC的CBitmap不直接支持Alpha通道,所以可能需要手动处理Alpha值。 5. **处理按钮状态**:在MFC中,按钮的状态包括普通、鼠标悬停(高亮)和禁用(灰度)。对于高亮状态,可以创建一个CBrush对象,使用`SetBkColor()`设置为按钮的高亮颜色,然后使用`CreateHatchBrush()`创建一个刷子,绘制高亮效果。对于灰度效果,可以使用算法将RGB颜色转换为灰度。 6. **重绘按钮**:在OnPaint()函数中,创建一个PAINTSTRUCT结构,然后调用BeginPaint()和EndPaint()进行安全的绘画。使用SelectObject()选择CBitmap到兼容设备上下文,根据按钮状态选择合适的图像,然后使用DrawState()函数绘制按钮。DrawState()函数可以自动处理按钮的各种状态,如按下、鼠标悬停等。 7. **事件处理**:为按钮添加消息处理函数,例如ON_WM_LBUTTONDOWN()、ON_WM_LBUTTONUP()和ON_WM_MOUSEMOVE(),根据鼠标事件更新按钮状态。 8. **资源管理**:在程序运行结束后,记得释放所有分配的资源,如CBitmap、CDC和设备上下文。 在提供的"PNG透明按钮工程"压缩包中,应包含以下组件: - 工程文件(.vcxproj) - 源代码文件(.cpp和.h) - libpng库文件(.lib和.dll) - 示例PNG图像文件 - 资源文件(.rc) 通过阅读和分析这些文件,你可以理解如何在MFC中实现PNG透明按钮,并将其应用到自己的项目中。这个示例是一个很好的起点,展示了如何将现代图像格式与MFC的经典API结合,为Windows应用程序增添更多视觉吸引力。
2025-04-03 11:44:09 1.01MB
1
用C#语言开发玻璃按钮控件,美观实用,不可多得,内有详细控件代码
2023-09-12 06:28:49 257KB C# 玻璃 透明 按钮
1
之前上传的版本如果安装了DEV组件,则加载PNG图片时将会出错。感谢下载的网友指出的错误,因为本人上传之后一直未关注过评论,今天偶然发现,在此向各位致歉。 我在本机的XE版本下安装时好像不需要obj文件,但既然有网友指出,我就将d7目录下的obj拷贝了一份放在xe源码目录内。 该修改版本仅在D7和XE中测试。如果是其他版本,请自行修改。 安装说明参见压缩包内的reademe文件。 ---------------------------------------------------------- 针对XE版本增加的属性 如下: Anchors: TAnchors; //按钮相对位置 Action: TActionList; //与 actionlist 连接 CaptionAlign: TAlignment; //按钮标题对齐方式 //是否填充渐变色,取决于后两个变量 IsDrawGradientColorFace: Boolean; //是否以渐变色填充按钮表面 IsDrawFaceOnMouseOver: boolean; //鼠标悬停时是否填充按钮表面 IsDrawFaceOnPush: Boolean; //鼠标按下时是否填充按钮表面 //边框 IsDrawBorderOnMouseOver: Boolean; IsDrawBorderOnPush: Boolean; //悬停及按下时的渐变色设置 DrawOverFaceStartColor: TColor; //鼠标悬停时渐变填充起始色 DrawOverFaceEndColor: TColor; //鼠标悬停时渐变填充结束色 DrawPushFaceStartColor: TColor; DrawPushFaceEndColor: TColor; //按钮表面单色 DrawUniqueColorFaceOnMouseOver: TColor; //鼠标悬停时单色填充时的颜色 DrawUniqueFaceColorOnPush: TColor; //边框 DrawBorderOnMouseOver: TColor; //鼠标悬停时边框颜色 DrawBorderOnPush: TColor; IsShowCaption: boolean; //是否显示按钮文字 注:与颜色相关的属性仅在 buttonStyle 设为 pbsFlat 或 pbsNoFrame 时有效
2023-02-06 13:25:38 271KB pngButton 透明按钮
1
成功测试PNG button条件: 编程环境VS2010 GdipButton.h GdipButton.cpp CGdiPlusBitmap.h MemDC.h stdafx.h文件添加 #include #pragma comment(lib, "gdiplus.lib") using namespace Gdiplus; Cxx.h中(注意不是CxxDlg.h) public: ULONG_PTR m_gdiplusToken; Cxx.cpp中(注意不是CxxDlg.cpp) BOOL CTestGdipButtonApp::InitInstance() { Gdiplus::GdiplusStartupInput gdiplusStartupInput; Gdiplus::GdiplusStartup(&m_gdiplusToken, &gdiplusStartupInput, NULL); //省略 } int CTestGdipButtonApp::ExitInstance() { Gdiplus::GdiplusShutdown(m_gdiplusToken); return CWinApp::ExitInstance(); } 当然要CxxDlg.h先#include GdipButton.h 给任意一个button添加变量比如m_ButCtl,之后将变量类型改为CGdipButton 在想调用的任意位置写 m_ButCtl.LoadStdImage(IDR_PLAY, _T("PNG")); (其中IDR_PLAY是导入的png资源名字)
2022-11-10 18:43:16 8KB png按钮
1
透明窗体,透明叠加窗体,透明按钮,透明输入框。 vs2013.
2022-07-08 17:56:44 259KB 透明窗体 透明按钮 透明输入框
1
web100余种按钮样式png透明图标,单个文件,按钮用起来方便,web2.0按钮基本按钮都在里面。
2022-04-28 21:06:54 339KB 按钮png 网站按钮 按钮图标 透明按钮
1
对以前的透明按钮代码进行了全新整理,修正了多处错误。增加了初始化按钮背景透明度设置、提示文本,去掉了不必要的参数。
2022-03-13 20:11:20 1.05MB vb,gdi+
1
使用gdi+绘制的透明图片,使用的是png图片资源。 在MFC中使用gdi+库,代码附带gdi+库。代码简单实用
2021-12-27 09:58:49 202KB png gid+ MFC 透明按钮
1
WinCE自定义控件原代码 C# VS2008开发 有以下4个控件: MyButton 自定义绘制的按钮,圆角比之前的漂亮很多 MyImageButton 图片按钮。使用bmp图片可以设置透明 MyLabel 支持背景图片的Label MyPictureControl 用来设置图片。可使bmp图片透明
1
MFC透明按钮,基于Gdiplus,可以透过背景,采用双缓冲(无闪烁),经过优化,支持闪烁功能。上传资源为vs2008工程,此项目经过验证,支持从xp到win10各个操作系统。
2021-09-27 22:49:10 23.9MB MFC GDI CButton
1