可以使用以下方法将Win32窗口设置为透明:

  1. 定义窗口类时,在WNDCLASSEX结构体中设置hbrBackground成员为NULL。

  2. 在窗口创建时,使用WS_EX_LAYERED风格和SetLayeredWindowAttributes函数将窗口设置为透明:

HWND hwnd = CreateWindowEx(WS_EX_LAYERED, szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 500, 100, NULL, NULL, hInstance, NULL);

SetLayeredWindowAttributes(hwnd, 0, 255, LWA_ALPHA);

其中,第二个参数指定颜色偏移量,第三个参数指定透明度,范围从0(完全透明)到255(完全不透明)。

  1. 在窗口的WM_PAINT消息处理函数中,使用CreateCompatibleDC函数创建一个与窗口DC兼容的内存DC,并将要绘制的图形绘制到该内存DC上。然后使用UpdateLayeredWindow函数将内存DC中的内容复制到窗口DC中。
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps); // 创建与窗口DC兼容的内存DC
HDC memDC = CreateCompatibleDC(hdc); // 创建一个与窗口大小相同的位图
HBITMAP memBmp = CreateCompatibleBitmap(hdc, 500, 100); // 将位图选入内存DC
HBITMAP oldBmp = (HBITMAP)SelectObject(memDC, memBmp); // 在内存DC中绘制图形
// ... // 使用UpdateLayeredWindow函数将内存DC中的内容复制到窗口DC中
POINT ptSrc = { 0, 0 };
SIZE size = { 500, 100 };
BLENDFUNCTION blend = { AC_SRC_OVER, 0, 255, AC_SRC_ALPHA };
POINT ptDst = { 0, 0 }; UpdateLayeredWindow(hwnd, hdc, &ptDst, &size, memDC, &ptSrc, 0, &blend, ULW_ALPHA); // 恢复原来的位图
SelectObject(memDC, oldBmp); // 释放内存DC和位图
DeleteDC(memDC);
DeleteObject(memBmp); EndPaint(hwnd, &ps);
}
break;

以上代码中,在内存DC中绘制图形的过程自行实现。另外,由于UpdateLayeredWindow函数需要使用内存DC和位图,因此需要在WM_DESTROY消息处理函数中释放这些资源:

case WM_DESTROY:
{
PostQuitMessage(0);
DeleteObject(hBrush);
DeleteObject(hPen);
DeleteObject(hFont);
DeleteObject(hImage); // 释放内存DC和位图
HDC memDC = GetDC(hwnd);
ReleaseDC(hwnd, memDC);
}
break;

Win32窗口设置为透明的更多相关文章

  1. QT下的几种透明效果(QPalette背景白色,窗口设置setWindowOpacity,QPainter使用Clear模式绘图)

    1.窗口整体透明,但是窗体上的控件不透明.    通过设置窗体的背景色来实现,将背景色设置为全透. QPalette pal = palette(); pal.setColor(QPalette::B ...

  2. 如何在Console下面生成一个WIN32窗口

    一个小挑战? VS2017里面,新建一个控制台工程,输入名字(你不需要也成,有默认的),得到一个控制台工程. 好了,生成的代码,如下: // Win32InConsole.cpp : This fil ...

  3. Win32窗口框架

    Win32窗口框架 WindowClass 单例,负责窗口初始化注册和取消注册: 负责提供静态方法: 放在Window类内部,方便初始化时,wndProc(HandleMsgSetup)的赋值: cl ...

  4. Win32 - 窗口

    Win32 - 窗口 目录 Win32 - 窗口 前言 流程图 创建项目 VS MinGW Win32API字符串 Unicode 和 ANSI 函数 TCHAR WinMain:Win32 Appl ...

  5. Android控件颜色设置为透明

    开发Widget时,经常想把Widget的背景设置成透明的,显得比较有品位.如果想让控件的颜色是透明的,可以定义以下的颜色: <color name="black"># ...

  6. GridView 设置背景透明以及Item的点击动画

    //将点击时的背景色设置为透明 gridView.setSelector(new ColorDrawable(Color.TRANSPARENT)); 此时点击GridView的每个Item就不会出现 ...

  7. 27.给input边框和背景颜色设置全透明

    给input边框和背景颜色设置全透明,但是里面的字不会消失 1.让背景颜色变透明(二选一) background-color:rgba(0,0,0,0); background:rgba(0,0,0, ...

  8. C# winform基础 1、Timer不起作用 2、 设置图片透明

    1.设置图片透明 this.pibox.BackColor = System.Drawing.Color.Transparent;  //将背景设置为透明 this.pibox.Parent = la ...

  9. Android webview背景设置为透明无效 拖动时背景闪烁黑色

    Adndroid 2.X的设置 webview是一个使用方便.功能强大的控件,但由于webview的背景颜色默认是白色,在一些场合下会显得很突兀(比如背景是黑色). 此时就想到了要把webview的背 ...

  10. 第一个手写Win32窗口程序

    第一个手写Win32窗口程序 一 Windows编程基础 1 Win32应用程序的基本类型 1.1 控制台程序 不需要完善的Windows窗口,可以使用DOS窗口 的方式显示. 1.2 Win32窗口 ...

随机推荐

  1. 小程序toast组件中事件触发条件

    微信小程序toast组件是一种消息提示框.例如当文章条数全部加载出来后,用户再次点击加载更多的时候,js判断文章条数全部加载出来后,便让toast组件弹出提示用户"没有更多文章了" ...

  2. 2022-3-8内部群每日三题-清辉PMP

    1.实践敏捷方法的开发负责人被任命为一个项目的迭代经理,该负责人与使用瀑布式方法的业务分析师密切合作,但这两个方法的差异已经开始对团队绩效产生负面影响,项目经理分别与开发负责人和业务分析师就这种情况进 ...

  3. ubuntu 系统增加源和删除源文件

    一.添加PPA源文件 语法格式:sudo add-apt-repository ppa:user/ppa-name 示例: sudo add-apt-repository ppa:sergiomeji ...

  4. git 本地电脑重新装git后 更新github项目报错 fatal: detected dubious ownership in repository at

    解决方法参考: fatal: detected dubious ownership in repository at 'D:/'之解决方法 1.今天在学习git的时候出现这个错误: 2.执行下面代码即 ...

  5. 进程间通信-信号-pipe-fifo

    一.实验截图 (一)fifo (二)pipe (三)signal 二.实验代码 fifo //consumer #include <stdio.h> #include <stdlib ...

  6. CCIE DC Multicast Part 1.

    Hi Guys! As we all wait anxiously for the training vendors to release Rack Rentals (Come on guys! At ...

  7. bzoj 3532

    很好的一道题,对理解最小割有很大帮助 首先,不难发现本题与网络流24题中的某一道很类似,我们可以先跑一次dp求出每个节点的LIS,然后拆点,拆出的两点之间连流量为删除的代价的边,剩下的点之间按dp的转 ...

  8. 【Android异常】关于静态注册BroadcastReceiver接收不到系统广播的问题

    如果你静态注册的广播无法接收到消息,请先检查下:你的安卓版本是不是8.0+ 前言Google官方声明:Beginning with Android 8.0 (API level 26), the sy ...

  9. 1,权限问题:无法创建目录"**": 权限不够":

    1,权限问题:无法创建目录"**": 权限不够": 解决:在命令前加上 sudo 命令后,输入密码即可 原创建目录命令:mkdir [选项] DirName 解决权限问题 ...

  10. java-------token

    https://el-admin.vip/guide/hdsc.html#%E6%96%B0%E5%BB%BA%E6%A8%A1%E5%9D%97