1: ' 说明: 修改用户窗体的窗口样式
2: Option Explicit
3:
4: ' Windows API声明和常量声明
5: Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
6: Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
7: Private Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Long, ByVal bRevert As Long) As Long
8: Private Declare Function DeleteMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long
9: Private Declare Function DrawMenuBar Lib "user32" (ByVal hwnd As Long) As Long
10:
11: Private Const GWL_STYLE As Long = (-16) '窗口样式偏移量
12: Private Const GWL_EXSTYLE As Long = (-20) '窗口扩展样式偏移量
13: Private Const WS_CAPTION As Long = &HC00000 '添加标题栏
14: Private Const WS_SYSMENU As Long = &H80000 '添加系统菜单
15: Private Const WS_THICKFRAME As Long = &H40000 '添加可调整的框架
16: Private Const WS_MINIMIZEBOX As Long = &H20000 '在标题栏中添加最小化框
17: Private Const WS_MAXIMIZEBOX As Long = &H10000 '在标题栏中添加最大化框
18: Private Const WS_EX_DLGMODALFRAME As Long = &H1 '控制是否窗口有图标
19: Private Const WS_EX_TOOLWINDOW As Long = &H80 '工具窗口:最小标题栏
20: Private Const SC_CLOSE As Long = &HF060 '关闭菜单项
21:
22: '用户窗体样式枚举列表
23: Public Enum UserformWindowStyles
24: uwsNoTitleBar = 0
25: uwsHasTitleBar = 1
26: uwsHasSmallTitleBar = 2
27: uwsHasMaxButton = 4
28: uwsHasMinButton = 8
29: uwsHasCloseButton = 16
30: uwsHasIcon = 32
31: uwsCanResize = 64
32: uwsDefault = uwsHasTitleBar Or uwsHasCloseButton
33: End Enum
34:
35: ' 说明: 设置用户窗体的窗口样式的程序
36: '
37: ' 参数: frmForm 要改变样式的用户窗体
38: ' lStyles 设置样式的枚举值,能够将枚举值添加在一起以设置多个样式
39: ' sIconPath 如果设置uwsHasIcon样式,那么这是用于窗体的图标文件的路径
40: '
41: Sub SetUserformAppearance(ByRef frmForm As Object, ByVal lStyles As UserformWindowStyles, Optional ByVal sIconPath As String)
42:
43: Dim sCaption As String
44: Dim hwnd As Long
45: Dim lStyle As Long
46: Dim hMenu As Long
47:
48: '查找窗体的窗口句柄
49: sCaption = frmForm.Caption
50: frmForm.Caption = "FindThis" & Rnd
51: hwnd = FindOurWindow("ThunderDFrame", frmForm.Caption)
52: frmForm.Caption = sCaption
53:
54: '如果要小的标题栏,不要图标,也不要最大化或最小化按钮
55: If lStyles And uwsHasSmallTitleBar Then
56: lStyles = lStyles And Not (uwsHasMaxButton Or uwsHasMinButton Or uwsHasIcon)
57: End If
58:
59: '获取正常的窗口样式位
60: lStyle = GetWindowLong(hwnd, GWL_STYLE)
61:
62: '适当地更新正常的样式位
63: '如果要图标或者最大化、最小化或关闭按钮,则必须有系统菜单
64: ModifyStyles lStyle, lStyles, uwsHasIcon Or uwsHasMaxButton Or uwsHasMinButton Or uwsHasCloseButton, WS_SYSMENU
65:
66: '大多数情况下需要标题栏!
67: ModifyStyles lStyle, lStyles, uwsHasIcon Or uwsHasMaxButton Or uwsHasMinButton Or uwsHasCloseButton Or uwsHasTitleBar Or uwsHasSmallTitleBar, WS_CAPTION
68:
69: ModifyStyles lStyle, lStyles, uwsHasMaxButton, WS_MAXIMIZEBOX
70: ModifyStyles lStyle, lStyles, uwsHasMinButton, WS_MINIMIZEBOX
71: ModifyStyles lStyle, lStyles, uwsCanResize, WS_THICKFRAME
72:
73: '使用正常样式位更新窗口
74: SetWindowLong hwnd, GWL_STYLE, lStyle
75:
76: '获取扩展的样式位
77: lStyle = GetWindowLong(hwnd, GWL_EXSTYLE)
78:
79: '适当地修改
80: ModifyStyles lStyle, lStyles, uwsHasSmallTitleBar, WS_EX_TOOLWINDOW
81:
82: If lStyles And uwsHasIcon Then
83: lStyle = lStyle And Not WS_EX_DLGMODALFRAME
84:
85: '设置图标,如果有
86: SetIcon hwnd, sIconPath
87: Else
88: lStyle = lStyle Or WS_EX_DLGMODALFRAME
89:
90: '设置图标,如果有
91: SetIcon hwnd, ""
92: End If
93:
94: '使用扩展样式位更新窗口
95: SetWindowLong hwnd, GWL_EXSTYLE, lStyle
96:
97: '通过从控制菜单移除处理关闭按钮而不是通过窗口样式位
98: If lStyles And uwsHasCloseButton Then
99: '需要则重置控制菜单
100: hMenu = GetSystemMenu(hwnd, 1)
101: Else
102: '不需要则将其从控制菜单中删除
103: hMenu = GetSystemMenu(hwnd, 0)
104: DeleteMenu hMenu, SC_CLOSE, 0&
105: End If
106:
107: '刷新变化后的窗口
108: DrawMenuBar hwnd
109:
110: End Sub
111:
112: ' 说明: 检查是否样式位被设置和设置/清除了相应的窗口样式位
113: '
114: Private Sub ModifyStyles(ByRef lFormStyle As Long, ByVal lStyleSet As Long, ByVal lChoice As UserformWindowStyles, ByVal lWS_Style As Long)
115:
116: If lStyleSet And lChoice Then
117: lFormStyle = lFormStyle Or lWS_Style
118: Else
119: lFormStyle = lFormStyle And Not lWS_Style
120: End If
121:
122: End Sub