- Tham gia
- 17/8/08
- Bài viết
- 8,662
- Được thích
- 16,720
- Giới tính
- Nam
Initialize Event xảy ra sau khi object được nạp nhưng trước khi object hiển thị do vậy phương thức SetFocus không có tác dụng.
Anh dời SetFocus sang sự kiện Activate là được.
TTP.
Code dài ngán quá (không dám sửa luôn)Xin vui lòng hướng dẫn và giúp đỡ:
Tại sao khi mở Form (có sử dụng MinMax), con trỏ không thể SetFocus vào combobox hay textbox?
Có khắc phục vấn đề này được không?
Trân trọng cảm ơn!
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
(ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Sub UserForm_Initialize()
Dim hWnd As Long
hWnd = FindWindow("ThunderDFrame", Me.Caption)
SetWindowLong hWnd, -16, &H84CF0080
'TextBox1.SetFocus
ComboBox1.SetFocus
End Sub
Public Sub MinMax(sCaption As String)
Dim hWndForm As Long
Dim iStyle As Long
If Val(Application.Version) < 9 Then
hWndForm = FindWindow("ThunderXFrame", sCaption)
Else
hWndForm = FindWindow("ThunderDFrame", sCaption)
End If
If hWndForm = 0 Then Exit Sub
Select Case iStyle
Case 0
SetWindowPos hWndForm, HWND_NOTOPMOST, 0, 0, 800, 600, SWP_SHOWWINDOW
Case 1
SetWindowPos hWndForm, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_HIDEWINDOW
End Select
iStyle = GetWindowLong(hWndForm, GWL_STYLE)
iStyle = iStyle Or WS_MAXIMIZEBOX
iStyle = iStyle Or WS_MINIMIZEBOX
SetWindowLong hWndForm, GWL_STYLE, iStyle
End Sub
Public Sub MinMax(sCaption As String)
Dim hWndForm As Long
Dim iStyle As Long
If Val(Application.Version) < 9 Then
hWndForm = FindWindow("ThunderXFrame", sCaption)
Else
hWndForm = FindWindow("ThunderDFrame", sCaption)
End If
iStyle = GetWindowLong(hWndForm, GWL_STYLE)
iStyle = iStyle Or WS_MAXIMIZEBOX
iStyle = iStyle Or WS_MINIMIZEBOX
SetWindowLong hWndForm, GWL_STYLE, iStyle
End Sub
Thì sửa lại tí:Em đã thử nhiều cách, Code gốc của nó là:
Em sửa thành:PHP:Public Sub MinMax(sCaption As String) Dim hWndForm As Long Dim iStyle As Long If Val(Application.Version) < 9 Then hWndForm = FindWindow("ThunderXFrame", sCaption) Else hWndForm = FindWindow("ThunderDFrame", sCaption) End If If hWndForm = 0 Then Exit Sub Select Case iStyle Case 0 SetWindowPos hWndForm, HWND_NOTOPMOST, 0, 0, 800, 600, SWP_SHOWWINDOW Case 1 SetWindowPos hWndForm, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_HIDEWINDOW End Select iStyle = GetWindowLong(hWndForm, GWL_STYLE) iStyle = iStyle Or WS_MAXIMIZEBOX iStyle = iStyle Or WS_MINIMIZEBOX SetWindowLong hWndForm, GWL_STYLE, iStyle End Sub
Thì nó Setfocus, mà không cần phải Combobox.SetFocus nếu để TabIndex = 0PHP:Public Sub MinMax(sCaption As String) Dim hWndForm As Long Dim iStyle As Long If Val(Application.Version) < 9 Then hWndForm = FindWindow("ThunderXFrame", sCaption) Else hWndForm = FindWindow("ThunderDFrame", sCaption) End If iStyle = GetWindowLong(hWndForm, GWL_STYLE) iStyle = iStyle Or WS_MAXIMIZEBOX iStyle = iStyle Or WS_MINIMIZEBOX SetWindowLong hWndForm, GWL_STYLE, iStyle End Sub
Nhưng vấn đề đặt ra là khi cái Form từ File của em mở lên nếu bỏ cái Select Case đi thì nó không còn biểu tượng của Form trên Taskbar nữa! Em không muốn mất nó đi!
Private Declare Function FindWindow Lib "User32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long
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 SetWindowPos Lib "user32.dll" (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 Sub UserForm_Initialize()
Dim hWnd As Long
hWnd = FindWindow("ThunderDFrame", Me.Caption)
SetWindowPos hWnd, -2, 0, 0, 800, 600, &H40
SetWindowLong hWnd, -16, &H84CF0080
Application.Visible = False
End Sub
Private Sub CommandButton1_Click()
Unload Me
End Sub
Private Sub UserForm_Terminate()
Application.Visible = True
End Sub
1> Vụ thay đổi biểu tượng thì tôi không biết (nếu làm được chắc cũng rất phức tạp) ---> Vậy nếu bạn có như cầu này, thôi thì viết bằng VB đi cho khỏeThầy ơi, cho em "Được voi đòi 2 bà Trưng" một tí nhé!
1) Có thể nào thay đổi cái biểu tượng Excel trên Taskbar thành một Icon khác được không?
2) Khi nhấp vào biểu tượng đó trên taskbar có thể Min form không? Bởi khi nó đang mở thì click vào biểu tượng trên taskbar nó không Min như những chương trình khác, chỉ chớp chớp tí thôi, nó chỉ được khi đang Min thì click vào nó hiện lại Form.
CÁM ƠN THẦY RẤT NHIỀU!!!
Form này thiết kế rất hay... nhưng chắc còn lâu lắm ta mới có thể áp dụng nó 1 cách thành thạo đượcTrình độ em non kém quá nên không biết dò cách nào để ra cái FormFun này. Trong đó nó có Check lựa chọn Icon luôn, nhưng sử dụng Class.
Thì sửa lại tí:
PHP:Private Declare Function FindWindow Lib "User32" Alias "FindWindowA" _ (ByVal lpClassName As String, ByVal lpWindowName As String) As Long 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 SetWindowPos Lib "user32.dll" (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
PHP:Private Sub UserForm_Initialize() Dim hWnd As Long hWnd = FindWindow("ThunderDFrame", Me.Caption) SetWindowPos hWnd, -2, 0, 0, 800, 600, &H40 SetWindowLong hWnd, -16, &H84CF0080 Application.Visible = False End Sub
PHP:Private Sub CommandButton1_Click() Unload Me End Sub
PHP:Private Sub UserForm_Terminate() Application.Visible = True End Sub
Thầy ui, cũng để cái dòng code này: "SetWindowPos hWnd, -2, 0, 0, 800, 600, &H40" để xác định chiều rộng chiều cao của Form, nhưng em lại không muốn có cái ICON ở Taskbar (như các UserForm khác) thì code này phải sửa lại như thế nào? và cái API này khai lại như thế nào ạ?
Private Declare Function SetWindowPos Lib "user32.dll" (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
Cám ơn rất nhiều!
[COLOR="SeaGreen"]'Set the big (32x32) and small (16x16) icons[/COLOR]
SendMessage mhWndForm, WM_SETICON, True, hIcon
[COLOR="SeaGreen"]'Set the small (16x16) icons[/COLOR]
SendMessage mhWndForm, WM_SETICON, False, hIcon
SendMessage mhWndForm, 128, True, hIcon
SendMessage mhWndForm, 128, False, hIcon
oldStyle = GetWindowLong(mhWndForm, GWL_STYLE) [COLOR="SeaGreen"]'Nhận thuộc tính cũ[/COLOR]
SetWindowLong mhWndForm, GWL_STYLE, oldStyle Or WS_MINIMIZEBOX Or WS_MAXIMIZEBOX [COLOR="SeaGreen"]'Kết hợp thêm thuộc tính mới[/COLOR]
oldStyle = GetWindowLong(mhWndForm, GWL_STYLE) [COLOR="SeaGreen"]'Nhận thuộc tính cũ[/COLOR]
SetWindowLong mhWndForm, GWL_STYLE, oldStyle Or [COLOR="Red"]Not And[/COLOR] (WS_MINIMIZEBOX Or WS_MAXIMIZEBOX) [COLOR="SeaGreen"]'Gõ bỏ thuộc tính mới[/COLOR]
SetWindowLong mhWndForm, -16, -2067070848
Xem bài này cho nó tổng quát:Hỏi xong rồi mày mò, rồi tự trả lời luôn! Hihihihi
Cấu trúc không cần thay gì cả, đổi số thôi:
"SetWindowPos hWnd, -2, 0, 0, 800, 600, &H40"
&H40 thực ra là 64, vậy mình đổi thành 32 hay 16, hay 0 gì đó là mất tiêu cái Icon ở Taskbar luôn!
"SetWindowPos hWnd, -2, 0, 0, 800, 600, 32"
Bước đầu chưa hiểu lắm nên phải mò thế Tuân à! Khi đã hiểu, đã áp dụng được 1 vài bài thì mới tính đến chuyện hoàn thiện kiến thứcTôi thấy các bạn sử dụng các hàm API mò mẫm quá