Win32 UpdateLayeredWindow 与 SetLayeredWindowAttributes 的异同点
【摘要】 相同点在使用透明窗口时,必须为窗口设置扩展风格WS_EX_LAYERED,有两种方法方法一:CreateWindowEx将原来的创建窗口函数,改为扩展设置,并添加扩展风格标记(原) hWnd = CreateWindowW(szWindowClass, szTitle, WS_POPUP, x, y, width, height, nullptr, nullptr, hInstance, ...
相同点
- 在使用透明窗口时,必须为窗口设置扩展风格
WS_EX_LAYERED
,有两种方法
- 方法一:
CreateWindowEx
将原来的创建窗口函数,改为扩展设置,并添加扩展风格标记
(原)
hWnd = CreateWindowW(szWindowClass, szTitle, WS_POPUP, x, y, width, height, nullptr, nullptr, hInstance, nullptr);
(修改后)
hWnd = CreateWindowEx(
WS_EX_LAYERED, // dwExStyle
szWindowClass, // Classname
szTitle, // Title Text
WS_POPUP, // dwStyle
x, // Windows decides the position
y, // where the window ends up on the screen
width, // The programs width
height, // and height in pixels
HWND_DESKTOP, // The window is a child-window to desktop,填null也可以
nullptr, // No menu
hInstance, // Program Instance handler
nullptr // No Window Creation data
);
- 方法二:
SetWindowLong
设置并修改窗口样式
//为样式添加附加层,用来支持透明样式
LONG nExStyle = GetWindowLong(hWnd, GWL_EXSTYLE);
nExStyle |= WS_EX_LAYERED;
SetWindowLong(hWnd, GWL_EXSTYLE, nExStyle);
-
两者均必须是非client窗口(
Overlapend
或PoupUp
),否则设置无效 -
两者都可以用32位bmp图片的“透明度”,或者bmp图像的颜色值来作为透明度标识(也就是说兼容dc中所绘制的画布中如果颜色与掩码色相同则把这部分透明掉)。
-
两者在设置后,都需要采用兼容的dc去更新当前窗口的dc,所有必须要在兼容的dc上绘制好后去更新当前窗口,故而所有操作应该绘制到兼容的dc上,最后透明度才能生效(也就是说,设置好后,还需要创建一个内存DC来存储图片信息,然后用
BitBlt
函数,将其绘制到窗口DC)
区别
-
UpdateLayeredWindow
使用之后不会再发出WM_PAINT
绘制消息,所有的绘制消息都由UpdateLayeredWindow
代而处理,所以不要在OnPaint
里做任何事,因为是徒劳的。而SetLayeredWindowAttributes
仅仅是设置一个标记,并不会阻断系统的WM_PAINT
事件,其它的控件依旧可以被正常绘制 -
UpdateLayeredWindow
上所有的东西(包括子控件都必须自己绘制上去,自己响应事件)都由个人处理;SetLayeredWindowAttributes
则仅仅处理该窗口的掩码色处理成透明色或将整个窗口的透明度设置为LWA_ALPHA
指定的不透明度值,不影响其他子控件的处理。因此SetLayeredWindowAttributes
可以很好的与其它控件兼容
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)