透明窗体的又一实现

QT之桌面精灵实现(一) --- 透明窗体和图片绘制 关于QT种种,之前已经吐槽过了,打算写几篇记录一下桌面精灵的制作过程,不过由于是过了挺长时间才想要写,所以之前的一些东西都忘得差不多了,总之想起多少写多少。 桌面精灵的第一步,就是要把一个精灵渲染到桌面,具体使用WINAPI做过一些,都不完美,也不想深挖WINAPI,因为我的目的只是想要把精灵渲染的桌面,而QT 很容易就能实现。 另外说一下渲染精灵到桌面其实有两种途径,一种是直 阅读详情
前面拜读过本站无数高手的许多好文章,受益非浅,首先向各位大侠致敬!今天编程偶有小得,不敢独享,特拿出来与各位共享,希望对某些朋友有些许帮助。
  透明窗体的问题相信大家已经很熟悉了,前面的几期在线杂志也有几篇详尽的教程,总结一下就是通过SetWindowRgn这个函数来实现,具体的裁切框用CRgn来生成,比较简单的 象圆,椭圆,圆角窗口等CRgn类都提供了相应的生成方法,我们如果想根据自己的图片来生成裁切框前面的朋友提到的方法是首先生成一个矩形裁切框,然后扫描图片,根据象素点的颜色与掩码颜色的匹配与否,对裁切框进行删减(生成一个新的,然后XOR),对于这种方法我就不详细描述了,有需要的朋友请查阅以前的文章,我首先说一下我遇到的不足之处:
  如果我的窗体支持Resize,那么我调整大小的过程中,要不停的计算裁切框(要逐点扫描象素,并对裁切框进行操作),计算量相当大,特别当窗体比较大的时候更是如此,会造成窗体的闪烁。
  我查阅相关资料得到另一种实现方法,简单实用,那就是利用 SetLayeredWindowAttributes 这个函数,相信许多朋友都见过Microsoft对他的描述但用过的并不多,要用它,要安装最新的SDK,否则会出现没有定义的错误。小弟懒得下载,下面的介绍采用了一般API调用的格式。如果你已经有最新的SDK,那你的程序可以变得更加简练!
首先介绍一下这个函数:

BOOL SetLayeredWindowAttributes(
        HWND hwnd,         // 应用目标窗口的句柄
        COLORREF crKey, // 掩码的颜色,可以用RGB(r,g,b)来指定
        BYTE bAlpha,         // 掩码颜色部分的Alpha值,0是全透明,255是完全不透明
        DWORD dwFlags         // 透明方式
);  

要说名的是这个函数只在Windows2000及以上版本才支持。MSDN对要求的描述如下 <Requirements>
Windows NT/2000/XP: Included in Windows 2000 and later.
Windows 95/98/Me: Unsupported.
Header: Declared in Winuser.h; include Windows.h.
Library: Use User32.lib.

  还有就是这个函数对于有标题框的窗体支持不好,就是它裁切的只是客户区域,好在我们要制作透明窗体的场合一般用不到标题框下面就说名例程的制作过程。(我旨在说明这种透明窗体的思路及函数的用法,所以代码非常简单,并且没有必要的错误验证机制,希望大家谅解)
建立一张用于在窗体上绘制的背景图片,把要裁切的部分用一种颜色标记出来,我们叫它MaskColor,我的图片如下:



我的MaskColor = 0xFF00,也就是 RGB(0,255,0).
建立一个基于对话框的工程,修改对话框资源的属性,主要修改两个地方。一是指定没有TitleBar,二是指定BorderStyle为None.这样才能保证出来的窗体符合你的要求
把图片加入资源,付ID = IDB_BACKGROUND
下面就开始写代码了,呵呵,看下面的代码这么长。是不是头有点大呀,别急,这些多半都是工程向导自动生成的,我加的都已经注解上了,并用黄色表示没有几行的。要不然我怎么敢向各位吹嘘这个实现方法简单呢。
a.首先我们给窗体添加两个成员变量:   CBitmap * m_oldBitmap; //指向内存DC原来的 Bitmap
  CDC m_DC;              //用于存放背景图片的内存DC

