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 0
Else Return GetLastError()
End If End Function |
附:最好是使用相应 WM_PAINT 消息时将窗体整个用黑色画刷填充,然后再向上面绘制图片、文字(DrawThemeTextEx 或者 GraphicsPath 均可),这才是最终的解决方案。
相关声明嘛……啊我放在另一个模块里面了,比较乱,不复制了,网上都有。