首先使用透明之前必须设置该窗口为层级窗口,即增加窗口的扩展风格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的更多相关文章

  1. DUI-分层窗口两种模式(SetLayeredWindowAttributes和UpdateLayeredWindow两种方法各有利弊)

    LayeredWindow提供两种模式: 1.使用SetLayeredWindowAttributes去设置透明度, 完成窗口的统一透明,此时窗口仍然收到PAINT消息, 其他应用跟普通窗口一样. 2 ...

  2. [用UpdateLayeredWindow实现任意异形窗口]

    前面提到,我们可以用SetWindowRgn或SetLayeredWindowAttributes实现不规则以及半透明的效果 对于SetWindowRgn,它通过一个Rgn来设置区域,这个Rgn一般可 ...

  3. c# UpdateLayeredWindow异形窗口

    #region UpdateLayeredWindow #region 重写窗体的 CreateParams 属性 protected override CreateParams CreatePara ...

  4. 一个用UpdateLayeredWindow实现窗体半透明的delphi的代码

    http://www.pudn.com/downloads171/sourcecode/windows/detail791686.html unit Unit1; interface  uses   ...

  5. UpdateLayeredWindow是炫效果的关键

    自绘——是的,输入框每个字都自己绘制,计算行宽,行高,模拟光标闪烁,处理输入法的各种事件,以及选中,拖动等功能. 支持支持一下,实际上无句柄的,就是多行富文本编辑比较麻烦,其他的,都不复杂.很容易实现 ...

  6. 设置windows窗口半透明(使用SetLayeredWindowAttributes API函数)

    所需函数原型:BOOL WINAPI SetLayeredWindowAttributes(HWND hWnd,  COLORREFcrKey,  BYTE bAlpha,  DWORD flag); ...

  7. 透明窗口(窗口上面文字图片等内容不透明)的实现(使用SetLayeredWindowAttributes API函数)

    透明窗口(窗口上面文字图片等内容不透明)的实现 本文讨论通过SetLayeredWindowAttributes来实现本文的目的. SetLayeredWindowAttributes的实现必须将窗口 ...

  8. VC++ SetLayeredWindowAttributes 部分窗口透明鼠标穿透

    在初始化中使用下面两行代码 ModifyStyleEx(0, WS_EX_LAYERED); ::SetLayeredWindowAttributes(m_hWnd, RGB(1, 255, 0), ...

  9. UpdateLayeredWindow后,使用Gdi DrawText文字透明的解决办法

    来源:http://stackoverflow.com/questions/5309914/updatelayeredwindow-and-drawtext 要点就是在先在memDc DrawText ...

随机推荐

  1. TRUNCATE - 清空一个表

    SYNOPSIS TRUNCATE [ TABLE ] name DESCRIPTION 描述 TRUNCATE 快速地从一个表中删除所有行.它和无条件的 DELETE 有同样的效果,不过因为它不做表 ...

  2. centos7 sshd 安全设置

    ssh 的安全机制 1.SSH之所以能够保证安全,原因在于它采用了非对称加密技术(RSA)加密了所有传输的数据.   2.传统的网络服务程序,如FTP等在网络上用明文传送数据.用户帐号和用户口令,很容 ...

  3. QT开发资料

    QT开发入门资料 https://tmr.js.org/p/cc37608/ QT学习之路: https://www.devbean.net/

  4. Tools: java安装指南

    参考: https://www.cnblogs.com/smyhvae/p/3788534.htmljava安装 (1)新建->变量名"JAVA_HOME",变量值" ...

  5. docker gitlab backup

    说明:下面命令中带有<your container name>字,是 gitlab 容器的名称,请按实际情况进行代替 在创建备份之前,你不需要停止任何东西 docker exec -t & ...

  6. spark在collect收集数据的时候出现outOfMemoryError:java heap space

    spark的collect是action算子,所有最后会以数组的形式返回给driver端,当数据太大的时候就会出现堆内存溢出.OutofMemoryError:java heap space. 在sp ...

  7. CUDA并行计算 | 线程模型与内存模型

    文章目录 前言 CUDA线程模型(如何组织线程) CUDA内存模型(了解不同内存优缺点,合理使用) 前言   CUDA(Compute Unified Device Architecture)是显卡厂 ...

  8. hdu多校第八场 1010(hdu6666) Quailty and CCPC 排序/签到

    题意: CCPC前10%能得金牌,给定队伍解题数和罚时,问你有没有一个队伍如果向上取整就金了,四舍五入就银了. 题解: 排序后按题意求解即可. #include<iostream> #in ...

  9. Spring-Security (学习记录七)--实现FilterInvocationSecurityMetadataSource的类将无法切入声明式事物

    目录 1 查看继承关系 2 说明 3 查看源码: 实现了FilterInvocationSecurityMetadataSource 的类将无法切入声明式事物. 原因: 1 查看继承关系 先查看Fil ...

  10. Python 爬虫-爬取京东手机页面的图片

    具体代码如下: __author__ = 'Fred Zhao' import requests from bs4 import BeautifulSoup import os from urllib ...