MSDN官方分层窗口解释:https://docs.microsoft.com/zh-cn/windows/win32/winmsg/window-features。

窗口设置透明度后,Qt底层采用分层窗口实现窗口绘制。

void QWindowsBackingStore::flush(QWindow *window, const QRegion &region,const QPoint &offset)
{Q_ASSERT(window);const QRect br = region.boundingRect();if (QWindowsContext::verbose > 1)qCDebug(lcQpaBackingStore) << __FUNCTION__ << this << window << offset << br;QWindowsWindow *rw = QWindowsWindow::windowsWindowOf(window);Q_ASSERT(rw);const bool hasAlpha = rw->format().hasAlpha();const Qt::WindowFlags flags = window->flags();if ((flags & Qt::FramelessWindowHint) && QWindowsWindow::setWindowLayered(rw->handle(), flags, hasAlpha, rw->opacity()) && hasAlpha) {// Windows with alpha: Use blend function to update.QRect r = QHighDpi::toNativePixels(window->frameGeometry(), window);QPoint frameOffset(QHighDpi::toNativePixels(QPoint(window->frameMargins().left(), window->frameMargins().top()),static_cast<const QWindow *>(Q_NULLPTR)));QRect dirtyRect = br.translated(offset + frameOffset);SIZE size = {r.width(), r.height()};POINT ptDst = {r.x(), r.y()};POINT ptSrc = {0, 0};BLENDFUNCTION blend = {AC_SRC_OVER, 0, BYTE(qRound(255.0 * rw->opacity())), AC_SRC_ALPHA};RECT dirty = {dirtyRect.x(), dirtyRect.y(),dirtyRect.x() + dirtyRect.width(), dirtyRect.y() + dirtyRect.height()};UPDATELAYEREDWINDOWINFO info = {sizeof(info), NULL, &ptDst, &size, m_image->hdc(), &ptSrc, 0, &blend, ULW_ALPHA, &dirty};const BOOL result = UpdateLayeredWindowIndirect(rw->handle(), &info);if (!result)qErrnoWarning("UpdateLayeredWindowIndirect failed for ptDst=(%d, %d),"" size=(%dx%d), dirty=(%dx%d %d, %d)", r.x(), r.y(),r.width(), r.height(), dirtyRect.width(), dirtyRect.height(),dirtyRect.x(), dirtyRect.y());} else {const HDC dc = rw->getDC();if (!dc) {qErrnoWarning("%s: GetDC failed", __FUNCTION__);return;}if (!BitBlt(dc, br.x(), br.y(), br.width(), br.height(),m_image->hdc(), br.x() + offset.x(), br.y() + offset.y(), SRCCOPY)) {const DWORD lastError = GetLastError(); // QTBUG-35926, QTBUG-29716: may fail after lock screen.if (lastError != ERROR_SUCCESS && lastError != ERROR_INVALID_HANDLE)qErrnoWarning(int(lastError), "%s: BitBlt failed", __FUNCTION__);}rw->releaseDC();}// Write image for debug purposes.if (QWindowsContext::verbose > 2 && lcQpaBackingStore().isDebugEnabled()) {static int n = 0;const QString fileName = QString::fromLatin1("win%1_%2.png").arg(rw->winId()).arg(n++);m_image->image().save(fileName);qCDebug(lcQpaBackingStore) << "Wrote " << m_image->image().size() << fileName;}
}

Layered Windows分层窗口相关推荐

  1. Layered Windows窗口的半透明效果

    介绍: Layered Windows是windows窗口中的一类,提供类似半透明的效果(阿尔法混合).半透明效果是字面上有能看出来的,但实际上根据MSND,该类型的窗口还能更好的支持非矩形的窗口,使 ...

  2. [测试项目]Windows 桌面自定义WorkerW分层窗口

    提示:本文所采用的方法属于本人猜想方案(目前没有在Win7及XP尝试过,但在NT的较高版本Win10在不发送052C消息,即不使用系统生成的WorkerW分层窗口实践成功.Win8开始DWM无法关闭, ...

  3. 分层窗口实现千千静听的透明歌词

    千千静听的透明歌词有两个特点: 1.只有在点击到文字上时,才可以拖动,也就是说窗口是不规则的. 2.当设置为总是在前面,最顶层窗口时,歌词窗口的下层窗口的刷新也能体现到歌词上来,也就是歌词依然透明. ...

  4. VC++界面编程之--使用分层窗口实现界面皮肤

    使用分层界面来实现界面皮肤的好处是:可以保证图片边缘处理不失真,且能用于异形窗口上,如一些不规则的窗口,你很难用SetWindowRgn来达到理想效果. 在很多情况下,界面的漂亮与否,取决于PS的制作 ...

  5. c语言api函数绘制渐变色,创建分层窗口,实现图像渐变

    有没有方法创建一个半透明的窗口,并将该窗口上发生的所有鼠标事件都传递到桌面或另一个应用窗口处理? Scott Stringham  当然可以,并且相当容易.你只要创建一个"分层窗口" ...

  6. windows常见窗口样式和控件风格以及类样式

    Windows常见窗口样式和控件风格 王佰营 徐丽红 一.窗口样式 WS_POPUP 弹出式窗口(不能与WS_CHILDWINDOW样式同时使用) WS_CHILDWINDOW 子窗口(不能与WS_P ...

  7. Windows常见窗口样式和控件风格

    Windows常见窗口样式和控件风格 王佰营 徐丽红 一.窗口样式 WS_POPUP 弹出式窗口(不能与WS_CHILDWINDOW样式同时使用) WS_CHILDWINDOW 子窗口(不能与WS_P ...

  8. 分层窗口输出文字时,会出现透明的洞。

    日前遇到一个问题,在分层窗口上使用gdi+ 绘制文本的时候,在绘制的文字区域,文字产生了透明的洞,鼠标会穿透. 通过现象分析,应该是文字区域的透明度直接干成了0,所以产生了一个洞.因为分层窗口透明度为 ...

  9. w7系统计算机网络密码是什么,解答win7系统共享弹出Windows安全窗口提示输入网络密码的详细教程...

    随着电脑的使用率越来越高,我们有时候可能会遇到win7系统共享弹出Windows安全窗口提示输入网络密码问题,如果我们遇到了win7系统共享弹出Windows安全窗口提示输入网络密码的问题,要怎么处理 ...

  10. Windows - CMD窗口UTF8编码乱码问题的解决!

    Windows - CMD窗口UTF8编码乱码问题的解决! 参考文章: (1)Windows - CMD窗口UTF8编码乱码问题的解决! (2)https://www.cnblogs.com/suny ...

最新文章

  1. 浅谈XXE漏洞攻击与防御——本质上就是注入,盗取数据用
  2. iredmail安装roundcube webmail插件
  3. ipv4校验(java)
  4. java和php混合_PHP和Java强强联合 集成开发详解
  5. SAP WebClient UI view controller所有可用的属性列表
  6. mysql load 占位符_Mysql占位符插入
  7. python合法变量类型_Python 变量类型
  8. 网际控制报文协议ICMP(Internet Control Message Protocol)(详解)
  9. centos 8 kubernetes安装详解_电力工程必学!8方面施工图文详解,电气安装工程施工工艺...
  10. try catch finally return的执行顺序与返回值探究
  11. Java动态数组的实现
  12. H3CNE-生成树协议(STP)
  13. 随机点名器——java
  14. 无障碍感受 北京之美
  15. 零基础怎么自学软件测试?分享五个宝藏网站,自学简直不要太轻松了
  16. 阿里云语音通知API试接入
  17. Kotlin的getter和setter
  18. Cena、Lemon自动AC机
  19. TP4056锂电池充电IC
  20. 一个真实项目的性能分析策略

热门文章

  1. cad没有命令输入框_cad怎么调出命令栏(cad下面的命令行没有了,如何调出来?)...
  2. 青龙脚本合集(不定期更新版)
  3. Linux 杀毒软件ClamAV离线安装部署
  4. 解决vscode的报错:Java 11 or more recent is required to run the Java extension
  5. 简述数字信号处理的内容和理论
  6. 第2章 panda 索引
  7. tensorflow-ckpt2npy
  8. 简述T568A和T568B的区别
  9. linux安装ps软件教程,如何在Linux上安装Adobe Photoshop | MOS86
  10. Java一个简单的Employee类