PNG透明窗体全攻略(控件不透明)vc++程序指导

2023-11-07

这两天在研究透明窗体,总算略有小成。网上大部分文章都是介绍到把窗体弄透明就没有下文。其实窗体透明并不难,难就难在透明的窗体上还要放控件。今 天我就把窗体透明一直到控件不透明怎么制作一块给写了吧。先截张图诱惑下你们,如果你没兴趣就没必要再看下文了,有兴趣的话就继续往下看吧^_^!

‍看好了,这是XP系统,未装.net。我的Photoshop学的不太好,把玻璃片弄的太透了些,如果你们有好的美术,再加上这种技术,肯定会如 鱼得水。下面就来详细说说它的制作过程吧:

     第 一步:在VC6中使用GDI+:你得从网上弄个GDI+ for XP的库,大约500K。如果找不到的话,找我QQ要吧,我会把这个窗口的源程序一起发给你的。把它解压后,将所有文件还包括子目录中的文件复制到你的项 目目录。在stdafx.h中加入以下代码:

#include "gdiplus.h" 请修改为你的头文件路径

using namespace Gdiplus;

#pragma comment(lib, "gdiplus.lib") 请修改为你的.lib文件路径

     我的项目名为Test,所以在TestApp中加入全局变量

ULONG_PTR gdiplusToken;

     在BOOL CTestApp::InitInstance()中加入这两行:

GdiplusStartupInput gdiplusStartupInput;

GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

     记住在线程退出后要御掉GDI+,它很占资源的,在int CTestApp::ExitInstance() 中加入这行:

GdiplusShutdown(gdiplusToken);

     一切准备工作就绪,开始制作窗口了。

     二、制作PNG图像:这不是程序员的事,是美工的事,可是目前美术技术都是我一人,所以干脆连PNG一起教你们做了吧。

     先打开Photoshop(简称PS),打开一张背景图,在背景图上使用圆角矩形工具‍画个矩型,再用图层样式调出如下绿色玻璃片:

‍什么?怎么个调出来的?你还真以为我什么都教你?要是我连PS的过程都写上来,那我干脆写本书得了。体谅一下吧,写教程是需要大量时间的,所以能 省则省。

     将背景去掉,将玻璃保存成PNG图片,不需要设置任何参数,PNG是自动使用这种与背景溶合透明的,强大吧^_^! ‍再用同样的方法,制作绿色按钮‍,记住做界面的时候,一般要使用一种主色调,在这里我随便用了下绿色作为主色调,现在网络流行的是蓝色。文字则不能用RGB色彩,这样用户容易产生视觉疲 劳。我做这个界面只是想试试绿玻璃好不好看,结果觉得不怎么好看,以后有空再弄个蓝玻璃试试吧。

     按钮不需要保存成PNG,因为我不准备将它透明。至于这种“透明控件”的文章,你在网上一搜一大堆。

     继续吧!还要做其它3个按钮,“确定”的按下效果,“取消”的拾起和按下效果,在这里我就不截图了。

     美术都搞定,开始写代码。

     三、写代码之前,我先说说工序:先用SetWindowLong将对话框设置成层级窗体,再使用GDI+显示图片。显示成功后再用 UpdateLayeredWindow函数进行透明处理。

     现在问题出来了,你会发现你原来在窗口上画的控件一概不显示,怎么办呢?我是在这个窗口上再盖上另一个对话框,设置成启动窗体那种样式,所有消息 都在这个前景窗体上处理。

     问题又来了,前景窗体盖上去,后面窗口又看不见了,怎么办呢?我又想了办法,在前景窗体加了透明色,在这里我是用粉红色,因为在电脑中粉红色用的 最少,因为它很刺眼。用这个方法的缺点就是你的控件不能有粉红色。

     最后将两个按钮改成位图按钮即可。

     现在来看详细制作过程吧:

     定义成员变量:在TestDlg.h中定义