b.在窗体的OnInitDialog()函数中做一番初始化: BOOL CTransWindowDlg::OnInitDialog()
{
        CDialog::OnInitDialog();
        // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
        //  执行此操作
        SetIcon(m_hIcon, TRUE);         // 设置大图标
        SetIcon(m_hIcon, FALSE);        // 设置小图标
        ///////////////////////////////////////
        //段会锋添加的代码
        //实现背景图以及窗口透明
        //调用背景图片
        CBitmap bitmap;
        BITMAP bitInfo;
        bitmap.LoadBitmap(IDB_BACKGROUND);
        //得到图片大小并调整窗口大小适应图片
        bitmap.GetBitmap(&bitInfo);
        CRect rect;
        GetWindowRect(&rect);
        rect.right = rect.left + bitInfo.bmWidth;
        rect.bottom = rect.top + bitInfo.bmHeight;
        MoveWindow(rect);
        //创建并保存DC
        m_DC.CreateCompatibleDC(GetDC());
        m_oldBitmap = m_DC.SelectObject(&bitmap);
        //设置窗口掩码颜色和模式
        //首先获得掩码颜色
        COLORREF maskColor = m_DC.GetPixel(0,0);
       
        #define LWA_COLORKEY  0x00000001
        #define WS_EX_LAYERED  0x00080000
       
        typedef BOOL (WINAPI *lpfnSetLayeredWindowAttributes)(HWND hWnd,
                                        COLORREF crKey,
                                        BYTE bAlpha,
                                        DWORD dwFlags);
       
        lpfnSetLayeredWindowAttributes SetLayeredWindowAttributes;
       
        HMODULE hUser32 = GetModuleHandle("user32.dll");
        SetLayeredWindowAttributes = (lpfnSetLayeredWindowAttributes)GetProcAddress(hUser32,
                "SetLayeredWindowAttributes");

        SetWindowLong(GetSafeHwnd(),
                                  GWL_EXSTYLE,
                                  GetWindowLong(GetSafeHwnd(),
                                  GWL_EXSTYLE) | WS_EX_LAYERED);

        SetLayeredWindowAttributes(GetSafeHwnd(),
                                   maskColor,
                                   255,
                                   LWA_COLORKEY);

        FreeLibrary(hUser32);
        ////////////////////////////////////////   
        return TRUE;  // 除非设置了控件的焦点,否则返回 TRUE
}

就像注释的那样,我们首先把图片Load进来,然后把m_DC创建一个与窗口DC兼容的DC,并把刚才Load进来的图片绑定到该内存DC上,并用m_oldBitmap 记录下原有Bitmap,用户最后释放。
c.向OnPaint中添加代码,用于把背景图片绘制到窗口上: void CTransWindowDlg::OnPaint()
{
  if (IsIconic())
  {
      //这里是MFC的框架代码,为了减少篇幅省略…
  }
  else
  {
      ////////////////////////////////////
      //段会锋修改的代码,用于绘制背景图片
      //CDialog::OnPaint();
      CDC * pDC = this->GetDC();
      CRect rect;
      GetWindowRect(&rect);
      pDC->BitBlt(0,0,rect.Width(),rect.Height(),&m_DC,0,0,SRCCOPY);
      ////////////////////////////////////
  }
}

d.到这里我们要的功能就已经能够实现了,但是好的程序员绝对不应该忘记释放资源,你也一样,一定没有忘记在程序结束时释放资源,呵呵,我们可以写到析构函数中,我们也可放到OnClose()函数中,都一样,我采用了后一种:添加函数并添加释放资源的代码 void CTransWindowDlg::OnClose()
{
    ////////////////////////////////////
    //段会锋添加的代码
    //释放资源
    CBitmap * bitmap = m_DC.SelectObject(m_oldBitmap);
    m_DC.DeleteDC();
    bitmap->DeleteObject();
    ////////////////////////////////////
    CDialog::OnClose();
}

