精华内容
下载资源
问答
  • 半透明效果是字面上有能看出来的,但实际上根据MSND,该类型的窗口还能更好的支持非矩形的窗口,使之显示效果更平滑流畅(暗地里猜测是使用了硬件加速而达到的效果)。在win8之前WS_EX_LAYERED只能用于顶层窗口,win...

     

    介绍:

    Layered Windows是windows窗口中的一类,提供类似半透明的效果(阿尔法混合)。半透明效果是字面上有能看出来的,但实际上根据MSND,该类型的窗口还能更好的支持非矩形的窗口,使之显示效果更平滑流畅(暗地里猜测是使用了硬件加速而达到的效果)。在win8之前WS_EX_LAYERED只能用于顶层窗口,win8及之后版本子窗口也可以使用。

    使用:

    首先要做的就是在CreateWindowEx()时加入 WS_EX_LAYERED风格。之后调用SetLayeredWindowAttributes()。该函数原型如下:

      

    BOOL WINAPI SetLayeredWindowAttributes(
      _In_ HWND     hwnd,      //窗口句柄
      _In_ COLORREF crKey,      //设置色彩通道的相对分量 使用RGB宏
      _In_ BYTE     bAlpha,     //阿尔法值,0-225之间
      _In_ DWORD    dwFlags     //LWA_ALPHA或LWA_COLORKEY,或二者都有
    );
    /*
    *LWA_ALPHA :使用阿尔法值显示透明效果
    LWA_COLORKEY:使用RGB通道过滤颜色
    */

    那么两种Flag有什么区别呢,或者说它们分别是什么效果呢?不多说上图就明白了。

    LWA_COLORKEY有效时参数指定的    LWA_ALPHA 有效时对窗口整体使用半

    颜色被视为透明                 透明效果,阿尔法值由参数指定。 

                     

    左侧是LWA_COLORKEY,可以看到在窗口    右侧是 LWA_ALPHA可以看到整体呈现半透明,而且

    上画的RGB=(255,0,255)的圆形被视    在窗口上绘制的圆形也是半透明的。(也注意到对圆型

    为透明                     窗口其坐标还是按矩形的左上角算的) 

     

    两种效果可以同时使用效果,其效果就是一个半透明的黑色月亮。

    可以使用UpdataLayeredWindow()函数更新Layered Window。比如重新设置其透明度,位置,大小,形状等。该函数会更新整个窗口。不需要担心被遮挡的窗口的更新问题,系统会处理好的。(对一个Layered窗口系统总是保存其下面的图像,并自动更新,这意味着占用更多内存,所以不需要时通过SetWindowLong()删除WS_LAYERED风格。这在下面还会说)

    对透明的部分(比如上面左图月牙缺掉的部分或者对右图设置阿尔法值为0)点击鼠标时,鼠标消息会透过窗口,也就是Layered窗口在此处不接受鼠标消息。这很符合所看即所得的设计理念,用户感觉看不到的地方就是没有,他们不必理解什么阿尔法混合。

    如何设置Layered窗口为普通的窗口

    如果不再需要透明效果,尽早去掉Layered属性可以提高性能,标准的做法如下:

    // Remove WS_EX_LAYERED from this window styles
    SetWindowLong(hwnd, 
                  GWL_EXSTYLE,
                  GetWindowLong(hwnd, GWL_EXSTYLE) & ~WS_EX_LAYERED);
    
    // Ask the window and its children to repaint
    RedrawWindow(hwnd, 
                 NULL, 
                 NULL, 
                 RDW_ERASE | RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN);

    最后说一点,如果窗口已经创建好了也有其他的办法,调用SetWindowLong(),重新设置窗口风格即可。但是对一个已经显示在屏幕上的窗口修改其风格为 WS_EX_LAYERED时会发现该窗口不见了,此时调用UpdataLayeredWindow()或SetLayeredWindowAttributes()后会出现你想要的样子。

    另外:一旦 SetLayeredWindowAttributes 被调用了, 之后对 UpdateLayeredWindow 的调用都会失败直到重新改变了窗口的Layered属性。

     

    转载于:https://www.cnblogs.com/painterQ/p/6706547.html

    展开全文
  • 用wpf打造窗口半透明效果

    千次阅读 2011-10-04 15:38:27
    Windows Vista起,Windows的桌面效果就增加了对Aero透明玻璃效果的支持,系统默认的话只是对标题栏或者菜单栏进行半透明处理,如果想实现整个窗口都Aero化的话,得引用一个系统DLL来实现。首先看效果图:   ...

      自Windows Vista起,Windows的桌面效果就增加了对Aero透明玻璃效果的支持,系统默认的话只是对标题栏或者菜单栏进行半透明处理,如果想实现整个窗口都Aero化的话,得引用一个系统DLL来实现。首先看效果图:

     

    这个效果是通过DWM(Destop Window Manager)中的一个API来实现的,关键的代码如下:

     1 private void ExtendAeroGlass(Window window)
     2         {
     3             try
     4             {
     5                 // 为WPF程序获取窗口句柄
     6                 IntPtr mainWindowPtr = new WindowInteropHelper(window).Handle;
     7                 HwndSource mainWindowSrc = HwndSource.FromHwnd(mainWindowPtr);
     8                 mainWindowSrc.CompositionTarget.BackgroundColor = Colors.Transparent;
     9 
    10                 // 设置Margins
    11                 MARGINS margins = new MARGINS();
    12 
    13                 // 扩展Aero Glass
    14                 margins.cxLeftWidth = -1;
    15                 margins.cxRightWidth = -1;
    16                 margins.cyTopHeight = -1;
    17                 margins.cyBottomHeight = -1;
    18 
    19                 int hr = DwmExtendFrameIntoClientArea(mainWindowSrc.Handle, ref margins);
    20                 if (hr < 0)
    21                 {
    22                     MessageBox.Show("DwmExtendFrameIntoClientArea Failed");
    23                 }
    24             }
    25             catch (DllNotFoundException)
    26             {
    27                 Application.Current.MainWindow.Background = Brushes.White;
    28             }
    29         }
    30 
    31         [StructLayout(LayoutKind.Sequential)]
    32         public struct MARGINS
    33         {
    34             public int cxLeftWidth;
    35             public int cxRightWidth;
    36             public int cyTopHeight;
    37             public int cyBottomHeight;
    38         };
    39 
    40         [DllImport("DwmApi.dll")]
    41         public static extern int DwmExtendFrameIntoClientArea(
    42             IntPtr hwnd,
    43             ref MARGINS pMarInset);

    从代码中得知,我们需要引用一个DwmApi.dll文件,然后定义一个函数去实现拓展Aero区域,从而实现整个窗口的Aero化。

    展开全文
  •  这个方法能够实现窗口的背景透明,但是不能设置alpha值,也就是说,没办法做到透的效果。 2,调用SetWindowRgn函数,可以得到一个不规则形状窗口,把需要透明窗口部分去掉。  这个方法说起来不...

     

    做一个项目,需要用到窗口透明,把我学习到的几种方法罗列一下:

     

    1,响应WM_CTLCOLOR消息,在消息函数内,如果需要获取窗口的Brush句柄,返回一个空句柄。

        这个方法能够实现窗口的背景透明,但是不能设置alpha值,也就是说,没办法做到半透的效果。

    2,调用SetWindowRgn函数,可以得到一个不规则形状窗口,把需要透明的窗口部分去掉。

       这个方法说起来不算是真正的窗口透明,但是可以用来创建一个非规则的窗口应用程序。

    3,重载窗口的OnCreate函数,设置扩展属性:

    int CWhiteBoardDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
     if (CDialog::OnCreate(lpCreateStruct) == -1)
      return -1;

     DWORD exStyle = ::GetWindowLong(this->GetSafeHwnd(), GWL_EXSTYLE);
     exStyle |= WS_EX_LAYERED;
     ::SetWindowLong(this->GetSafeHwnd(), GWL_EXSTYLE, exStyle);
     ::SetLayeredWindowAttributes(this->GetSafeHwnd(), RGB(0, 0, 0), 50, LWA_COLORKEY);

     // TODO:  在此添加您专用的创建代码

     return 0;
    }

     

    SetLayeredWindowAttributes函数的最后一个参数,可以指明为Alpha透明。这样可以设置半透的效果。

     

    第三个方法的问题是,整个窗口包括背景和前景都会有alpha效果,有时候只需要背景透明,而前景色保持不变,需要结合第1,3种方法才行。

    展开全文
  • 实现半透明窗口

    千次阅读 2013-09-13 21:52:27
    windows7的系统中,窗口的标题栏和边框的,任务栏等等地方的半透明效果所吸引,那么如果我们作为软件开发的学习者,如果我们自己要开发一个可以半透明的窗口界面,应当如何呢,下面我就为大家讲解一下。...

    在windows7的系统中,窗口的标题栏和边框的,任务栏等等地方的半透明效果所吸引,那么如果我们作为软件开发的学习者,如果我们自己要开发一个可以半透明的窗口界面,应当如何呢,下面我就为大家讲解一下。我这里呢,要讲两个方法。

    第一个方法,就是是使用LAYERED窗口,这个样式的窗口不经能为我们带来帮透明的窗口效果,而且呢,这中窗口样式,还可以帮助我们建立不规则的窗口,平时我们建立的窗口都是方形的,但是使用这种窗口样式呢,我们就可以建立各种复杂的窗口出来,而且只有在有像素的地方才可以接收鼠标消息,没有像素的地方就穿透了,由这个窗口下面的窗口接收到鼠标消息。ok,说的有点远了,言归正传,接着说LAYERED窗口,我们要建立这样的窗口呢,就得用CreateWindowEx函数创建窗口,因为这个函数我们可以指定扩展样式,用了这个函数之后,我们在扩展样式中,指明WS_EX_LAYERED,就可以创建layered窗口,但是在windows7及以前的系统呢,这个样式不能用于子窗口,只能用于主窗口。使用了这个样式之后,那么你就要绘制界面了,这个界面的上的所有元素,都要你自己绘制,具体的绘制过程这里不讨论,这个问题,我在以后的文章中会详细说明。在msdn上也有说明这种窗口样式的特征,不过没有具体的代码和示例程序,一不小心,就不成功。

    第二个方法就是使用桌面窗口管理器,也可以达到半透明的效果,而且呢,还有个特定,那就是背景模糊,透过这个窗口看窗口后面的内容,有镜面效果。同时你再使用桌面管理器中的将标准框架(边框)扩展到客户区,配合背景模糊效果的使用呢,就可以达到背景和边框融合为一体,效果很不错,另外,你在设置颜色的时候,要注意,否则,就会和背面的颜色混合,造成我们窗口的内容不清楚。最好颜色不要太深。或是设置为没有颜色,直接透明,模糊,因为这样不会影响到我们窗口上文字的阅读效果。注意的是,这个只能用于vista及以后的系统,而且系统必须开启了aero效果,如果是家庭版是没有这个效果的,那么也达不到效果。下面给出效果图:


    上面这幅图中呢,中间的播放器界面的窗口界面呢,使用的是layered窗口,由于我不是搞美术出生,所以界面画的很丑,呵呵,由于使用layered窗口,就不能在这个窗口上建立我们的按钮,编辑框等等我们平常使用的控件,我这里的如pause(暂停)等按钮,其实是逻辑窗口,也叫Wondowless,为了我能使用listview控件显示歌单,我就由建立了一个线程,在这个线程中我创建了一个对话框,当中添加listview控件,然后呢,就在这个窗口中,我使用桌面管理器(DWM)实现了窗口的透明化,镜面模糊,边框和客户区一体的效果,最后还有一个小窗口,里面的滑块是用来调节主窗口,也就是播放窗口的透明度的。

    文章前面我说了有关使用DWM时的颜色问题,这里我用了颜色,但是这样,不好,主要表现在会和这个窗口下面的背景产生混合,影响文字的阅读性,这里我用的浅,影响不明显。我建议将颜色值设为RGB(0,0,0,)这样就可以得到以下的效果


    这样就很好,完全融合起来了。


    展开全文
  • Windows Vista起,Windows的桌面效果就增加了对Aero透明玻璃效果的支持,系统默认的话只是对标题栏或者菜单栏进行半透明处理,如果想实现整个窗口都Aero化的话,得引用一个系统DLL来实现。首先看效果图: 这个...
  • Windows Vista开始,Aero Glass效果被应用在了Home Premium以上的系统中(Home Basic不具有该效果)。这种效果是由DWM(Desktop Window Manager)来控制的。对于一般的程序,缺省将在窗口边框应用这种效果。但如果...
  • Windows7无法设置Aero效果/透明效果

    千次阅读 2017-10-01 16:56:59
    打开你的控制面板,在外观和个性化中,如果没有更改半透明窗口颜色或者不能设置,那么检查三个问题:1.Windows版本支不支持2.显卡硬件支不支持3.有没有驱动首先Windows 7 starter和Windows 7 home basic不支持透明...
  • WINDOWS上的透明窗口实现

    千次阅读 2007-01-22 12:57:00
    http://mydone.bokee.com/178980.html(原文)[转者注]实现局部透明窗口一般有两种方法1 用SetLayeredWindowAtrribute 来设置具备WS_EX_LAYERED属性的Popup窗口具有透明效果(只对popup窗口有效,子窗口不能使用)。...
  • VB6.0实现透明窗体,漂亮的透明窗口特效演示,有点像Windows 7的风格,不过测试发现,仅窗口的标题栏处可以透明,或许我没有测试对,总体来说,这个半透明标题栏的窗体,效果还是挺舒服的。
  • 可直接看效果,对着分析。。今天算是bootstrap 入门了,开心。。 突然居然很多事情就是那样,不要太多的畏惧,迈出第一步其实就成功了一半了。 <html ng-app="app"> <head> <script src=".....
  • Android中的Activity有没有类似于像Windows程序样的窗口式显示呢? 答案当然是有。 下图就是一个窗口式Activity的效果图: 下面就说说实现过程: 首先看看AndroidManifest.xml 1: &lt;?xml version=...
  •  2,打开windows xp系统下载... 3,在该界面中选中“启用透明效果”并且选择需要的颜色即可。注:要开启该功能,需要正确安装显卡驱动并且Windows已经使用Aero主题 转载于:https://www.cnblogs.com/mfxp/p/32...
  • VC窗口透明

    2013-07-16 21:51:17
      一、背景 FlashGet的透明效果大家羡慕吧...传统的Windows应用程序想实现半透明效果,一般来说需要处理自己的窗口的WM_Paint消息窗口,很麻烦.现在好了,SetLayeredWindowAttributes是windows的新api,win2000以上才支
  • VC窗口透明

    2010-06-20 14:39:00
    传统的Windows应用程序想实现半透明效果,一般来说需要处理自己的窗口的WM_Paint消息窗口,很麻烦.现在好了,SetLayeredWindowAttributes是windows的新api,win2000以上才支持,它能使使窗体拥有透明效果.我在Google搜了...
  • 也没效果 <p><img alt="59147932-64778e00-8a34-11e9-8c7e-1aa991f6131d" src="https://user-images.githubusercontent.com/16250519/59168121-07c8c000-8b67-11e9-9102-3b9b6fbabd97.gif" /></p><p>该提问来源于...
  • 内容索引:VC/C++源码,其它分类,半透明,渐变 VC++源代码实现Windows窗口的渐变背景,图片背景图慢慢淡出,然后慢慢淡出,在淡出的过程中第二张图渐渐出现,淡入淡出的交替转场效果,如上图可看到一些效果,你最好...
  • MFC对话框简单实现窗口全透明的方法前言: 在...本方法只是实现整个程序的窗口界面(包括客户区)呈现半透明效果,因此很简单。编译及运行需要 Windows Vista 或者 Windows Server 2008 系统的支持并且需要开启透
  • 使窗体拥有透明效果的API

    千次阅读 2011-10-08 20:18:44
    一、背景 FlashGet的透明效果大家...传统的Windows应用程序想实现半透明效果,一般来说需要处理自己的窗口的WM_Paint消息窗口,很麻烦.现在好了,SetLayeredWindowAttributes是windows的新api,win2000以上才支持,它能使
  • 传统的Windows应用程序想实现半透明效果,一般来说需要处理自己的窗口的WM_Paint消息窗口,很麻烦.现在好了,SetLayeredWindowAttributes是windows的新api,win2000以上才支持,它能使使窗体拥有透明效果.我在Google搜了...
  • 使窗体拥有透明效果的API 作者:南海昭信king_koo 下载本文源代码 ...传统的Windows应用程序想实现半透明效果,一般来说需要处理自己的窗口的WM_Paint消息窗口,很麻烦.现在好了,SetLayeredWindowAtt
  •   http://blog.csdn.net/lanyzh0909/archive/2010/08/20/5827354.aspx<br /><br /> 在Windows XP 中实现半透明效果并不是件难事,仅仅只需要调SetLayeredWindowAttributes函数即可。如果同样的效果也想...
  • 原文:http://www.vckbase.com/document/viewdoc/?id=333使窗体拥有透明效果...传统的Windows应用程序想实现半透明效果,一般来说需要处理自己的窗口的WM_Paint消息窗口,很麻烦.现在好了,SetLayeredWindowAttributes是w

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 195
精华内容 78
关键字:

windows窗口半透明效果