BLENDFUNCTION m_Blend;

HDC m_hdcMemory;

     改成层级窗体:在BOOL CTestDlg::OnInitDialog()函数中加入如下代码:

//窗体样式为0x80000为层级窗体

DWORD dwExStyle=GetWindowLong(m_hWnd,GWL_EXSTYLE);

SetWindowLong(m_hWnd,GWL_EXSTYLE,dwExStyle^0x80000);

     加载PNG图片:

//绘制内存位图

HDC hdcTemp=GetDC()->m_hDC;

m_hdcMemory=CreateCompatibleDC(hdcTemp);

HBITMAP hBitMap=CreateCompatibleBitmap(hdcTemp,500,500);

SelectObject(m_hdcMemory,hBitMap);

//使用GDI+载入PNG图片

HDC hdcScreen=::GetDC (m_hWnd);

RECT rct;

GetWindowRect(&rct);

POINT ptWinPos={rct.left,rct.top};

Graphics graph(m_hdcMemory);   //GDI+中的类

Image image(L"bk.png",TRUE);   //GDI+中的类

graph.DrawImage(&image,0,0,267,154); //后面两个参数要设置成跟图片一样大小,否则会失真

     窗口透明贴图:

//使用UpdateLayerWindow进行窗口透明处理

HMODULE hFuncInst=LoadLibrary("User32.DLL");

typedef BOOL (WINAPI *MYFUNC)(HWND,HDC,POINT*,SIZE*,HDC,POINT*,COLORREF,BLENDFUNCTION*,DWORD);          

MYFUNC UpdateLayeredWindow;

UpdateLayeredWindow=(MYFUNC)GetProcAddress(hFuncInst,"UpdateLayeredWindow");

SIZE sizeWindow={267,154};

POINT ptSrc={0,0};

UpdateLayeredWindow( m_hWnd,hdcScreen,&ptWinPos,&sizeWindow,m_hdcMemory,&ptSrc,0,&m_Blend,2);

     使用上述代码后,运行程序,你会发现你的窗口已经是透明的了,下面进行控件处理:

     四、前景窗体

     新建对话框,画上控件,我在这里起名为COnWindow,随便起的,不要笑我^_^。

读者奇怪的是,这上面怎么没有“用户名、密码”两个Label控件?不好意思,因为我的玻璃做的太透,这些文字在玻璃上已经很难看清楚,所以我干 脆用PS描了下边,直接画到前景上去了,就成了这种效果

‍,忽优了你们一下,不好意思,快去画吧^_^。

  

     定义成员变量:在OnWindow.h中定义:

CBrush m_brush;   //背景画刷

CBitmapButton m_ok;

CBitmapButton m_cancel;

     设置画笔:在在BOOL COnWindow::OnInitDialog()加入一行:

   m_brush.CreateSolidBrush(RGB(255,0,255));   //背景设置为粉红色

     改为层级窗体:

//SetWindowsLong将窗体设置为层级窗体

DWORD dwExStyle=GetWindowLong(m_hWnd,GWL_EXSTYLE);

SetWindowLong(m_hWnd,GWL_EXSTYLE,dwExStyle|0x80000);

     设置透明色:

//用SetLayeredWindowAttributes设置透明色为0,它比UpdateLayeredWindow的使用要简单些

HMODULE hInst=LoadLibrary("User32.DLL");

typedef BOOL (WINAPI *MYFUNC)(HWND,COLORREF,BYTE,DWORD);

MYFUNC SetLayeredWindowAttributes = NULL;

