UpdateLayeredWindow与SetLayeredWindowAttributes
首先使用透明之前必须设置该窗口为层级窗口,即增加窗口的扩展风格WS_EX_LAYERED,增加的时候最好使用GetWindowlong获取Ex风格,然后加入后在SetWindowLong设置,最好不适用ModifyStyle增加(有时候不好使,我用vs10可以,但08却不行)。
UpdateLayeredWindow使用之后不会再发出WM_PAINT绘制消息,所有的绘制消息都由UpdateLayeredWindow代而处理,所以不要再OnPaint里做任何事,因为是徒劳的(可能在调用Update..之前有用)。
UpdateLayeredWindow是用兼容的dc去更新当前窗口的dc,所有必须要在兼容的dc上绘制好后去更新当前窗口,故而所有操作应该绘制到兼容的dc上,然后用兼容dc去调用UpdateLayeredWindow去透明更新。
UpdateLayeredWindow最后的参数表明透明的方式,第一种是ULW_ALPHA说明是使用图片本身的Alpha通道去透明(鼠标穿透)当前窗口(如果是最新的bmp格式,支持alpha通道,但必须是32四子节的,否则为3字节即24bit,如果使用4字节,最后字节为alpha通道,该通道决定透明度,如果非得填写24bit即3字节,那么默认的一个alpha通道0,也就是说透明度为0是看不见的,切记!!),如果是这样那么BLENDFUNCTION中的SourceConstantAlpha“源常量透明alpha”是没有用的,如果是用ULW_COLORKEY则说明用颜色掩码去透明窗口,也就是说兼容dc中所绘制的画布中如果颜色与掩码色相同则把这部分透明掉(要在兼容dc中绘制透明色);(SourceConstantAlpha不为0则用该值去透明);
SetLayeredWindowAttributes相当于UpdateLayeredWindow的第二种方法及ULW_COLORKEY,SetLayeredWindow不会导致WM_PAINT不发出,也就是可以在OnPaint中绘制你的东西,但是绘制的颜色如果和SetLayeredWindow中指定的一致则透明掉,否则不透明,另外SetLayeredWindow中透明的地方是可以放置其他组建的!!而UpdateLayeredWindow则不可以(鼠标穿透)。
SetLayeredWindowAttributes经测试必须是非child窗口(Overlapend或PoupUp),否则设置无效!!
在6.0上SetLayeredWindowAttributes使用掩码色的时候也就是第二个参数为掩码色,最后参数为LWA_COLORKEY的时候,只要覆盖控件颜色即可,我使用OnctrlColor返回掩码色画刷,可以将整个窗口置为透明,然后再OnPaint里面绘制非掩码色的图形,即可达到只显示绘制部分图形目的,但是,在VS08中使用alpa透明度透明整个窗口可以达到目的,而使用掩码色的时候无论在OnctrlColor返回何种掩码色,参数中设置该掩码色都是透明的(这点在08中为什么不可用还没搞明白),但是如果去掉OnPaint消息函数却可以达到掩码色透明的作用(或者OnPaint中必须调用父类的OnPaint,否则不起作用!)。
SetLayeredWindowAttributes和UpdateLayeredWindow都可以使得透明区域鼠标穿透,但是实际测试的时候vc6.0上SetLayeredWindowAttributes有时候可以有时候不可以(与鼠标移动快慢有关)。
很重要的一个问题就是vc6.0和vs2008中函数指定的调用约定不一致,vc6.0默认是_stdcall 和vs中函数则不是,所以如果在vs中申明User32.dll中的函数的时候必须手动指定调用约定为WINAPI 或CALLBACK或__stdcall类型,否则在GetProcAddr的时候返回类型不一致,在调用UpdateLayeredWindow或SetLayeredWindowAttributes的时候会出现堆栈被破坏错误!!:Run-Time Check Failure ...
UpdateLayeredWindow与SetLayeredWindowAttributes的另一区别是:UpdateLayeredWindow上所有的东西(包括子控件都必须自己绘制上去,自己响应事件)都由个人处理;SetLayeredWindowAttributes则仅仅处理该窗口的掩码色处理成透明色或将整个窗口的透明度设置为LWA_ALPHA 指定的不透明度值,不影响其他子控件的处理;
以下为updatelayeredwindow使用实例:
void CDlgVideoCompressPage::DrawUI(void)
{
if(NULL == m_hWnd)
return ;
CRect rtClient;
GetClientRect(&rtClient);
HDC hDC = ::GetDC(m_hWnd);
HDC hMemDC = ::CreateCompatibleDC(hDC);
BITMAPINFO bitmapinfo;
bitmapinfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bitmapinfo.bmiHeader.biBitCount = 32;
bitmapinfo.bmiHeader.biHeight = rtClient.Height();
bitmapinfo.bmiHeader.biWidth = rtClient.Width();
bitmapinfo.bmiHeader.biPlanes = 1;
bitmapinfo.bmiHeader.biCompression = BI_RGB;
bitmapinfo.bmiHeader.biXPelsPerMeter = 0;
bitmapinfo.bmiHeader.biYPelsPerMeter = 0;
bitmapinfo.bmiHeader.biClrUsed = 0;
bitmapinfo.bmiHeader.biClrImportant = 0;
bitmapinfo.bmiHeader.biSizeImage = bitmapinfo.bmiHeader.biWidth * bitmapinfo.bmiHeader.biHeight * bitmapinfo.bmiHeader.biBitCount / 8;
HBITMAP hBitmap = ::CreateDIBSection (hMemDC, &bitmapinfo, 0, NULL, 0, 0);
HBITMAP hOldBitmap = (HBITMAP)::SelectObject (hMemDC, hBitmap);
// draw image
CImage img;
if (SUCCEEDED(img.Load(m_strBkImage)))
{
CRect rtClient;
GetClientRect(&rtClient);
img.Draw(hMemDC, rtClient.left, rtClient.top, rtClient.Width(), rtClient.Height(), 0, 0, img.GetWidth(), img.GetHeight());
img.Destroy();
}
CPoint DestPt(0,0);
CSize psize(rtClient.Width(), rtClient.Height());
BLENDFUNCTION blendFunc32bpp;
blendFunc32bpp.AlphaFormat = AC_SRC_ALPHA;
blendFunc32bpp.BlendFlags = 0;
blendFunc32bpp.BlendOp = AC_SRC_OVER;
blendFunc32bpp.SourceConstantAlpha = 255;
::UpdateLayeredWindow(m_hWnd, hDC, NULL, &psize, hMemDC, &DestPt,0,&blendFunc32bpp, ULW_ALPHA);
::SelectObject (hMemDC,hOldBitmap);
::DeleteObject(hBitmap);
::DeleteDC(hMemDC);
::ReleaseDC(m_hWnd,hDC);
}
UpdateLayeredWindow与SetLayeredWindowAttributes的更多相关文章
- DUI-分层窗口两种模式(SetLayeredWindowAttributes和UpdateLayeredWindow两种方法各有利弊)
LayeredWindow提供两种模式: 1.使用SetLayeredWindowAttributes去设置透明度, 完成窗口的统一透明,此时窗口仍然收到PAINT消息, 其他应用跟普通窗口一样. 2 ...
- [用UpdateLayeredWindow实现任意异形窗口]
前面提到,我们可以用SetWindowRgn或SetLayeredWindowAttributes实现不规则以及半透明的效果 对于SetWindowRgn,它通过一个Rgn来设置区域,这个Rgn一般可 ...
- c# UpdateLayeredWindow异形窗口
#region UpdateLayeredWindow #region 重写窗体的 CreateParams 属性 protected override CreateParams CreatePara ...
- 一个用UpdateLayeredWindow实现窗体半透明的delphi的代码
http://www.pudn.com/downloads171/sourcecode/windows/detail791686.html unit Unit1; interface uses ...
- UpdateLayeredWindow是炫效果的关键
自绘——是的,输入框每个字都自己绘制,计算行宽,行高,模拟光标闪烁,处理输入法的各种事件,以及选中,拖动等功能. 支持支持一下,实际上无句柄的,就是多行富文本编辑比较麻烦,其他的,都不复杂.很容易实现 ...
- 设置windows窗口半透明(使用SetLayeredWindowAttributes API函数)
所需函数原型:BOOL WINAPI SetLayeredWindowAttributes(HWND hWnd, COLORREFcrKey, BYTE bAlpha, DWORD flag); ...
- 透明窗口(窗口上面文字图片等内容不透明)的实现(使用SetLayeredWindowAttributes API函数)
透明窗口(窗口上面文字图片等内容不透明)的实现 本文讨论通过SetLayeredWindowAttributes来实现本文的目的. SetLayeredWindowAttributes的实现必须将窗口 ...
- VC++ SetLayeredWindowAttributes 部分窗口透明鼠标穿透
在初始化中使用下面两行代码 ModifyStyleEx(0, WS_EX_LAYERED); ::SetLayeredWindowAttributes(m_hWnd, RGB(1, 255, 0), ...
- UpdateLayeredWindow后,使用Gdi DrawText文字透明的解决办法
来源:http://stackoverflow.com/questions/5309914/updatelayeredwindow-and-drawtext 要点就是在先在memDc DrawText ...
随机推荐
- javascript基础入门之js中的数据类型与数据转换01
javascript基础入门之js中的数据结构与数据转换01 js的组成(ECMAScript.BOM.DOM) js中的打印语句: 数据类型 变量 ...
- HTML常见问题
一.外边距,margin: 垂直外边距的重叠:在网页中相邻的垂直方向的外边距会发生外边距的重叠 所谓的外边距重叠指兄弟元素之间的相邻外边距会取最大值而不是取和. .box1{margin-bottom ...
- 2019-4-29-.NET-Standard
title author date CreateTime categories .NET Standard lindexi 2019-4-29 12:7:26 +0800 2018-2-13 17:2 ...
- 常用的Docker镜像及处理命令
常用的镜像命令 docker run -d --name dockerui -p : -v /var/run/docker.sock:/var/run/docker.sock abh1nav/dock ...
- visual studio snippet备忘
一.C++ classheadercpp.snippet <?xml version="1.0" encoding="utf-8"?> <Co ...
- [JZOJ 5807] 简单的区间
题目: 求有多少组二元组\((l,r)\)使得:\(1<=l<=r<=n,k|f(l,r)\) \(f(l,r) = \sum_{i=l}^{r}a_i - max_{i=l}^{r ...
- sqlalchemy之create_engine和session
sqlalchemy之create_engine和session orm 实质上,一个O/R Mapping会为你生成DAL.(即为数据访问层(Data Access Layer).其功能主要是负责数 ...
- 探索NDIS HOOK新的实现方法(1)
NDIS HOOK是专业级防火墙使用的一种拦截技术,NDIS HOOK的重点是如何获得特定协议对应NDIS_PROTOCOL_BLOCK指针,获得了该指针,接下来就可以替换该协议所注册的收发函数,而达 ...
- Altium Designer 精心总结(转)
https://blog.csdn.net/qq_29350001/article/details/52199356 设置铺铜间距规则,Electrical-Clearence_Poly设置如下,是铺 ...
- 如何在html中添加视频
<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="445" heig ...