Tại sao không dùng SetWindowText để thiết định caption cho Userform?

  • Thread starter Deleted member 208
  • Ngày gửi
D

Deleted member 208

Guest
Anh chị @vothanhthu@NhanSu cho em hỏi:
-Hàm SetWindowText này để làm gì?
Theo thông tin em đọc thì em hiểu là thay đổi UserForm Cation. Nhưng em thử thì không được.
Vậy, hàm này để làm gì vậy ạ?
Mã:
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function SetWindowText Lib "user32" Alias "SetWindowTextA" _
   (hWnd As Long, _
    lpString As LongPtr) As Long
Private Sub UserForm_Initialize()
    Dim hWnd&, sUnicode$
    hWnd = FindWindow("ThunderDFrame", Caption)  ' Tim HWnd cua UserForm
    sUnicode = Range("A1").Value 'Noi chua chuoi unicode
    SetWindowText hWnd, StrPtr(sUnicode)

End Sub
 

BKKBG

Yêu THVBA nhất
Tôi cũng không hiểu. Nếu google hàm SetWindowText thì tôi cũng nghĩ là thay đổi title của window. Nhưng chạy code của bạn thì không thay đổi gì.
Tôi thử google thì còn ra được hàm sau: SendMessageString

Mã:
#If Win64 And VBA7 Then
Private Declare PtrSafe Function SendMessageStringW Lib "user32" Alias "SendMessageA" _
(ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As String) As Long
Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
#Else
Private Declare Function SendMessageStringW Lib "user32" Alias "SendMessageA" _
(ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As String) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
#End If
Const WM_SETTEXT As Long = &HC
    
Private Sub UserForm_Initialize()
    Dim hwnd&, sUnicode$
    hwnd = FindWindow("ThunderDFrame", Caption)  ' Tim HWnd cua UserForm
    sUnicode = Range("A1").Value 'Noi chua chuoi unicode
    SendMessageStringW hwnd, WM_SETTEXT, 0, sUnicode

End Sub
Kết quả:
Bạn cần đăng nhập để thấy hình ảnh


Vậy các bạn có ai hiểu thì giải thích giúp, , lại sử dụng hàm DefWindowProc ?
 

NhanSu

SMod
Thành viên BQT
Mình cũng không rõ tại sao. Sơ bộ thế này: mỗi lớp cửa sổ có hàm xử lý thông điệp, tạm gọi là WndProc. Hàm này sẽ nhận các thông điệp và xử lý một số trong chúng, còn lại sẽ chuyển cho hàm DefWindowProc xử lý (Def ở đây là default - mặc định, điều này cũng tương tự khi ta viết thủ tục sự kiện của một đối tượng thì chỉ sự kiện đó hoạt động theo cách riêng của ta còn các sự kiện khác vẫn thực hiện theo mặc định).
Các hàm SetWindowText và SendMessage với tham số WM_SETTEXT mà chúng ta dùng ở đây đều nhằm mục đích gửi thông điệp này đến hàm WndProc của cửa sổ (userform). WndProc có thể đã xử lý thông điệp này theo cách riêng của nó mà không gọi hàm DefWindowProc nữa, tiếc là cách này đã lỗi thời nên không thực hiện được. Nếu ta gọi trực tiếp DefWindowProcW thì lại hiển thị unicode bình thường.
 
Sửa lần cuối:
V

vothanhthu

Guest
Theo lý thuyết thì hàm SetWindowText có thể đổi tên cửa sổ Window, nhưng Thứ thử nghiệm lại đổi không đc. Nhưng hiện tại, Thứ vẫn chưa rõ tại sao. Có thể liên quan đến cấu trúc gởi nhận của hàm này.
 

tuhocvba

Administrator
Thành viên BQT
Như vậy, chúng ta cùng thừa nhận với nhau một điều, khi tìm hiểu cách thay đổi title userform có thể ra nhiều kết quả tìm kiếm. Việc tác giả Nguyễn Duy Tuân tìm ra được đáp án là sử dụng hàm DefWindowProc , đó chính là công sức không thể phủ nhận. Không biết các trang nước ngoài, khi hiển thị unicode trên title userform thì họ có dùng như mình không, có ai có link không?
 
Top