SetLayeredWindowAttributes=(MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes");

SetLayeredWindowAttributes(this->GetSafeHwnd(),0xff00ff,0,1);

FreeLibrary(hInst);

     不要忘记把窗体前景刷成粉红色:在HBRUSH COnWindow::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 消息映射函数中加入代码:

HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

// TODO: Change any attributes of the DC here

if(nCtlColor=CTLCOLOR_DLG)

   return m_brush;

return   CDialog::OnCtlColor(pDC,   pWnd,   nCtlColor);  

     现在要把前景窗体和背景窗体联动,这可是关键点:

     把 前景窗体设置成启动窗体,无标题栏,样式为Popup弹出式。写到这里,我不得不说的是:我曾想把前景窗体设置成Child,发现前景窗体又被“透明”掉 了,什么都看不见,郁闷呀,所以只好用OnMove消息来设计窗体同步了。如果有对窗体机制比较熟悉的高手朋友,希望帮助我用更好的解决方法。

     组合窗口,并保持联动:

     在TestDlg.h中加入头文件:#include "OnWindow.h",再定义变量COnWindow *pChildWnd;

     在void CTestDlg::OnMove(int x, int y) 加入如下代码,看清楚了,这里是CTestDlg透明窗口。矩形的坐标运算你可以自己修改,关键要跟背景对齐:

CDialog::OnMove(x, y);

// TODO: Add your message handler code here

CRect rcWindow;                   // 使用MoveWindow函数的示例

GetWindowRect(rcWindow);

rcWindow.bottom-=10;

rcWindow.left+=10;

rcWindow.right-=10;

rcWindow.top+=20;

pChildWnd->MoveWindow(&rcWindow);

     创建窗体时:在int CTestDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) 加入如下代码:

//创建子窗体

pChildWnd=new COnWindow(this);

pChildWnd->Create(IDD_ONWINDOW_DIALOG);

pChildWnd->ShowWindow(SW_SHOW);

     你现在看到窗体上没有标题栏吧?你把鼠标移到窗口顶部,还可以照样移动窗口,知道为什么吗?因为窗口虽然透明了,但是背景窗口的任何控件都是存在 的,只是不显示,它还能照样响应事件,不信你在背景窗口上放上个按钮试试。不错吧?又省掉一些代码。

     五、最后,我们来处理位图按钮:VC6的CBitmapButton::LoadBitmaps方法不能直接贴上16位真彩按钮,于是我将两个真 彩色按钮用Acdsee32转换成256色的,就可以直接载入了,相信你们也没看出来吧?

     处理成256色后,再在BOOL COnWindow::OnInitDialog() 写入代码:

//载入按钮位图

m_ok.LoadBitmaps(IDB_OK1,IDB_OK2);

m_cancel.LoadBitmaps(IDB_CANCEL1,IDB_CANCEL2);

m_ok.SubclassDlgItem(IDOK, this);

m_cancel.SubclassDlgItem(IDCANCEL, this);

     现在按下按钮只能关闭自己,给父窗口发个消息吧:在void COnWindow::OnOK()和void COnWindow::OnCancel() 都加入代码:

HWND hWnd=GetParent()->m_hWnd;