e.现在好了,运行一下吧,真爽,就这么几行代码搞定了一个漂亮的窗口。是不是很有成就感?呵呵。又看了几次真的美滋滋的。不好发现问题了,怎么程序运行的时候开始有一下闪烁呢?哦,是清空背景的时候画了一下,没关系,让我们干掉它。添加WM_EraseBkgnd事件的响应函数,把原来的注释掉直接返回True,再运行一下看看吧?怎么样,满意了吗? BOOL CTransWindowDlg::OnEraseBkgnd(CDC* pDC)
{
    ////////////////////////////////////
    //段会锋编辑的代码
    //防止开始绘制的一下闪烁
    //return CDialog::OnEraseBkgnd(pDC);
    return true;
    ////////////////////////////////////
   
}

f.好了,我已经非常满意了,要休息一下了,但我怎么关闭这个窗口呢?糟糕,非要我用Alt+F4不成?算了再多用一下功,写个双击事件好了: void CTransWindowDlg::OnLButtonDblClk(UINT nFlags, CPoint point)
{
  ///////////////////////////////////
  //段会锋添加的代码,双击窗口关闭Windows
  this->PostMessage(WM_CLOSE);
  ///////////////////////////////////

  CDialog::OnLButtonDblClk(nFlags, point);
}

  呵呵,本文旨在说明透明窗体的思路及函数用法,抛砖引玉,相信大家一定有好多更好的创意通过这个思路实现,比如,可以添加Resize功能呀,使掩码不完全透明甚至是渐隐呀等等,总之创意无限,等待着大家的发掘! 
Gtk透明窗体和控件的研究 网上这些类似的资料很多,我大致上都是用过,我个人总结如下:透明的一般实现方法1:使用异形窗体实现透明在这里我引用了别人的一个sample,其原理就是在设置不规则窗体,然后设置控件的背景图实现透明,适合用于设置简单控件上面的图,使控件变为透明#include   int main(int argc, char *argv[]) {    GtkWidget *window 阅读详情

相关推荐

Win32设置带背景图片的透明窗体

使用函数SetLayeredWindowAttributes设置窗体的透明度。

m0_60352504的博客 867

Window 透明窗体的实现总结

此片文章是以前写的, 刚刚新开了博客, 就发出来跟大家分享下。 这篇文章主要讲得是vc中各种分层、透明、不规则窗口的实现, 基本囊括GDI、GDI+能使用的所有方法。 本文讲述了三种方法,其中第一种方法有两种不同效果,第三种方法有两种不同的实现方式。文中有方法使用了GDi+,关于GDI+的使用请自行查询资料,本文不进行细述。 方法一:窗体整体透明,支持子控件透明,支持

l198738655的博客 3283

WindowAPI:通过 Windows API 设置图形大小、最上层、透明度和像素掩码、多显示器等-matlab开发

WINDOWAPI - 使用 Windows API 设置窗口属性FEX 中有很多功能可以设置图形属性,例如最大化、最小化、始终在顶部、透明度级别(使用 Java)。 本次提交增加了 4 个新功能: 1. 最大化带有或不带有可见任务栏或菜单栏的窗口。 2. 设置图形和模板颜色的透明度级别:此颜色的像素为 100% 透明。 3. 在多显示器设置上放置数字。 4. 剪辑区域:仅在指定矩形内绘制像素(例如闪屏)。 5. 锁定光标:特别是对于游戏来说,将鼠标光标保持在指定的矩形内会很有用。 WindowAPI(FigH,命令) 输入: FigH:Matlab 的图形句柄或 Windows HWND 命令: TopMost:即使失去焦点,窗口也位于最顶部NoTopMost:禁用最顶层状态前:暂时将窗口移到顶部最小化:最小化窗口恢复:恢复到以前的大小最大化:全屏,任务栏和菜单栏可见XMax,YMax

C# 窗体半透明,控件不透明

效果: 采用两层窗体实现 上方窗体,背景全透明,控件不透明,鼠标可穿透 下方窗体,通过Opacity调整透明度,无控件,鼠标不可穿透 前景窗体: using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Runtime.InteropSe...

冰封的落叶的博客 7427

win32实现透明窗口

win32程序,非mfc,gdi+png贴图 实现半透明窗口的demo 只要一分 优快云别改我的分

RML2016.10a (CNN、LSTM、CNN-LSTM、CNN-LSTM-Multi-head-attention, TensorFlow)

RML2016.10a (CNN、LSTM、CNN-LSTM、CNN-LSTM-Multi-head-attention, TensorFlow) 包含所有数据和代码,支持一键运行(jupyter)

qq_40999533的博客 1482

如何在uC/GUI中实现窗体半透明效果(一)

 uC/GUI系统中的窗体可以实全透明效果,但是无法实现半透明效果。经过一天的实验,经于实现了窗体的半透明效果,与大家分享怎么实现半透明效果呢?先考虑原理。半透明原理:假设LCD是256色的。颜色格式为332(RGB)显存中的每一个字节的数据对应一个象素点。在数据写入显存之前,读取相应相素点值,然后与新的数据按一定的规则混合之后,再写入相应像素点的显存。这样主要问题

526

【牛股启动线】副图指标使用技术说明,图文案例分享,通达信炒股指标

如上图,在紫色线在黑色虚线上时,在出现紫色柱线时,通常会出现强势拉升的行情​。柱线加长加上紫色线上扬,进场跟随做多抓强势行情,紫色柱线和紫色线同时做多持续则可以继续持股。如上图,副图指标【牛股启动线】,指标信号包括紫色线走势信号和紫色柱线信号,以及底部的四条虚线技术信号​,还有一条绿色的参考线,一条黑色的虚线两天分档线。如上图,参考买点,紫色柱线开始出现时进场买点,在上图标记的位置对应的就是进场买点​。紫色柱线加长+紫色线上扬,多头共振持股,行情继续拉升阶段,持股待涨或顺势​进场做多。

weixin_69760830的博客 1907

java设置窗体透明_Java透明窗体的设置方法

若将JDK版本升级到最新版本,Java窗体就可以简单实现窗体的透明效果,用户可以通过拉动滑块(Slider)调整窗体透明度,实现窗体不同透明程度的切换。下面让我简单实现窗体透明效果,用户可以做些扩展。步骤(STEPS)打开Java开发工具Eclipse软件,依次选择“文件”、“新建”、“项目”,在“新建项目”窗口中选择“Java项目”,然后点击“下一步”按钮。在出现的窗体中的“项目名称”后自定义输...

weixin_29735075的博客 1659

维纳滤波和卡尔曼滤波

本文的主要内容是维纳滤波和卡尔曼滤波的介绍,包含匹配滤波器、维纳滤波器、维纳预测、卡尔曼滤波等内容。

西岸贤 9518

VS2015+Qt+OpenCV+open62541开发过程(05_VS2015中使用OPCUA open62541通过Kepware读写PLC数据)

此外还需要所需lib包:WS2_32.Lib(opcua通讯用到的库,opcua使用socket通讯,需使用此库),添加#pragma comment(lib,"ws2_32.lib") 语句,有的文章说需要添加ws2_32.lib文件或ws2_32.dll到项目资源中,貌似影响不大。2.在VS中选择x64平台会报错,选择x86平台可以用,应该是ws2_32.lib相关的库不支持64位,目前没有解决,继续后面的实验,看看用Qt后是否可以解决。6.VS中建立的变量,与读取的OPC点数据类型注意对应。

zzh17的博客 1862

Qt窗体透明

1. 主窗体透明,子窗体不透明 设置主窗体属性 setAttribute(Qt::WA_TranslucentBackground); 重载paintEvent() void Widget::paintEvent(QPaintEvent *) { QPainter p(this); p.setRenderHint(QPainter::Antialiasing); p

杜都督的博客 248

别再自己造轮子了!用MONAI Model Zoo里的预训练模型,5分钟搞定医学影像AI项目

本文介绍了如何利用MONAI Model Zoo中的预训练模型快速搭建医学影像AI项目,大幅节省开发时间和计算资源。通过实战案例展示了UNet、DenseNet121等核心模型的应用技巧,帮助临床医生和研究者5分钟内启动高质量医学影像分析,特别适合小样本场景下的病灶分割和分类任务。

weixin_33704234的博客 238

窗体透明、窗体上控件和DC绘图不透明

特点:    1.Dialog窗体完全透明。    2.窗体上的控件不透明、DC绘制的图形不透明。    3.拖动窗体上用DC绘制的图形可以移动窗体。   缺点:    1.窗体设置透明使用是掩码颜色,所以在窗体上用DC绘图的过程当中如果采用了和透明掩码颜色相同的颜色将不会显示出来。    2.如果将Border属性设置成了NONE,那么想通过响应WM_NCHITEST消息来实现窗体拖动就无法完成

FIND ME 1万+

Java Web 图书管理系统的制作指南

实现对图书信息的增删改查(CRUD)操作。支持用户登录与权限管理。图书借阅与归还功能。系统管理员可以管理用户信息和图书库存。

Xiaoxin的博客 1629

跟着团子学SAP CO:揭秘结果分析码在项目结算中的实战应用(一)KKA2/CJ88

本文深入解析了SAP CO模块中结果分析码在项目结算中的核心作用。以KKA2(方法10)和事务代码CJ88为例,详细阐述了如何在项目完工后一次性确认收入的场景下,通过结果分析功能实现收入与成本的精准匹配,将项目成本暂估为在制品,确保各期利润的准确反映。

gamma的博客 685

VC:透明窗体+接收鼠标事件

VC将窗体(基于对话框)设置为透明后,你可以选择pass鼠标事件到它下面的窗体或者自己接收鼠标事件。 1. pass鼠标事件,就是鼠标穿透窗体到它下面的其它窗体上 void SetWndTransparent(BYTE bAlpha){ DWORD dwExStyle=GetWindowLong(this->GetSafeHwnd(), GWL_EXSTYLE|WS_EX_LAYERE

XiaoAiWhc的专栏 3236

1.2、基于卷积神经网络(CNN)的车牌自动识别系统(matlab)

基于卷积神经网络(CNN)的车牌自动识别系统(matlab)

XU157303764的博客 2911

QT 设置窗体透明及注意点

QT 设置窗体透明 第一种:窗体及各部件全部透明: this->setWindowOpacity(0.5); 第二种:QT主窗体透明实现: 1)添加setWindowFlags(windowFlags() | Qt::FramelessWindowHint); 2)添加setAttribute(Qt::WA_TranslucentBackground, true); 3)重写paintEvent事件 void MaskDialog::paintEvent(QPaintEvent *event) {

qq_36939187的博客 1826

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

设置窗体透明C#代码

上个示例是C#调用windows api在原来代码上加入窗体透明,控件不透明代码: 1 using System; 2 using System.Runtime.InteropServices; 3 using System.Windows.Forms; 4 5 namespace HoverTreeWinForm 6 { 7 public partial c...

weixin_33858485的博客 239

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

WinForm中的特殊窗体效果:渐变窗口和信息提示窗口

在WinForm中偶尔会遇到某些特殊效果:比如某个窗口刚开始的时候是完全透明的,随着时间的变化,窗体逐渐不透明,直至完全不透明。这是本文要探讨的窗体效果之一:渐变窗体。 还有一种窗体效果:有些软件在某个特定的时间会显示一个提示窗体,这个窗体不是直接显示的,而是慢慢从窗口的最下方向上移动,直至窗体完全显示就不再移动。当我们点击“确定”按钮之后,窗体由从屏幕上逐渐下移,直至完全从屏幕上完全不显示。这...

周公(周金桥)的专栏 1万+

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

delphi 半透明窗体类

{******************************************************************************* 半透明窗体控件 版本:1.0 功能说明 : 1.支持颜色和图片半透明 2.暂时只能手动指定背景图片 3.可调透明度(0..255) 4.可控制是否可移动窗体 联系方式: Email: mdejtoz@

留下脚印 1011
上一篇: 半透明及透明位图的实现技术
下一篇: 三个实现透明效果的方法(我还没有试过,不保证质量)
JamesXing
博客等级 码龄20年 30粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值