anhtuan1066
Thành viên gạo cội




- Tham gia
- 10/3/07
- Bài viết
- 5,802
- Được thích
- 6,912
Hôm nay tôi viết bài này với mục đích tổng quát hóa những vấn đề liên quan đến cửa sổ User như điều khiển nút Max, Min, Close, Title Bar, Resize Form, Set Icon... vân vân...
Bài đầu tiên chúng ta sẽ nghiên cứu 4 món: Max, Min, Close Button và Title Bar
Code gồm 2 phần
1> Các hàm API hổ trợ
2> Code chính
--------------------------------------------------------------------------------------
Áp dụng
Để sử dụng nó, chỉ cần viết code trong UserForm theo cú pháp:
Ví dụ
Câu lệnh trên sẽ tạo ra 3 nút Max, Min và Close Button cho UserForm
Có vài điểm các bạn cần lưu ý:
- Max, Min và Close Button chỉ xuất hiện nếu có fwsTitBar trong GIÁ TRỊ
- Small Caption khi xuất hiện sẽ làm mất Max và Min Button
- Giá trị fwsTitBar có thể xem là System Menu
Vì các lưu ý trên, nếu viết code như thế này:
Thì cũng chỉ thu được 1 UserForm với Caption thu nhỏ + Nút Close đã bị vô hiệu hóa (fwsMinBtn + fwsMaxBtn chẳng có tác dụng gì)
- Ngay khi các bạn vừa gõ chữ SetStyles Me, thì sau dấu phẩy các bạn sẽ thấy 1 Tooltip xuất hiện cho các bạn chọn giá trị như hình:

Tôi đã thí nghiệm và tổng hợp thành 1 bảng như sau:

--------------------------------------------------------------------------------------
Dưới đây là 1 vài hình ảnh minh họa mà tôi đã thiết kế cho UserForm



(Xem file UserFormStyles_3.xls)
--------------------------------------------------------------------------------------
Các bạn có thể lưu code này thành 1 Add-In để dùng lâu dài
- Giả sử rằng các bạn đã lưu file thành 1 Add-In
- Giả sử rằng Add-In ấy đã được load (trong menu Tools\Add Ins...)
- Giả sử rằng các bạn vừa thiết kế 1 UserForm mới
- Để dùng Add-In này cho UserForm thì trong cửa sổ VBA Editor, các bạn vào menu Tools\References và check vào tên của Project (trong file này tên ấy là UserForm_Windows_Styles)

