//为窗体添加WS_EX_LAYERED属性,该属性使窗体支持透明
ModifyStyleEx(0, WS_EX_LAYERED);
 
效果1.1 窗体整体透明,子控件也透明
 
//设置Alpha值为150
BYTE byteAlpha=150;
SetLayeredWindowAttributes(0,byteAlpha,LWA_ALPHA);
 
效果1.2 窗体整体透明,子控件不透明
 
//在OnCtlColor中将窗体背景刷为某种单色,比如RGB(255,0,0)
//在OnPaint中当然也可以
 
if(nCtlColor=IDD)
return m_brush; //m_brush.CreateSolidBrush(RGB(255,0,255));
 
//设置窗体中所有单色区域都透明
SetLayeredWindowAttributes(RGB(255,0,255),0,LWA_COLORKEY);
 
效果2.窗体部分透明,但该窗体不支持子控件,不支持OnPaint()
USES_CONVERSION;
Image* _pImage=
Image::FromFile(A2W("F:\\Desktop\\TestTransparentWnd\\test.png"));
//透明度由PNG图片的Alpha通道决定
 
//如果加上WS_EX_TRANSPARENT属性,则鼠标会穿透此窗体
ModifyStyleEx(0, WS_EX_LAYERED/*|WS_EX_TRANSPARENT*/);
 
CDC *pDCDst=this->GetDC();
CDC dcSrc;
dcSrc.CreateCompatibleDC(pDCDst);
CBitmap bmp;
bmp.CreateCompatibleBitmap(pDCDst,300,300);
dcSrc.SelectObject(&bmp);
 
//用GDI+显示PNG图片
Graphics _Graphics(dcSrc.m_hDC);
_Graphics.DrawImage(_pImage,0,0,300,300);
 
BLENDFUNCTION _Blend;  
_Blend.BlendOp=0;
_Blend.BlendFlags=0;
_Blend.AlphaFormat=1;
_Blend.SourceConstantAlpha=255;
 
//此时,鼠标会穿透窗体中Alpha值为0的区域
UpdateLayeredWindow(pDCDst,&CPoint(0,0),&CSize(300,300),
                    &dcSrc,&CPoint(0,0),
                    0,&_Blend,ULW_ALPHA);
 
bmp.DeleteObject();
dcSrc.DeleteDC();
_Graphics.ReleaseHDC(dcSrc.m_hDC);
this->ReleaseDC(pDCDst);
 
3.既要窗体部分透明(鼠标能穿透窗体中Alpha值为0的区域),还要能显示控件
 
解决方案:
创建两个窗体,窗体A使用效果2的方法,作为背景窗体;窗体B使用效果1.2的方法,作为前景窗体,控件都放在窗体B上。在窗体A的OnMove中,同步移动窗体B。
 
备注:
1.以上代码只需在窗体初始化的时候(如OnInitDialog)执行一次即可
2.WS_EX_LAYERED要求宏_WIN32_WINNT >= 0x0500
3.以上程序需要GDI+支持
 
参考资料:

【转载】Layered Window(分层窗体,透明窗体)的更多相关文章

  1. DSAPI实现简单的透明窗体

    代码 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Dim B As New Bitmap( ...

  2. WPF透明窗体不支持缩放解决方案

    方案一 WPF中的无边框透明窗体,由于没有边并且透明,窗体无法进行缩放操作,今天来讲解如何解决这个问题. 先说一下思路,我们先手为该窗体添加4个边,4个角用于缩放操作,然后再为他们写事件,完成拖放操作 ...

  3. C#在透明窗体WinForm上面画图(电子尺小工具的实现)

    前几天要做一个微信调一调的外挂,里面用到了尺子测量距离,然后就自己下载了一个电子尺,最近要升级我的跳一跳外挂,然后就准备自己做一个电子尺,嵌入到我的外挂里面,在嵌入到我的外挂之前,我自己做了一个完整版 ...

  4. 【C#】无损转换Image为Icon 【C#】组件发布:MessageTip,轻快型消息提示窗 【C#】给无窗口的进程发送消息 【手记】WebBrowser响应页面中的blank开新窗口及window.close关闭本窗体 【手记】调用Process.EnterDebugMode引发异常:并非所有引用的特权或组都分配给呼叫方 【C#】DataRowState演变备忘

    [C#]无损转换Image为Icon 如题,市面上常见的方法是: var handle = bmp.GetHicon(); //得到图标句柄 return Icon.FromHandle(handle ...

  5. JavaFX之FXML+CSS创建窗体以及透明窗体添加阴影

    前言 开通博客园有一段日子了,一直没空也没想好该写点什么.最近正好在做一个桌面程序,初次接触JavaFX,体验下来确实比swing好用不少.索性便记记学习笔记吧,虽然FX好像挺没存在感,没人用的感觉. ...

  6. 【手记】WebBrowser响应页面中的blank开新窗口及window.close关闭本窗体

    注:本文适用.net 2.0+的winform项目 目的: 点击页面中的target="_blank"链接时,弹出新窗体 页面中有window.close()操作时,关闭窗体 上述 ...

  7. 设置窗体透明C#代码

    上个示例是C#调用windows api 在原来代码上加入窗体透明,控件不透明代码: using System; using System.Runtime.InteropServices; using ...

  8. window.opener调用父窗体方法的用法

    应用实例:        function BindWindowCloss() {            $(window).bind('beforeunload', function () {    ...

  9. Qt之窗体透明 (三种不同的方法和效果)

    关于窗体透明,经常遇到,网上的资料倒不少,也不知道写的时候是否验证过,很多都不正确...今天就在此一一阐述!       以下各效果是利用以前写过的一个小程序作为示例进行讲解!(代码过多,贴主要部分) ...

随机推荐

  1. codeforces 891 b

    B. Gluttony time limit per test 2 seconds memory limit per test 256 megabytes input standard input o ...

  2. iOS处理视图上同时添加单击与双击手势的冲突问题

    _bgView.userInteractionEnabled = YES; //在cell上添加 bgView,给bgView添加两个手势检测方法 UITapGestureRecognizer *do ...

  3. cocos 2dx 通过循环实现界面图形的摆放

    首先创建一个一维数组 this.starSprites = new Array(); 然后知道星星的间距和坐标后通过如下代码实现位置的摆放 for(var i = 0; i < 6; i++){ ...

  4. 没那么难,谈CSS的设计模式

    没那么难,谈CSS的设计模式 来源: 灵感的小窝  发布时间: 2016-09-09 16:46  阅读: 8949 次  推荐: 27   原文链接   [收藏]   什么是设计模式? 曾有人调侃, ...

  5. CentOS 7.2通过yum安装MairaDB 10.1

    CentOS 7.2自带的yum源中mysql已经被替换成了mariadb,然而却是5.5版本,匹配mysql5.5,想要使用mysql 5.7的特性需要mariadb 10.0或10.1版本,10. ...

  6. JS中同步显示并分割输入的数字字符串

    题目比较晦涩,来张图来说明要表达的效果: 第一张图的效果就是,用户输入一个数字,上面就显示一个大层,然后显示输入的数字,并把数字用空格按照每四位分割出来.好像在建行的网上银行上面就有这种效果.第二个图 ...

  7. .net中的SelectList在Html.DropdownList中的使用

    .net中的SelectList可以用于前端下拉框的内容填充 譬如:Html.DropdownList(下拉框标签名称, SelectList实例) 实际上,上述Html.DropdownList的第 ...

  8. 浅谈react受控组件与非受控组件

    引言 最近在使用蚂蚁金服出品的一条基于react的ant-design UI组件时遇到一个问题,编辑页面时input输入框会展示保存前的数据,但是是用defaultValue就是不起作用,输入框始终为 ...

  9. .NET Core中使用EF Core连接MySQL

    最近一直在捣鼓.NET Core方面的东西,顺便写下点东西记录下 1.打开vs2017,新建一个项目 2.vs会自动生成一个项目,然后打开NuGet搜索MySql.Data.EntityFramewo ...

  10. 2018-2019-2 20175230 实验三《Java面向对象程序设计》实验报告

    目录 实验三 实验三 敏捷开发与XP实践 实验内容 实验要求 实验步骤 (一) 编码标准 (二)敏捷开发与XP (三)敏捷开发与XP 实验体会 实验三 实验三 敏捷开发与XP实践 实验内容 1.XP基 ...