::SendMessage(hWnd,WM_CLOSE,0,0);

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PNG透明窗体全攻略(控件不透明)vc++程序指导 的相关文章

  • 从 Visual Studio 运行时,STARTUPINFO.wShowWindow 为 0

    我在调试名为 Notepad2 的开源记事本替代品中的功能时偶然发现了一个问题 更具体地说 是一个名为 Notepad2 的更新版本 Notepad2 mod https github com XhmikosR notepad2 mod 它
  • SetForegroundWindow 不适用于最小化进程[重复]

    这个问题在这里已经有答案了 找不到关于这个主题的任何好的答案 所以也许有人可以帮助我 我正在制作一个小型个人程序 我想将某个应用程序带到前台 它已经可以工作了 但是有一个小问题 当进程最小化时 我的代码将无法工作 该进程不会像未最小化时那样
  • 如何在 Windows 10 上设置玻璃混合颜色?

    使用无证的SetWindowCompositionAttribute API http vhanla codigobit info 2015 07 enable windows 10 aero glass aka blur html在 Wi
  • Windows 7 SDK安装失败

    我好像完全无法安装Windows 7 SDK http en wikipedia org wiki Microsoft Windows SDK到我的机器上 我在网上找到的唯一解决方案是进行一系列注册表更改 我已经这样做了 仍然没有成功 这是
  • 如何编写通用 C 函数来调用 Win32 函数?

    为了允许从脚本语言 用 C 编写 访问 Win32 API 我想编写一个如下所示的函数 void Call LPCSTR DllName LPCSTR FunctionName LPSTR ReturnValue USHORT Argume
  • 以编程方式最大化屏幕一半的窗口

    我想最大化屏幕左侧的随机窗口 我可以在我的代码中使用 Windows Aero 函数吗 这个窗口can像用鼠标一样最大化 我只想以编程方式做到这一点 I use C 我可以得到IntPtr窗户的 如果可能的话 不要伪造鼠标或键盘输入 这可以
  • 当加载图标且 tk.mainloop 位于线程中时,Tkinter 会锁定 Python

    这是测试用例 import Tkinter as tk import thread from time import sleep if name main t tk Tk thread start new thread t mainloop
  • 如何使用嵌入的清单作为资源? (Windows XP/Vista 风格的控件)

    我有一个作为 Windows 资源嵌入的清单 但正确的应用方法是什么 进一步来说 我有我的 manifest 文件 这是使应用程序使用 Windows XP Vista 视觉样式中的控件的标准方法 当通过与 exe 位于同一目录并适当命名来
  • gdi+ 中的半色调效果

    我该如何去模仿this http www juicybitssoftware com halftone GDI 中的半色调效果 它几乎看起来像弗洛伊德 斯坦伯格 http en wikipedia org wiki Floyd E2 80
  • 椭圆绘制WPF动画

    我正在开发一个矩形区域的控件 当触发发生时 将在矩形区域中绘制一个椭圆形 该控件将能够承载其他控件 例如文本框 按钮等 因此在触发时将在它们周围绘制圆圈 我希望将圆圈绘制为动画 就像您用笔圈出内部控件一样 实现这一目标的最佳方法是什么 我一
  • C++ win32设置光标位置

    我知道要使用哪个功能 但我无法让它正常工作 我用了SetCursorPos 唯一的问题是它将光标设置为屏幕坐标而不是窗口坐标 我也尝试过ScreenToClient 但它并没有起作用 这是我的代码 pt x 113 pt y 280 Scr
  • Windows Server / Datacenter:设置 CPU 关联性 > 64 个核心

    SetThreadAffinityMask 允许为 64 个逻辑核心 处理器 设置关联掩码 但是 Windows Datacenter 最多可以有 64 个 CPU 每个 CPU 都有多个内核 请参阅here http social tec
  • Windows 10 关闭、最小化和最大化按钮

    要绘制主题按钮 我使用以下代码 var h HTHEME begin if UseThemes then begin SetWindowTheme Handle explorer nil h OpenThemeData Handle WIN
  • 如何在没有io的情况下在windows上创建特定大小的文件?

    Windows 上是否有与 posix fallocate 等效的函数 具体来说 我正在寻找一种方法来立即 无需执行大量 IO 创建特定大小的文件 我不关心内容 我尝试过 chsize s 它确实分配了文件 但需要很长时间 如果我右键单击文
  • bitblt 在 Windows 10 版本 1703 上失败 (15063.138)

    使用 Visual Studio 2017 vc141 以下代码应该从前游戏窗口获取屏幕截图 但现在它返回黑色和空白图像 唯一的游戏问题 尝试过 OpenGL 和 Vulkan ogl 返回黑色 vulkan 返回白色 在升级到 Windo
  • 隐藏错误报告窗口

    我有以下问题 我的 ASP Net 应用程序接收简单控制台程序的 C 源代码 使用 cl exe 命令行 VC 编译器 对其进行编译 并使用 System Diagnostics Process 运行它 ASP Net应用程序运行在PC上
  • HWND 创建时间

    我是这个社区的新手 在使用我的自动化脚本 1 时遇到一个问题 我想获取 HWND 的创建时间 我在从 FindWindowEx 检索到的数组中有一组 HWND 我想在数组中找到最后根据系统时间创建的 HWND 我对窗口钩子没有足够的了解 但
  • winapi 函数的函数指针 (stdcall/cdecl)

    请有人给我一些为 MS winapi 函数创建函数指针的提示吗 我试图为 DefWindowProc DefWindowProcA DefWindowProcW 创建一个指针 但出现此错误 LRESULT dwp HWND UINT WPA
  • Windows 8 SDK 中的 DirectX

    Summary 是否应该从针对 Windows 8 的应用程序中删除 directX 包含文件 Details 我是 Windows 开发新手 我正在尝试使用 Visual Studio 2012 如果可能 在 Windows 8 上编译
  • win32 内容已更改,但除非移动窗口,否则不会显示更新

    我的 win32 GUI 内容每秒都会更改 但除非手动移动窗口 否则不会显示更新 我尝试每秒弹出一个消息框来触发窗口刷新 它成功了 因此 这证明我的内容确实发生了变化 但窗口没有更新 我希望刷新窗口而不是每次都弹出消息框 有没有这样的窗口功

