Win32 UpdateLayeredWindow 与 SetLayeredWindowAttributes 的异同点

举报
福州司马懿 发表于 2022/11/23 16:54:15 2022/11/23
【摘要】 相同点在使用透明窗口时,必须为窗口设置扩展风格WS_EX_LAYERED,有两种方法方法一:CreateWindowEx将原来的创建窗口函数,改为扩展设置,并添加扩展风格标记(原) hWnd = CreateWindowW(szWindowClass, szTitle, WS_POPUP, x, y, width, height, nullptr, nullptr, hInstance, ...

相同点

  1. 在使用透明窗口时,必须为窗口设置扩展风格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);
  1. 两者均必须是非client窗口(OverlapendPoupUp),否则设置无效

  2. 两者都可以用32位bmp图片的“透明度”,或者bmp图像的颜色值来作为透明度标识(也就是说兼容dc中所绘制的画布中如果颜色与掩码色相同则把这部分透明掉)。

  3. 两者在设置后,都需要采用兼容的dc去更新当前窗口的dc,所有必须要在兼容的dc上绘制好后去更新当前窗口,故而所有操作应该绘制到兼容的dc上,最后透明度才能生效(也就是说,设置好后,还需要创建一个内存DC来存储图片信息,然后用BitBlt函数,将其绘制到窗口DC)

区别

  1. UpdateLayeredWindow使用之后不会再发出WM_PAINT绘制消息,所有的绘制消息都由UpdateLayeredWindow代而处理,所以不要在OnPaint里做任何事,因为是徒劳的。而SetLayeredWindowAttributes仅仅是设置一个标记,并不会阻断系统的WM_PAINT事件,其它的控件依旧可以被正常绘制

  2. UpdateLayeredWindow上所有的东西(包括子控件都必须自己绘制上去,自己响应事件)都由个人处理;SetLayeredWindowAttributes则仅仅处理该窗口的掩码色处理成透明色或将整个窗口的透明度设置为LWA_ALPHA 指定的不透明度值,不影响其他子控件的处理。因此SetLayeredWindowAttributes可以很好的与其它控件兼容

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。