Tổng quan về UserForm Windows Styles (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

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ợ
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
2> Code chính
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Ị
Ví dụ
PHP:
Private Sub UserForm_Initialize()
  SetStyles Me, fwsTitBar + fwsMaxBtn + fwsMinBtn + fwsClsBtn
End Sub
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:
PHP:
SetStyles Me, fwsMinBtn + fwsMaxBtn + fwsSmlBar + fwsTitBar
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:

untitled6.JPG

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

untitled4.JPG

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

untitled1.JPG

untitled2.JPG

untitled3.JPG


(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)

untitled5.JPG


- 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)
thành:
PHP:
hWnd = frmForm.hWnd
- Để thực hiện các thay đổi về Style cho cửa sổ Excel, chỉ cần sửa đoạn code:
PHP:
hWnd = FindWindow("ThunderDFrame", frmForm.Caption)
thành:
PHP:
hWnd = Application.hWnd
(đ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
 

File đính kèm

Lần chỉnh sửa cuối:
Thêm khả năng Resize Form và Set Icon

Vừa nghiên cứu xong được 2 món nữa: Set Icon và Resize UserForm
Các code khác giữ nguyên, chỉ sửa lại sub SetStyles ENum frmWinStyles
PHP:
Public Enum frmWinStyles
  fwsTitBar = 1
  fwsSmlBar = 2
  fwsMaxBtn = 4
  fwsMinBtn = 8
  fwsClsBtn = 16
  fwsHasIco = 32
  fwsCanRez = 64
End Enum
PHP:
Sub SetStyles(ByRef frmForm As Object, ByVal lStyles As frmWinStyles, Optional ByVal icoPath As String)
  Dim hwnd As Long, lStyle As Long, hMenu As Long
  hwnd = FindWindow("ThunderDFrame", frmForm.Caption)
  If lStyles And fwsSmlBar Then lStyles = lStyles And Not (fwsMaxBtn Or fwsMinBtn Or fwsHasIco)
  lStyle = GetWindowLong(hwnd, GWL_STYLE)
  ModifyStyles lStyle, lStyles, fwsHasIco Or fwsMaxBtn Or fwsMinBtn Or fwsClsBtn, WS_SYSMENU
  ModifyStyles lStyle, lStyles, fwsHasIco Or fwsMaxBtn Or fwsMinBtn Or fwsClsBtn Or fwsTitBar Or fwsSmlBar, WS_CAPTION
  ModifyStyles lStyle, lStyles, fwsMaxBtn, WS_MAXIMIZEBOX
  ModifyStyles lStyle, lStyles, fwsMinBtn, WS_MINIMIZEBOX
  ModifyStyles lStyle, lStyles, fwsCanRez, WS_THICKFRAME
  ModifyStyles lStyle, lStyles, fwsTitBar, WS_SYSMENU
  SetWindowLong hwnd, GWL_STYLE, lStyle
  lStyle = GetWindowLong(hwnd, GWL_EXSTYLE)
  ModifyStyles lStyle, lStyles, fwsSmlBar, WS_EX_TOOLWINDOW
  If lStyles And fwsHasIco Then
    lStyle = lStyle And Not WS_EX_DLGMODALFRAME
    If Len(icoPath) > 0 Then SetIcon hwnd, icoPath
  Else
    lStyle = lStyle Or WS_EX_DLGMODALFRAME
  End If
  SetWindowLong hwnd, GWL_EXSTYLE, lStyle
  hMenu = GetSystemMenu(hwnd, -((lStyles And fwsClsBtn) = fwsClsBtn))
  If Not lStyles And fwsClsBtn Then DeleteMenu hMenu, SC_CLOSE, 0&
  DrawMenuBar hwnd
End Sub
Thí nghiệm các giá trị lStyles từ 0 đến 127 (vì từ 128 trở đi sẽ trở về như cũ) tôi được bảng tổng kết như hình:

untitled1.JPG


Bảng tổng kết này có những Style bị trùng dù giá trị có khác nhau. Tôi dùng Advanced Filter để lọc Unique Records và thu được 42 trường hợp khác nhau của Style
----------------------------------
Áp dụng:
Ví dụ các bạn muốn 1 UserForm có nut Max, Min, Close và 1 Icon của Explorer.exe thì sẽ viết như sau:
PHP:
Private Sub UserForm_Initialize()
  SetStyles Me, 125, "C:\Windows\Explorer.exe"
End Sub
(Tra số 125 trong bảng tổng kết)
Xem file và tự áp dụng cho mình nhé
-----------------------------------------
Còn 1 phần nữa: Set Icon in TaskBar tôi vẫn chưa làm ra
 

File đính kèm

Upvote 0
Nếu hwnd = Application.hwnd thì sẽ thay icon của Excel dưới TaskBar.
 
Upvote 0
Nếu hwnd = Application.hwnd thì sẽ thay icon của Excel dưới TaskBar.

Xin vui lòng cho hỏi: Đặt Application.hWnd ở đâu trong thủ dưới đây thì sẽ được cái Icon trên TaskBar?

Mã:
[COLOR=#000000][COLOR=#0000BB]Sub SetStyles[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]ByRef frmForm [/COLOR][COLOR=#007700]As [/COLOR][COLOR=#0000BB]Object[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]ByVal lStyles [/COLOR][COLOR=#007700]As [/COLOR][COLOR=#0000BB]frmWinStyles[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]Optional ByVal icoPath [/COLOR][COLOR=#007700]As [/COLOR][COLOR=#0000BB]String[/COLOR][COLOR=#007700])
  [/COLOR][COLOR=#0000BB]Dim hwnd [/COLOR][COLOR=#007700]As [/COLOR][COLOR=#0000BB]Long[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]lStyle [/COLOR][COLOR=#007700]As [/COLOR][COLOR=#0000BB]Long[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]hMenu [/COLOR][COLOR=#007700]As [/COLOR][COLOR=#0000BB]Long
  hwnd [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]FindWindow[/COLOR][COLOR=#007700]([/COLOR][COLOR=#DD0000]"ThunderDFrame"[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]frmForm[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]Caption[/COLOR][COLOR=#007700])
  If [/COLOR][COLOR=#0000BB]lStyles [/COLOR][COLOR=#007700]And [/COLOR][COLOR=#0000BB]fwsSmlBar Then lStyles [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]lStyles [/COLOR][COLOR=#007700]And [/COLOR][COLOR=#0000BB]Not [/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]fwsMaxBtn [/COLOR][COLOR=#007700]Or [/COLOR][COLOR=#0000BB]fwsMinBtn [/COLOR][COLOR=#007700]Or [/COLOR][COLOR=#0000BB]fwsHasIco[/COLOR][COLOR=#007700])
  [/COLOR][COLOR=#0000BB]lStyle [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]GetWindowLong[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]hwnd[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]GWL_STYLE[/COLOR][COLOR=#007700])
  [/COLOR][COLOR=#0000BB]ModifyStyles lStyle[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]lStyles[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]fwsHasIco [/COLOR][COLOR=#007700]Or [/COLOR][COLOR=#0000BB]fwsMaxBtn [/COLOR][COLOR=#007700]Or [/COLOR][COLOR=#0000BB]fwsMinBtn [/COLOR][COLOR=#007700]Or [/COLOR][COLOR=#0000BB]fwsClsBtn[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]WS_SYSMENU
  ModifyStyles lStyle[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]lStyles[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]fwsHasIco [/COLOR][COLOR=#007700]Or [/COLOR][COLOR=#0000BB]fwsMaxBtn [/COLOR][COLOR=#007700]Or [/COLOR][COLOR=#0000BB]fwsMinBtn [/COLOR][COLOR=#007700]Or [/COLOR][COLOR=#0000BB]fwsClsBtn [/COLOR][COLOR=#007700]Or [/COLOR][COLOR=#0000BB]fwsTitBar [/COLOR][COLOR=#007700]Or [/COLOR][COLOR=#0000BB]fwsSmlBar[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]WS_CAPTION
  ModifyStyles lStyle[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]lStyles[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]fwsMaxBtn[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]WS_MAXIMIZEBOX
  ModifyStyles lStyle[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]lStyles[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]fwsMinBtn[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]WS_MINIMIZEBOX
  ModifyStyles lStyle[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]lStyles[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]fwsCanRez[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]WS_THICKFRAME
  ModifyStyles lStyle[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]lStyles[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]fwsTitBar[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]WS_SYSMENU
  SetWindowLong hwnd[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]GWL_STYLE[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]lStyle
  lStyle [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]GetWindowLong[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]hwnd[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]GWL_EXSTYLE[/COLOR][COLOR=#007700])
  [/COLOR][COLOR=#0000BB]ModifyStyles lStyle[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]lStyles[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]fwsSmlBar[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]WS_EX_TOOLWINDOW
  [/COLOR][COLOR=#007700]If [/COLOR][COLOR=#0000BB]lStyles [/COLOR][COLOR=#007700]And [/COLOR][COLOR=#0000BB]fwsHasIco Then
    lStyle [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]lStyle [/COLOR][COLOR=#007700]And [/COLOR][COLOR=#0000BB]Not WS_EX_DLGMODALFRAME
    [/COLOR][COLOR=#007700]If [/COLOR][COLOR=#0000BB]Len[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]icoPath[/COLOR][COLOR=#007700]) > [/COLOR][COLOR=#0000BB]0 Then SetIcon hwnd[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]icoPath
  [/COLOR][COLOR=#007700]Else
    [/COLOR][COLOR=#0000BB]lStyle [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]lStyle [/COLOR][COLOR=#007700]Or [/COLOR][COLOR=#0000BB]WS_EX_DLGMODALFRAME
  End [/COLOR][COLOR=#007700]If
  [/COLOR][COLOR=#0000BB]SetWindowLong hwnd[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]GWL_EXSTYLE[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]lStyle
  hMenu [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]GetSystemMenu[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]hwnd[/COLOR][COLOR=#007700], -(([/COLOR][COLOR=#0000BB]lStyles [/COLOR][COLOR=#007700]And [/COLOR][COLOR=#0000BB]fwsClsBtn[/COLOR][COLOR=#007700]) = [/COLOR][COLOR=#0000BB]fwsClsBtn[/COLOR][COLOR=#007700]))
  If [/COLOR][COLOR=#0000BB]Not lStyles [/COLOR][COLOR=#007700]And [/COLOR][COLOR=#0000BB]fwsClsBtn Then DeleteMenu hMenu[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]SC_CLOSE[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]0[/COLOR][COLOR=#007700]&
  [/COLOR][COLOR=#0000BB]DrawMenuBar hwnd
End Sub  [/COLOR][/COLOR]

Cám ơn rất nhiều!
 
Upvote 0
Tôi thử gán Application.hWnd vào nhiều thủ tục trong đó, có vài cái phát sinh lỗi, còn những cái khác chẳng có hiệu quả gì cả!
 
Upvote 0
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
]
2> Code chính
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

Trong thủ tục trên của Thầy, khi show Max thì em thấy Form được fix với màn hình và chừa khoảng cách với Taskbar, vậy câu lệnh nào đã làm được điều đó thưa Thầy?
 

File đính kèm

  • Picture1.jpg
    Picture1.jpg
    116.2 KB · Đọc: 202
Upvote 0
Trong thủ tục trên của Thầy, khi show Max thì em thấy Form được fix với màn hình và chừa khoảng cách với Taskbar, vậy câu lệnh nào đã làm được điều đó thưa Thầy?

Vì em muốn cái hàm nó tổng quát hơn nữa là khi show form (max) nếu ta cho Form full màn hình (độc tôn không cho thấy gì cả) thì là TRUE, còn chừa cái TASKBAR thì là FALSE.

Nhờ Thầy hoặc các cao thủ khác cho em một thủ tục nào để làm chuyện đó được không ạ? (Bởi em chưa rành về API)

Cám ơn rất nhiều.
 
Upvote 0
Vì em muốn cái hàm nó tổng quát hơn nữa là khi show form (max) nếu ta cho Form full màn hình (độc tôn không cho thấy gì cả) thì là TRUE, còn chừa cái TASKBAR thì là FALSE.

Nhờ Thầy hoặc các cao thủ khác cho em một thủ tục nào để làm chuyện đó được không ạ? (Bởi em chưa rành về API)

Cám ơn rất nhiều.

Chuyện này hình như chẳng liên quan gì đến Excel cả
Chúng ta có thể thí nghiệm: Khi Taskbar ẩn đi thì các cửa sổ tự động "tràn" lấp cả khu vực taskbar ---> Tức là tự nhiên nó thế mà chẳng cần phải làm gì cả
Có chăng là Nghĩa nên tìm 1 code nào đó có khả năng ẩn Taskbar, thế thôi (có đầy khi search google)
 
Upvote 0
Vì em muốn cái hàm nó tổng quát hơn nữa là khi show form (max) nếu ta cho Form full màn hình (độc tôn không cho thấy gì cả) thì là TRUE, còn chừa cái TASKBAR thì là FALSE.

Nhờ Thầy hoặc các cao thủ khác cho em một thủ tục nào để làm chuyện đó được không ạ? (Bởi em chưa rành về API)

Cám ơn rất nhiều.
Gợi ý cho anh: Load form lên anh chọn cái auto-hide the taskbar là ok, khi đóng form cho nó trở về ban đầu. Dĩ nhiên là dùng code để làm điều đó.
 
Upvote 0
Chuyện này hình như chẳng liên quan gì đến Excel cả
Chúng ta có thể thí nghiệm: Khi Taskbar ẩn đi thì các cửa sổ tự động "tràn" lấp cả khu vực taskbar ---> Tức là tự nhiên nó thế mà chẳng cần phải làm gì cả
Có chăng là Nghĩa nên tìm 1 code nào đó có khả năng ẩn Taskbar, thế thôi (có đầy khi search google)

Nhưng nếu dùng toàn bộ thủ tục của Thầy, và khi set không cho form hiện caption, thì khi cho lệnh full màn hình thì nó bao tất cả!

Câu lệnh: ShowWindow hWnd, Show_MAXIMIZE

Thầy xem rồi cho em biết tại sao nó như vậy Thầy nhé!
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Nhưng nếu dùng toàn bộ thủ tục của Thầy, và khi set không cho form hiện caption, thì khi cho lệnh full màn hình thì nó bao tất cả!

Câu lệnh: ShowWindow hWnd, Show_MAXIMIZE

Thầy xem rồi cho em biết tại sao nó như vậy Thầy nhé!

Thế bây giờ Nghĩa thử xóa toàn bộ code trong Module rồi chạy code này thử xem
Mã:
Private Declare Function ShowWindow Lib "user32" (ByVal hWnd As Long, ByVal nCmdShow As Long) As Long
Private Const Show_MAXIMIZE = 3
Private Sub CommandButton2_Click()
 Dim hWnd As Long
 hWnd = FindWindow("ThunderDFrame", Me.Caption)
 ShowWindow hWnd, Show_MAXIMIZE
End Sub
Code đặt trong UserForm
 
Upvote 0
Thế bây giờ Nghĩa thử xóa toàn bộ code trong Module rồi chạy code này thử xem
Mã:
Private Declare Function ShowWindow Lib "user32" (ByVal hWnd As Long, ByVal nCmdShow As Long) As Long
Private Const Show_MAXIMIZE = 3
Private Sub CommandButton2_Click()
 Dim hWnd As Long
 hWnd = FindWindow("ThunderDFrame", Me.Caption)
 ShowWindow hWnd, Show_MAXIMIZE
End Sub
Code đặt trong UserForm

Em vẫn thấy nó Full màn hình, mặc dù có Caption. Vậy điều gì đã làm cho có sự khác biệt này, đó chính là cái em cần đó Thầy ạ.
 
Upvote 0
Ý tôi muốn nói rằng: Dù có code của tôi hay không thì nó vẫn cứ full

Cũng cái file của em, Thầy thử với caption xem sao:

Mã:
Private Sub UserForm_Initialize()
    hWnd = FindWindow("ThunderDFrame", Caption)    'XL2000
    '(FormNoTitleBar, FormMaxMinClose, FormMaxSizable, FormMaxMinSizable, FormMaxMinCloseSizable)
    SetStyles Me, [COLOR=#ff0000]FormMaxMinSizable   [/COLOR]', "C:\Windows\Explorer.exe"
End Sub

Rồi sau đó chạy thủ tục nó phóng to màn hình form xem sao! Nó đâu có full hết!
 
Upvote 0
Cũng cái file của em, Thầy thử với caption xem sao:

Mã:
Private Sub UserForm_Initialize()
    hWnd = FindWindow("ThunderDFrame", Caption)    'XL2000
    '(FormNoTitleBar, FormMaxMinClose, FormMaxSizable, FormMaxMinSizable, FormMaxMinCloseSizable)
    SetStyles Me, [COLOR=#ff0000]FormMaxMinSizable   [/COLOR]', "C:\Windows\Explorer.exe"
End Sub

Rồi sau đó chạy thủ tục nó phóng to màn hình form xem sao! Nó đâu có full hết!

Tôi cũng chẳng biết nữa
hàm API ShowWindow chẳng liên quan gì đến vụ chỉnh Style cả... nhưng nó lại chạy sau khi đã chỉnh Style... vậy nghĩa là code chồng chéo tùm lum, tôi không khống chế nỗi
 
Upvote 0
Tôi cũng chẳng biết nữa
hàm API ShowWindow chẳng liên quan gì đến vụ chỉnh Style cả... nhưng nó lại chạy sau khi đã chỉnh Style... vậy nghĩa là code chồng chéo tùm lum, tôi không khống chế nỗi

Thì chính vì có sự khác biệt với nhau nên em muốn tìm ra nguyên nhân, từ đó mình làm theo ý đồ của mình, có full hoàn toàn hay full nhưng chừa Taskbar hay không.
 
Upvote 0
Thì chính vì có sự khác biệt với nhau nên em muốn tìm ra nguyên nhân, từ đó mình làm theo ý đồ của mình, có full hoàn toàn hay full nhưng chừa Taskbar hay không.

Trước đây tôi viết code về Windows Style là do nhu cầu cá nhân nên cũng viết vừa đủ để phục vụ cho chính mình chứ thật tình chẳng khoái vì mấy vụ màu mè này (chính thế mà tôi không nghiên cứu tiếp)
Tôi chỉ hứng thú đối với việc xử lý CSDL thôi...
Vậy nên, ai có nhu cầu nghiên cứu tiếp, cứ việc download thằng API này về cài rồi tự nghiên cứu nhé:
http://www.mediafire.com/?nwmwmty5xzm
Bộ hàm API này có cả ví dụ minh họa nữa đấy
(Chạy file agsetup.exe để setup)
 
Upvote 0
Trước đây tôi viết code về Windows Style là do nhu cầu cá nhân nên cũng viết vừa đủ để phục vụ cho chính mình chứ thật tình chẳng khoái vì mấy vụ màu mè này (chính thế mà tôi không nghiên cứu tiếp)
Tôi chỉ hứng thú đối với việc xử lý CSDL thôi...
Vậy nên, ai có nhu cầu nghiên cứu tiếp, cứ việc download thằng API này về cài rồi tự nghiên cứu nhé:
http://www.mediafire.com/?nwmwmty5xzm
Bộ hàm API này có cả ví dụ minh họa nữa đấy

Cái "màu mè" đó nó hay lắm Thầy ơi, với code chạy nhập liệu hay xuất dữ liệu hay xử lý gì gì đó, nếu làm tốt thì chỉ vài chục dòng, nhưng nếu nghiên cứu "màu mè" nó nhiều hơn em code của mình rất nhiều, vì vậy nghiên cứu nó thấy sướng lắm, tiếc rằng em không có học căn bản, đầu đuôi cốt lõi nó như thế nào nên đành chịu học mò mà thôi.

Vã lại, khi trình độ cao như Thầy rồi thì đương nhiên thủ tục xử lý dữ liệu đã siêu rồi thì không lý gì mà bắt "con cá kình nằm trong vũng nước" cả, hãy để nó bơi ra ngoài biển khơi, phải để cho những code đó trong những ứng dụng tuyệt đẹp thì nó mới thật sự có giá trị. Mình đã ăn chắc mặc bền rồi, giờ mình phải ăn ngon, mặc đẹp nữa Thầy ơi!
 
Upvote 0
Vì em muốn cái hàm nó tổng quát hơn nữa là khi show form (max) nếu ta cho Form full màn hình (độc tôn không cho thấy gì cả) thì là TRUE, còn chừa cái TASKBAR thì là FALSE.

Nhờ Thầy hoặc các cao thủ khác cho em một thủ tục nào để làm chuyện đó được không ạ? (Bởi em chưa rành về API)

Cám ơn rất nhiều.

Cái yêu cầu trên mình đã làm trong ví một ví dụ nào đó trong đề tài màn hình nền gì đó rồi. Bạn thử tìm lại trên GPE xem?
 
Upvote 0
Cái yêu cầu trên mình đã làm trong ví một ví dụ nào đó trong đề tài màn hình nền gì đó rồi. Bạn thử tìm lại trên GPE xem?

Có, em có coi qua cái form đó của Anh, tuy nhiên nó lại chính là Width và Heigth của form, khi form ở trạng thái Max hay Nomal thì chúng gần như là bằng nhau anh à.

Nội dung của thủ tục anh gửi như vầy:

Mã:
    Dim rc As RECT
    GetWindowRect GetDesktopWindow, rc
    SetWindowPos hForm, hForm2, rc.Left, rc.Top, rc.Right, rc.Bottom, SWP_FRAMECHANGED
 
Upvote 0
Vậy anh test thử cách củ chuối như sau:

Mã:
Private Sub UserForm_Initialize()
    Application.DisplayFullScreen = True
    With UserForm1
        .Width = Application.ActiveWindow.Width
        .Height = Application.ActiveWindow.Height + 20
        .Move 0, 0
    End With
    Application.DisplayFullScreen = False
End Sub
 
Upvote 0
Vậy anh test thử cách củ chuối như sau:

Mã:
Private Sub UserForm_Initialize()
    Application.DisplayFullScreen = True
    With UserForm1
        .Width = Application.ActiveWindow.Width
        .Height = Application.ActiveWindow.Height + 20
        .Move 0, 0
    End With
    Application.DisplayFullScreen = False
End Sub

Chưa thử nha, nhưng nhìn là đoán chắc form size dựa vào cửa sổ Excel rồi, thế thì không được, lỡ như cửa sổ Excel nó đang Nomal hay Minimize thì tèo đấy nhé! hihihihi

-----------------------------------------------------------
Sorry, kiểm lại thấy vẫn hoạt động, nhưng form không như ý, vì khi làm thủ tục Min, Max, Normal hoặc Resize nó sẽ không như ta muốn.

-----------------------------------------------------------

Đây là thủ tục của anh Nguyễn Duy Tuân nè:

Mã:
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Const GWL_STYLE = (-16)
Private Const GWL_EXSTYLE = (-20)

Private Declare Function GetWindowRect Lib "user32" (ByVal hWnd As Long, lpRect As RECT) As Long
Private Declare Function GetDesktopWindow Lib "user32" () As Long
Private Declare Function SetWindowPos Lib "user32" (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Private Const SWP_FRAMECHANGED = &H20        '  The frame changed: send WM_NCCALCSIZE
Private Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long

Dim hForm As Long

Private Sub CommandButton1_Click()
      Unload Me
End Sub
Private Sub UserForm_Initialize()
    On Error Resume Next
    Dim hForm2 As Long, HT As Double
    HT = Me.Height - Me.InsideHeight
    #If VBA6 Then
        hForm = FindWindow("ThunderDFrame", Me.Caption)
'        hForm2 = FindWindow("ThunderDFrame", UserForm2.Caption)
    #Else
        hForm = hWnd
        'BorderStyle = None 'Thiet lap o che do design
    #End If
    SetWindowLong hForm, GWL_STYLE, GetWindowLong(hForm, GWL_STYLE) And Not (WS_BORDER Or WS_CAPTION Or WS_THICKFRAME Or WS_DLGFRAME)
    SetWindowLong hForm, GWL_EXSTYLE, GetWindowLong(hForm, GWL_EXSTYLE) And Not WS_EX_DLGMODALFRAME
    Me.Height = Me.Height - HT
[COLOR=#ff0000][B]    Dim rc As RECT
    GetWindowRect GetDesktopWindow, rc
    SetWindowPos hForm, hForm2, rc.Left, rc.Top, rc.Right, rc.Bottom, SWP_FRAMECHANGED[/B][/COLOR]
'    SetParent hForm2, hForm
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Có, em có coi qua cái form đó của Anh, tuy nhiên nó lại chính là Width và Heigth của form, khi form ở trạng thái Max hay Nomal thì chúng gần như là bằng nhau anh à.

Nội dung của thủ tục anh gửi như vầy:

Mã:
    Dim rc As RECT
    GetWindowRect GetDesktopWindow, rc
    SetWindowPos hForm, hForm2, rc.Left, rc.Top, rc.Right, rc.Bottom, SWP_FRAMECHANGED

Chưa hiểu mong muốn của Nghĩa về form là thế nao?
 
Upvote 0
Upvote 0
Dạ, ý em muốn là khi form show Maximize, nó có thể full màn hình hoặc full nhưng chừa taskbar, tùy theo lựa chọn của mình (nhưng không thay đổi chiều dài và chiều rộng của form).

Mình hỏi thêm mấy ý nữa là:
Form có caption không?
Khi show normal thì khung của form về trạng thái lúc design và có caption?
 
Upvote 0
Mình hỏi thêm mấy ý nữa là:
Form có caption không?
Khi show normal thì khung của form về trạng thái lúc design và có caption?

Em xin lỗi vì đã đọc câu hỏi này hơi muộn.

Và xin trả lời thắc mắc của anh:

1) Dù có hoặc dù không cũng thực hiện như mình muốn.

2) Đúng vậy anh à, trạng thái form như design ở trạng thái ban đầu và Resize (nếu ta kéo cho form dài hay ngắn (chiều dài), cao hay thấp (chiều cao) lúc form ở trạng thái Nomal)
 
Upvote 0
Vì em muốn cái hàm nó tổng quát hơn nữa là khi show form (max) nếu ta cho Form full màn hình (độc tôn không cho thấy gì cả) thì là TRUE, còn chừa cái TASKBAR thì là FALSE.

Nhờ Thầy hoặc các cao thủ khác cho em một thủ tục nào để làm chuyện đó được không ạ? (Bởi em chưa rành về API)

Cám ơn rất nhiều.

Chả liên quan gì tới Excel mà đây là ABC Windows. Nếu tôi nhớ chính xác thì với mọi cửa sổ trong system:

1. Không có caption (AND NOT WS_CAPTION) hoặc không có "OR WS_MAXIMIZEBOX"
Chỉ max được bằng ShowWindow và cửa sổ luôn max toàn màn hình

2. Có Caption và có "OR WS_MAXIMIZEBOX"
Click nút max hay ShowWindow max thì hậu quả như nhau và phụ thuộc vào trạng thái Taskbar
- taskbar là AutoHide hoặc taskbar không là "Always on top" --> cửa sổ chiếm toàn bộ màn hình
- taskbar không là AutoHide và là "Always on top" --> cửa sổ không che taskbar
--------------
Kết luận: Nếu muốn khi click nút max (tức có Caption và có nút max - "OR WS_MAXIMIZEBOX") thì cửa sổ chiếm toàn màn hình thì phải vd. chọn "AutoHide". Thế thôi.
---------------
Tôi đã liệt kê khi nào thì full màn hình và khi nào thì không che taskbar.
Về việc đánh dấu AutoHide và Always on top thì bạn gọi code như sau:
Mã:
Dim abd As APPBARDATA
    abd.cbSize = Len(abd)
    abd.hwnd = FindWindow("Shell_TrayWnd", vbNullString)
    abd.lParam = [B][COLOR=#ff0000]xyz[/COLOR][/B]
    SHAppBarMessage ABM_SETSTATE, abd

Nếu ở chỗ xyz bạn nhập:
1. 0: Autohide và always-on-top đều không được chọn
2. ABS_ALWAYSONTOP: Always-on-top được chọn, autohide không được chọn (đã có trong ví dụ)
3. ABS_AUTOHIDE: Autohide được chọn, always-on-top không được chọn (đã có trong ví dụ)
4. ABS_AUTOHIDE OR ABS_ALWAYSONTOP: Autohide và always-on-top đều được chọn
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0

Bài viết mới nhất

Back
Top Bottom