- Viết code cho UserForm cũng theo cú pháp như đã nói ở trên
- Khi lưu Add-In, các bạn hãy xóa UserForm đi, chỉ cần chừa lại code trong Module là đủ (đã làm sẳn cho các bạn ở file UFWStyles.xls)
--------------------------------------------------------------------------------------
Chúng ta biết rằng đây là Style chuẩn của Windows nên cái gì các bạn làm được trên UserForm thì cũng có thể làm y thế đối với bất kỳ cửa sổ ứng dụng nào... Chẳng hạn có thể dùng code này để thay đổi Style cho Form trong VB6 hoặc thậm chí thay đổi các nút và Title Bar trong chính cửa sổ Excel (làm mất nút Max, Min, Close trong cửa sổ Excel)
- Để thực hiện các thay đổi về Style cho Form trong VB6, chỉ cần sửa đoạn code:
thành:
- Để thực hiện các thay đổi về Style cho cửa sổ Excel, chỉ cần sửa đoạn code:
thành:
(đoạn code trên nằm trong Sub SetStyles)
--------------------------------------------------------------------------------------
Việc viết code cho từng phần hiển thị riêng lẽ thật dễ dàng (chẳng hạn viết code chỉ để ẩn nút Close).. nhưng với mục đích TỔNG QUÁT HÓA, tích hợp mọi thứ vào chung trong 1 code thì quả thật rất khó khăn (ít nhất là với trình độ hiểu biết của tôi)
Còn mấy phần về Resize Form, Set Icon, TaskBar Icon tôi vẫn đang tìm hiểu.. (vẫn chưa tích hợp chung vào code được, mặc dù viết riêng không có vấn đề)...
Rất mong sự đóng góp bài viết của các cao thủ khác (như TuanVNUNI, levanduyet) để hoàn thiện bài viết này
Bài đầu tiên chúng ta sẽ nghiên cứu 4 món: Max, Min, Close Button và Title Bar
Code gồm 2 phần
1> Các hàm API hổ trợ
PHP:
Declare Function GetWindowLong Lib "user32" Alias _
"GetWindowLongA" (ByVal hWnd As Long, _
ByVal nIndex As Long) As Long
Declare Function GetSystemMenu Lib "user32" _
(ByVal hWnd As Long, ByVal bRevert As Long) As Long
Declare Function DeleteMenu Lib "user32" _
(ByVal hMenu As Long, ByVal nPosition As Long, _
ByVal wFlags As Long) As Long
Declare Function DrawMenuBar Lib "user32" _
(ByVal hWnd As Long) As Long
Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
(ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
PHP:
Const GWL_STYLE As Long = (-16)
Const GWL_EXSTYLE As Long = (-20)
Const WS_SYSMENU As Long = &H80000
Const WS_CAPTION As Long = &HC00000
Const WS_MINIMIZEBOX As Long = &H20000
Const WS_MAXIMIZEBOX As Long = &H10000
Const WS_EX_TOOLWINDOW As Long = &H80
Const SC_CLOSE As Long = &HF060
PHP:
Public Enum frmWinStyles
fwsTitBar = 1
fwsSmlBar = 2
fwsMaxBtn = 4
fwsMinBtn = 8
fwsClsBtn = 16
End Enum
PHP:
Sub SetStyles(ByRef frmForm As Object, ByVal lStyles As frmWinStyles)
Dim hWnd As Long, lStyle As Long, hMenu As Long, i As Long
hWnd = FindWindow("ThunderDFrame", frmForm.Caption)
If lStyles And fwsSmlBar Then lStyles = lStyles And Not (fwsMaxBtn Or fwsMinBtn)
lStyle = GetWindowLong(hWnd, GWL_STYLE)
ModifyStyles lStyle, lStyles, fwsMaxBtn + fwsMinBtn + fwsClsBtn + fwsTitBar, WS_SYSMENU
ModifyStyles lStyle, lStyles, fwsMaxBtn + fwsMinBtn + fwsClsBtn + fwsTitBar + fwsSmlBar, WS_CAPTION
ModifyStyles lStyle, lStyles, fwsMaxBtn, WS_MAXIMIZEBOX
ModifyStyles lStyle, lStyles, fwsMinBtn, WS_MINIMIZEBOX
ModifyStyles lStyle, lStyles, fwsTitBar, WS_SYSMENU
SetWindowLong hWnd, GWL_STYLE, lStyle
lStyle = GetWindowLong(hWnd, GWL_EXSTYLE)
ModifyStyles lStyle, lStyles, fwsSmlBar, WS_EX_TOOLWINDOW
SetWindowLong hWnd, GWL_EXSTYLE, lStyle
hMenu = GetSystemMenu(hWnd, -((lStyles And fwsClsBtn) = 16))
If Not lStyles And fwsClsBtn Then DeleteMenu hMenu, SC_CLOSE, 0&
DrawMenuBar hWnd
End Sub
PHP:
Sub ModifyStyles(ByRef lFormStyle As Long, ByVal lStyleSet As Long, ByVal lChoice As frmWinStyles, ByVal lWS_Style As Long)
If lStyleSet And lChoice Then
lFormStyle = lFormStyle Or lWS_Style
Else
lFormStyle = lFormStyle And Not lWS_Style
End If
End Sub
Áp dụng
Để sử dụng nó, chỉ cần viết code trong UserForm theo cú pháp:
PHP:
SetStyles Tên UseForm, GÍA TRỊ
PHP:
Private Sub UserForm_Initialize()
SetStyles Me, fwsTitBar + fwsMaxBtn + fwsMinBtn + fwsClsBtn
End Sub
Có vài điểm các bạn cần lưu ý:
- Max, Min và Close Button chỉ xuất hiện nếu có fwsTitBar trong GIÁ TRỊ
- Small Caption khi xuất hiện sẽ làm mất Max và Min Button
- Giá trị fwsTitBar có thể xem là System Menu
Vì các lưu ý trên, nếu viết code như thế này:
PHP:
SetStyles Me, fwsMinBtn + fwsMaxBtn + fwsSmlBar + fwsTitBar
- Ngay khi các bạn vừa gõ chữ SetStyles Me, thì sau dấu phẩy các bạn sẽ thấy 1 Tooltip xuất hiện cho các bạn chọn giá trị như hình:

Tôi đã thí nghiệm và tổng hợp thành 1 bảng như sau:

--------------------------------------------------------------------------------------
Dưới đây là 1 vài hình ảnh minh họa mà tôi đã thiết kế cho UserForm



(Xem file UserFormStyles_3.xls)
--------------------------------------------------------------------------------------
Các bạn có thể lưu code này thành 1 Add-In để dùng lâu dài
- Giả sử rằng các bạn đã lưu file thành 1 Add-In
- Giả sử rằng Add-In ấy đã được load (trong menu Tools\Add Ins...)
- Giả sử rằng các bạn vừa thiết kế 1 UserForm mới
- Để dùng Add-In này cho UserForm thì trong cửa sổ VBA Editor, các bạn vào menu Tools\References và check vào tên của Project (trong file này tên ấy là UserForm_Windows_Styles)

- Viết code cho UserForm cũng theo cú pháp như đã nói ở trên
- Khi lưu Add-In, các bạn hãy xóa UserForm đi, chỉ cần chừa lại code trong Module là đủ (đã làm sẳn cho các bạn ở file UFWStyles.xls)
--------------------------------------------------------------------------------------
Chúng ta biết rằng đây là Style chuẩn của Windows nên cái gì các bạn làm được trên UserForm thì cũng có thể làm y thế đối với bất kỳ cửa sổ ứng dụng nào... Chẳng hạn có thể dùng code này để thay đổi Style cho Form trong VB6 hoặc thậm chí thay đổi các nút và Title Bar trong chính cửa sổ Excel (làm mất nút Max, Min, Close trong cửa sổ Excel)
- Để thực hiện các thay đổi về Style cho Form trong VB6, chỉ cần sửa đoạn code:
PHP:
hWnd = FindWindow("ThunderDFrame", frmForm.Caption)
PHP:
hWnd = frmForm.hWnd
PHP:
hWnd = FindWindow("ThunderDFrame", frmForm.Caption)
PHP:
hWnd = Application.hWnd
--------------------------------------------------------------------------------------
Việc viết code cho từng phần hiển thị riêng lẽ thật dễ dàng (chẳng hạn viết code chỉ để ẩn nút Close).. nhưng với mục đích TỔNG QUÁT HÓA, tích hợp mọi thứ vào chung trong 1 code thì quả thật rất khó khăn (ít nhất là với trình độ hiểu biết của tôi)
Còn mấy phần về Resize Form, Set Icon, TaskBar Icon tôi vẫn đang tìm hiểu.. (vẫn chưa tích hợp chung vào code được, mặc dù viết riêng không có vấn đề)...
Rất mong sự đóng góp bài viết của các cao thủ khác (như TuanVNUNI, levanduyet) để hoàn thiện bài viết này
File đính kèm
Lần chỉnh sửa cuối: