//为窗体添加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. 如果datanode连接不上namenode,导致datanode无法启动。

    如果datanode连接不上namenode,导致datanode无法启动. 问题:  ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: j ...

  2. js-数组方法push

    <script type="text/javascript">        var arr=[1,2,3,4,5]        arr.push(6,7)      ...

  3. Http TCP/IP协议和socket之间的区别和联系

    总结,TCP/IP是传输层协议,主要解决数据如何在网路中传输,socket是TCP/IP协议的具体实现,是对TCP/IP协议的封装和应用,属于程序员层面,HTTP是应用层协议,应用层协议很多,类似的像 ...

  4. Android-Kotlin-区间与for&List&Map简单使用

    区间与for: package cn.kotlin.kotlin_base04 /** * 区间与for */ fun main(args: Array<String>) { /** * ...

  5. C# 根据偶数、奇数加载不同颜色

    效果图: C#后台代码 //偶数随机 Random evenRanm = new Random(); //奇数随机 Random oddRanm = new Random(); string[] li ...

  6. 【BZOJ4755】 [Jsoi2016]扭动的回文串

    BZOJ4755 [Jsoi2016]扭动的回文串 Solution 考虑对于他给出的 A中的一个回文串: B中的一个回文串: 或者某一个回文的扭动字符串S(i,j,k) 这样子几个限制,我们1,2就 ...

  7. SpringCloud实现集群和负载均衡

    Spring cloud是一个基于Spring Boot实现的服务治理工具包,在微服务架构中用于管理和协调服务的. 组成部分 spingcloud的五大神兽 服务发现——Netflix Eureka ...

  8. 利用adb 打开手机应用程序

    通过adb打开android应用,我们需要做的第一步,就是查看当前app的入口,第二部,就是通过命令启动我们的app入口 查看app的启动画面 在运行下面命令时,先启动想要通过adb打开的app #查 ...

  9. nginx在Linux下的安装

    安装之前的环境装备: 1.ngiinx 是C 语言开发的,我们上传的文件还是源码,需要gcc环境编译源码 : yum install gcc-c++ 2.nginx的http模块使用pcre来解析正则 ...

  10. sql 游标 跳出循环 和进入下一个循环

    1  使用break 结束整个循环. 2  使用continue 结束当前循环,进入下已循环. 注意:使用continue造成死循环,是因为continue后又执行与上次相同的fetch了. 解决办法 ...