Vista Aero 效果的纯 DWM API 实现,以及发光字 etc

news/2024/11/18 8:19:10/

DWM API 的使用已经更新,请见:http://hi.baidu.com/micstudio/blog/item/29ec4cef245164ca2e2e21d3.html
比如:



'很好的代码,粘贴到窗体内即可使用

'缺点:直接使用 GDI+,导致 GDI 绘制的图像及文本出现不正常;在没有使用另外的某 DWM API 时(忘了……),窗口边框与客户区间还会有边界。

'Vista Home Premium 以下(不含)的系统不支持,请勿使用

 

'此源代码为从网上某处搜索得来,感谢原作者!

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
Option  Explicit 
    
Private  Declare  Function  DwmIsCompositionEnabled  Lib  "dwmapi.dll"  ( ByRef  enabledptr  As  Long As  Long
Private  Declare  Function  DwmExtendFrameIntoClientArea  Lib  "dwmapi.dll"  ( ByVal  hWnd  As  Long , margin  As  MARGINS)  As  Long
    
Private  Type MARGINS 
   m_Left  As  Long
   m_Right  As  Long
   m_Top  As  Long
   m_Bottom  As  Long
End  Type 
    
Private  Declare  Function  DwmEnableBlurBehindWindow  Lib  "dwmapi"  ( ByVal  hWnd  As  Long , pBlurBehind  As  DWM_BLURBEHIND)  As  Long
Private  Declare  Function  DwmEnableComposition  Lib  "dwmapi"  ( ByVal  bEnabled  As  Long As  Long
    
Private  Const  DWM_BB_ENABLE = &H1& 
Private  Const  DWM_BB_BLURREGION = &H2& 
Private  Const  DWM_BB_TRANSITIONONMAXIMIZED = &H4 
    
Private  Type DWM_BLURBEHIND 
     dwFlags  As  Long
     fEnable  As  Long
     hRgnBlur  As  Long
     fTransitionOnMaximized  As  Long
End  Type 
    
Private  Declare  Function  GetWindowLong  Lib  "user32"  Alias  "GetWindowLongA"  ( ByVal  hWnd  As  Long ByVal  nIndex  As  Long As  Long
    
Private  Const  LWA_COLORKEY = &H1 
Private  Const  WS_EX_LAYERED = &H80000 
Private  Const  GWL_EXSTYLE = (-20) 
    
Private  Declare  Function  SetWindowLong  Lib  "user32"  Alias  "SetWindowLongA"  ( ByVal  hWnd  As  Long ByVal  nIndex  As  Long ByVal  dwNewLong  As  Long As  Long
Private  Declare  Function  SetLayeredWindowAttributesByColor  Lib  "user32"  Alias  "SetLayeredWindowAttributes"  ( ByVal  hWnd  As  Long ByVal  crey  As  Long ByVal  bAlpha  As  Byte ByVal  dwFlags  As  Long As  Long
    
Private  Type RECT 
         Left  As  Long
         Top  As  Long
         Right  As  Long
         Bottom  As  Long
End  Type 
    
Private  Declare  Function  CreateSolidBrush  Lib  "gdi32"  ( ByVal  crColor  As  Long As  Long
Private  Declare  Function  SelectObject  Lib  "gdi32"  ( ByVal  hdc  As  Long ByVal  hObject  As  Long As  Long
Private  Declare  Function  GetClientRect  Lib  "user32"  ( ByVal  hWnd  As  Long , lpRect  As  RECT)  As  Long
Private  Declare  Function  DeleteObject  Lib  "gdi32"  ( ByVal  hObject  As  Long As  Long
Private  Declare  Function  FillRect  Lib  "user32"  ( ByVal  hdc  As  Long , lpRect  As  RECT,  ByVal  hBrush  As  Long As  Long
    
Private  Sub  Form_Load() 
Dim  m_transparencyKey   As  Long
m_transparencyKey = 0 
SetWindowLong  Me .hWnd, GWL_EXSTYLE, GetWindowLong( Me .hWnd, GWL_EXSTYLE)  Or  WS_EX_LAYERED 
SetLayeredWindowAttributesByColor  Me .hWnd, &HC8C9CA, 0, LWA_COLORKEY 
Dim  mg  As  MARGINS, en  As  Long
mg.m_Left = -1 
mg.m_Bottom = -1 
mg.m_Right = -1 
mg.m_Top = -1 
Dim  R&, t&, bb  As  DWM_BLURBEHIND 
bb.dwFlags = DWM_BB_ENABLE  Or  DWM_BB_BLURREGION 
bb.fEnable = 1 
bb.hRgnBlur = 0 
bb.fTransitionOnMaximized = 1 
DwmEnableBlurBehindWindow hWnd, bb 
End  Sub
    
Private  Sub  Form_Paint() 
Dim  hBrush  As  Long , m_Rect  As  RECT, hBrushOld  As  Long
hBrush = CreateSolidBrush(&HC8C9CA) 
hBrushOld = SelectObject( Me .hdc, hBrush) 
GetClientRect  Me .hWnd, m_Rect 
FillRect  Me .hdc, m_Rect, hBrush 
SelectObject  Me .hdc, hBrushOld 
DeleteObject hBrush 
End  Sub

如果上面的代码在 VB .NET 中直接用 AllowTransparency 和 TransparencyKey 实现,则会得到完美玻璃化(无边框)的效果。

 

+新内容

以及自己根据资料写的一个函数,绘制发光文本(使用 VB .NET):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
Public  Function  DrawGlowingText( ByVal  hDC  As  IntPtr,  ByVal  Text  As  String ByVal  Font  As  Font,  ByVal  Color  As  Color,  ByVal  Rect  As  Rectangle,  ByVal  GlowSize  As  Integer As  Integer
     Dim  hTheme  As  Integer  = OpenThemeData(GetDesktopWindow,  "TextStyle"
     If  hTheme > 0  Then
         Dim  dib  As  New  BITMAPINFO 
         Dim  dto  As  New  DTTOPTS 
         Dim  hMemDC  As  Integer  = CreateCompatibleDC(hDC) 
   
         With  dib.bmiHeader 
             .biSize = 40 
             .biWidth = Rect.Width * 40 
             .biHeight = -Rect.Height * Font.Size 
             .biPlanes = 1 
             .biBitCount = 32 
             .biCompression = BI_RGB 
         End  With
   
         With  dto 
             .dwSize = Len(dto) 
             .dwFlags = DTT_GLOWSIZE  Or  DTT_COMPOSITED  Or  DTT_TEXTCOLOR 
             .iGlowSize = GlowSize 
   
             .crText = ARGB2RGB(Color)     '注意,.NET 中以 ARGB 方式保存颜色信息,而 Windows Theme API 以 RGB 方式解读信息 
         End  With
   
         Font =  New  Font(Font.FontFamily.Name, Font.Size) 
   
         Dim  hDIB  As  Integer  = CreateDIBSection(hDC, dib, DIB_RGB_COLORS, 0, 0, 0) 
         Dim  hObjectOld  As  Integer  = SelectObject(hMemDC, hDIB) 
         SelectObject(hMemDC, Font.ToHfont()) 
   
         Rect.X = Rect.X + GlowSize 
   
         DrawThemeTextEx(hTheme, hMemDC, 0, 0, Text, -1, 0, Rect, dto) 
         BitBlt(hDC, Rect.Top, Rect.Left, Rect.Width, Rect.Height, hMemDC, 0, 0, SRCCOPY) 
   
         SelectObject(hMemDC, hObjectOld) 
         'SetTextColor(hMemDC, intOldTextColor) 
         DeleteObject(hDIB) 
         DeleteDC(hMemDC) 
   
         CloseThemeData(hTheme) 
         Return 
     Else
         Return  GetLastError() 
     End  If
End  Function

附:最好是使用相应 WM_PAINT 消息时将窗体整个用黑色画刷填充,然后再向上面绘制图片、文字(DrawThemeTextEx 或者 GraphicsPath 均可),这才是最终的解决方案。

 

相关声明嘛……啊我放在另一个模块里面了,比较乱,不复制了,网上都有。


http://www.ppmy.cn/news/696433.html

相关文章

使用DWM API画自定义Aero效果窗口

原文地址 Custom Window Frame Using DWM This topic demonstrates how to use the Desktop Window Manager (DWM) APIs to create custom window frames for your application. Introduction Extending the Client Frame Removing the Standard Frame Drawing in the Exten…

Windows Vista Aero效果应用全攻略

2008-01-15 12:00:00 作者:佚名 出处:天极网软件频道 责任编辑:原野 Windows Vista提供了一种非凡的视觉体验,我们称之为Aero。Windows Aero可用于更改窗口颜色,并使窗口边框实现玻璃般的透明效果。   注 : Aero 特…

ubuntu装nvidia驱动,CUDA的血泪

必须在非图形界面安装! 以前几台笔记本都是在图形界面装得,没啥问题。这台aero15很奇怪。 重装ubuntu16.04后第一时间装上本地deb。在命令行中有nvidia-smi,但是装了一些其他的东西(zed2.1 opencv3.2 3.1 boost1.64 ceres&#…

关于window7 AERO 声音 IIS 无线网络失效的解决办法

。 反正是不太乐意重做系统的。。。。 呵呵。。。 懒人懒想法!!!! 转载于:https://www.cnblogs.com/jinlun/archive/2010/11/22/1884363.html

CSS3 Aero。

今天偶然间在寻找炫丽设计效果的,在国外某网站发现了这个效果。。 这也算是转载的吧,为了发挥原创精神,所以还是写注释了。 主要还是依靠CSS3的box-shadow #aero{z-index:2;width:480px;height:auto;margin:5 0 0 8;padding:0;border:1px so…

windows aero词条

win7对我这个有点近视的人看来,显示效果不错,其实XP也可以清晰地显示,比如说调大字体,浏览器装上silverlight什么的。 Windows Aero 目录 Windows Aero 简介 目前支持Windows Aero的操作系统 功能介绍 AeroGlass 动态窗口 高点/英…

C#实现具有Aero效果的窗体

 看了一下,网上的教程与代码有点复杂…因此,查阅资料后,这篇文章就诞生了… 先看效果图: 虽然运行起来很漂亮..不过,当你设计的时候,就是你头痛的了…看下设计图…嘿嘿嘿嘿…. 主要代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 2…

WPF Aero Glass Window

WPF Aero Glass Window 原文: WPF Aero Glass Window 用法 Win7 DwmSetWindowAttribute functionWin10 SetWindowCompositionAttribute代码 1 using System;2 using System.Collections.Generic;3 using System.Linq;4 using System.Runtime.InteropServices;5 using System.Te…