随机推荐

  • 【qt】在qt里调用shell脚本-实现上位机调用Detectron的推断

    qt调用shell脚本有三种方法 目的 用qt做一个界面 本质是调用写好的shell脚本 调用detectron的infer simple py文件进行样本推断并显示在界面里 遇到的问题 但是本人只有system 可以行得通 而且调用的脚本
  • 故障排除经验——笔记本电脑重启后键盘失灵的解决办法(亲测可用)

    问题描述 下午 卸载了360软件 安全卫士 软件管家 360安全浏览器 后 重启电脑 然后电脑开始硬盘扫描 检测 结果告知不能成功修复 随后 我选择 继续使用Win10 选项 就发现电脑键盘已经失灵 无法输入开机密码 一度让我抓狂 在随后的
  • 堆栈相关应用算法

    栈的压入 弹出序列 题目描述 输入两个整数序列 第一个序列表示栈的压入顺序 请判断第二个序列是否可能为该栈的弹出顺序 假设压入栈的所有数字均不相等 例如序列1 2 3 4 5是某栈的压入顺序 序列4 5 3 2 1是该压栈序列对应的一个弹出
  • 什么能力很重要: 维持自己的框架的能力

    作者 纸箱之神 链接 https www zhihu com question 305507128 answer 637314109 有人答努力 坚持 选择 自律 学习 这些都很重要 但是我觉得 还有一个能力是凌驾于所有这些答案之上的 那就
  • 使用idea创建项目的步骤

    使用idea创建项目的步骤 1 点击桌面安装好的idea 2 由于我之前创建好了 所以打开的时候直接就进去 接下来 创建idea 3 File new project 4 点击project 创建项目 5 进行下一步 6 继续下一步 7 会
  • 渲染性能优化之几种LOD层次细节总结

    CIM 城市信息模型 这种大场景或者说特大场景LOD是非常重要的 城市 BIM 地形都非常系需要 根据公司的项目需求这里做了一下总结各种LOD的技术 算法 策略 首先 我们公司对于城市这种大场景我们提出使用如下技术 1 组织 符合3Dtil
  • Kr的pandas技巧笔记

    最近在做一个数据集的可视化项目 又捡起了pandas和python 这里把实际用到的技巧干货写下来 防止忘记再次去网上各种查和看documentation 同时也分享给大家 1 找出nan项 DataFrame isnull 返回一个大小和
  • Windows中的时间(SYSTEMTIME和FILETIME)

    上一篇中介绍了C运行库中的时间处理函数 这一篇介绍Windows SDk中提供的时间函数 两种时间系统之间没有本质区别 事实上CRT时间是用Windows时间实现的 当然这是说的VC实现 同样提供本地时间和UTC时间之间的转换 不过CRT中
  • C++socket编程(二):系统socket库介绍

    什么是套接字 套接字是一个介质 由操作系统控制 下面演示下windows和linux中的socket接口建立的代码 通用 ifdef WIN32 include
  • 出现rpm: command not found

    解决方法 sudo apt get install alien 转载于 https www cnblogs com xDan p 5411083 html
  • fiddler抓取,Android真机测试

    1 配置Fiddler抓取并解密HTTPS包 Fiddler默认是不抓取HTTPS包的 需要进行相应的配置 打开Fiddler 选择 Tools gt Fiddler Options 2 在弹出的对话框中选择 HTTPS 选项卡 3 勾选
  • 【Jupyter】下,Tensorflow 1.8 载入 MNIST 数据集

    导入包 import tensorflow as tf from tensorflow examples tutorials mnist import input data mnist input data read data sets M
  • 前端基础3——JavaScript基础用法

    文章目录 一 基本使用 1 1 内部方式 1 2 外部导入方式 1 3 css标签调用js脚本 触发事件 二 Windows对象 2 1 对象属性 2 2 对象方法 三 数据类型 3 1 字符串处理 3 2 数组处理 3 3 对象处理 四
  • 逆水寒7.25服务器维护,逆水寒7月4日更新维护公告 角色交易功能上线

    原标题 逆水寒7月4日更新维护公告 角色交易功能上线 逆水寒7月4日更新了什么内容 7月4日正式服中加入了角色交易的新功能 另外天江之战活动也正式开启 以下来看下完整的更新公告 各位自在同门 为了保证服务器的运行稳定和服务质量 逆水寒 将于
  • 【Unity每日灵感】第二期:复刻FreeFlyCamera插件内置脚本,如何实现丝滑好用的相机漫游?

    目录 一 插件效果 相机部分 提示部分 二 步骤拆解 视角旋转 移动与升降 加速 锁定及重置 三 脚本复刻 旋转 位置变换 增加体验感的细节 栏目Up Up 专门针对我自己平日里一些在项目中使用的好玩的点子 或者尚未实现的有趣功能复刻 第二
  • 微信小程序SLAM AR零基础入门教程

    鬼灭之刃花街篇 开播在即 今天带大家零基础使用Kivicube制作一个炭治郎的SLAM AR云手办 可以通过微信小程序将AR版的炭治郎放置在家中 提前感受鬼灭的氛围 先上个GIF大家看看动态的展示效果 在这里先科普一下本次教程使用到的AR技
  • Kendo UI开发教程(19): Kendo MVVM 数据绑定(八) Style

    Style绑定可以通过ViewModel绑定到DOM元素CSS风格属性 例如 1
  • 免费云服务器

    三丰云 免费虚拟主机 免费云服务器 https www sanfengyun com 一个良心服务器 可以通过活动 免费使用 特别适合大学生或者想尝试一下后端学习的朋友 今天我就分享一下使用这个服务器的感受 首先我选着配置了 CentOS
  • 51单片机播放音乐(二):DA转换播放任意波形

    51单片机播放音乐 二 DA转换播放任意波形 原理 DA转换器 仿真电路图 音频文件转成C语言数组代码 单片机代码 仿真输出波形 本文完整源码 用数字信号带动蜂鸣器同一时间只能发出一种频率的声音 也没有和弦 会比较难听 而我们听到的音乐可以
  • PNG透明窗体全攻略(控件不透明)vc++程序指导

    这两天在研究透明窗体 总算略有小成 网上大部分文章都是介绍到把窗体弄透明就没有下文 其实窗体透明并不难 难就难在透明的窗体上还要放控件 今 天我就把窗体透明一直到控件不透明怎么制作一块给写了吧 先截张图诱惑下你们 如果你没兴趣就没必要再看下