lhwnd là gì? (1 người xem)

  • Thread starter Thread starter DMQ
  • Ngày gửi Ngày gửi
Liên hệ QC

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

DMQ

Thành viên dốt
Tham gia
21/3/12
Bài viết
722
Được thích
57
Giới tính
Nam
Em có đoạn code này trong Form, mong mọi người giải thích dùm em
Mã:
Private Sub UserForm_Initialize()
Dim lhwnd As Long
  lhwnd = FindWindow("ThunderDFrame", "UserForm1")
Em cám ơn.
 
Em có đoạn code này trong Form, mong mọi người giải thích dùm em
Mã:
Private Sub UserForm_Initialize()
Dim lhwnd As Long
  lhwnd = FindWindow("ThunderDFrame", "UserForm1")
Em cám ơn.
ĐOÁM mò một chút code đó trong UserForm1 còn kèm theo một mớ hàm API nữa thì mới hiểu hết được
 
Upvote 0
Em có đoạn code này trong Form, mong mọi người giải thích dùm em
Mã:
Private Sub UserForm_Initialize()
Dim lhwnd As Long
  lhwnd = FindWindow("ThunderDFrame", "UserForm1")
Em cám ơn.
Nó là 1 giá trị handle nôm na cũng như thẻ căn cước để quản lý người. Ở đây handle dùng để quản form, control... không nhớ rõ lắm --=0
 
Upvote 0
Đoạn code trên không hiện Caption của UserForm. Em cũng có đoạn code này không cho hiện Caption của Userform mà lấy Label lên trên giông Caption (Nhìn thầy rất hay)
Mã:
Private Sub UserForm_Initialize(
)Dim hwnd As Long, dw As Long, k As Long, dic As Object, arr(), thang As Long
    dw = &H84080080
    hwnd = FindWindow("ThunderDFrame", Me.Caption)
    SetWindowLong hwnd, -16, dw
    Me.Height = Me.Height + 1: Me.Height = Me.Height - 1
En Sub
Nhưng trong code trên là hwnd, ý em hỏi là ý nghĩa của lhwnd và hwnd .
 
Upvote 0
Đoạn code trên không hiện Caption của UserForm. Em cũng có đoạn code này không cho hiện Caption của Userform mà lấy Label lên trên giông Caption (Nhìn thầy rất hay)
Mã:
Private Sub UserForm_Initialize(
)Dim hwnd As Long, dw As Long, k As Long, dic As Object, arr(), thang As Long
    dw = &H84080080
    hwnd = FindWindow("ThunderDFrame", Me.Caption)
    SetWindowLong hwnd, -16, dw
    Me.Height = Me.Height + 1: Me.Height = Me.Height - 1
En Sub
Nhưng trong code trên là hwnd, ý em hỏi là ý nghĩa của lhwnd và hwnd .
Tên có l hay không l cũng thế. Người nào thích thì thêm cái chữ cái đại diện cho kiểu dữ liệu (l = long). Đủ mọi loại quy ước đặt tên theo tùy hứng hay nguyên tắc của mỗi người. Chính tôi cũng có quy ước đặt tên chả theo ông/bà nào cả. --=0
 
Lần chỉnh sửa cuối:
Upvote 0
Bác Ndu có thể giải thích cho em mấy số "-16" "+1" "-1" được không ah!!!!!
 
Upvote 0
Bác Ndu có thể giải thích cho em mấy số "-16" "+1" "-1" được không ah!!!!!

hàm setwindowlong dùng để thay đổi thuộc tính của 1 cửa sổ

cú pháp :
PHP:
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

Trong đó :


  • hWnd
    Handle của cửa sổ.
  • nIndex
    Giá trị qui định thông tin muốn thay đổi, gồm 1 trong các hằng số sau:
    GWL_EXSTYLE
    Đặt lại kiểu của cửa sổ mở rộng.
    GWL_STYLE ( chính là số -16 mà bạn hỏi )
dwNewLong là giá trị mà bạn muốn thay thế

** Mấy số -1 ,+1 là giá trị tang kích thước của form : Me.height +1 = chiều cao form +1

 
Upvote 0
Upvote 0
Vậy nhờ Bác hungpecc1 giải thích dùm em đoạn code này :
Mã:
Private Sub UserForm_Initialize()
Dim lhwnd As Long         
   lhwnd = FindWindow("ThunderDFrame", "UserForm1")
     RemoveMenu GetSystemMenu(lhwnd, 0), 6, MF_BYPOSITION
 
Lần chỉnh sửa cuối:
Upvote 0
Tất cả các chương trình, đối tượng chạy trên Windows đều chiếm giữ các vùng nhớ, địa chỉ của các vùng nhớ đó Windows quản lý bằng số nguyên dạng Long. Địa chỉ của các điều khiển này Windows định nghĩa là Handle. Cách viết lHwnd (H-handle; Wnd-window) ám chỉ biến nắm giữ vùng nhớ của đối tượng dạng Long. "Wnd" người lập trình muốn nói rằng vùng nhớ quản lý cửa sổ/Window. Tất cả các ứng dụng, đối tượng điều khiển giao diện, Windows đều đưa nó về khái niệm cửa sổ - Window (đây có thể lý do liên quan tới cái tên hệ điều hành Windows).

Để can thiệp vào các thành phần của cửa sổ thì các hàm truy xuất phải tìm tới địa chỉ vùng nhớ. Giống như muốn gọi điện đến nơi tư vấn các vấn đề chung thì phải gọi số 1080 rồi hỏi gì thì hỏi. 1080 coi là địa chỉ vùng nhớ quản lý một bộ tài nguyên làm việc. Nhà mạng quản lý con số 1080 như là hệ điều hành Windows.

Trong ví dụ của bạn. Muốn thay đổi thuộc tính của cửa sổ Userform thì phải là:
1. Tìm địa chỉ vùng nhớ quản lý cửa sổ:
lHwnd = FindWindow(...). Địa chỉ vùng nhớ nếu tìm được sẽ đc gán vào biến lHwnd.
2. Lấy hoặc thiết lập cửa sổ, các hàm Windows API sẽ dùng địa chỉ cửa sổ làm tham số để truy xuất đúng vùng nhớ-đối tượng. Ví dụ
GetWIndowLong(lHwnd,...)
SetWIndowLong(lHwnd,...)
MessageBox(GetActiveWindow(),..). GetActiveWindow() trả về địa chỉ của cửa sổ cha (hiện tại) - Parent Window để cái hộp thoại MessageBox nằm nổi lên trên.
...
Tóm lại, liên quan đến lập trình cao cấp dùng hàm Windows API là Handle rất quan trọng. Can thiệp đối tượng phải thông qua nó, nếu quá trình lập trình bị lỗi, biến lưu địa chỉ (lHwnd) bị xoá thì mất điều khiển, giống mất hộ chiếu thì đối tượng bạn đang can thiệp "bơ vơ" - Treo luôn :). Thế nên nếu lập trình API cần phải làm một cách hoàn hảo, không đc xảy ra một lỗi nào như sau:
1. Lấy handle: lHwnd=FindWindow(...)
2. Lấy thiết lập cũ: lPrevStyle = GetWindowLong(lHwnd,..)
3. Thiết lập : lOldObject = SetWindowLong(lHwnd,..)
4. Hoàn trả thiết lập cũ: SetWindowLong(lHwnd,.., lPrevStyle)

Các hàm Windows API, ActiveX Controls còn liên quan đến kiến thức Windows 32-bit, 64-bit chính vì thế nhiều ứng dụng Excel gần đây bị lỗi trên Office 64-bit (từ Office 2010 trở lại đây) vì tác giả của các ứng dụng đó chưa lường hết vấn đề lập trình đa môi trường.
 
Upvote 0
Vậy nhờ Bác hungpecc1 giải thích dùm em đoạn code này :
Mã:
Private Sub UserForm_Initialize()
Dim lhwnd As Long         
   lhwnd = FindWindow("ThunderDFrame", "UserForm1")
     RemoveMenu GetSystemMenu(lhwnd, 0), 6, MF_BYPOSITION

Bạn có thể tra cứu thông qua google.com, ( nếu tài liệu bằng Tiếng Anh, thì dùng them translate )

Code này có vẻ như bạn muốn làm mờ nút X trên user form
https://msdn.microsoft.com/en-us/library/windows/desktop/ms647985(v=vs.85).aspx

https://msdn.microsoft.com/en-us/library/windows/desktop/ms647994(v=vs.85).aspx
 
Upvote 0
code của anh mà anh giấu nghề kỹ quá :
http://www.giaiphapexcel.com/forum/showthread.php?24123-Tạo-hiệu-ứng-cho-UserForm/page2

Bài số 15:

Tạo title Tiếng Việt cho user Form



- Ngày xưa "liều mạng" nên viết vậy chứ bây giờ tôi viết khác
- Ngày xưa tôi chẳng cần để tâm đến mấy hằng số API (GWL_STYLE... ) làm gì, vì tôi thấy nó.. không gọn bằng cách viết số trực tiếp. Còn bây giờ thì tôi thấy nó cần rồi (lâu ngày nhìn lại, chẳng biết con số -16, &H84080080... là cái giống gì nữa)
Ví dụ bây giờ tôi viết:
Mã:
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 GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long

Private Const WS_CAPTION = &HC00000
Private Const GWL_STYLE = (-16)

Private Sub UserForm_Initialize()
  Dim lHwnd As Long, lStyle As Long
  lHwnd = FindWindow("THUNDERDFRAME", Me.Caption)
  lStyle = GetWindowLong(lHwnd, GWL_STYLE)
  lStyle = lStyle And Not WS_CAPTION
  SetWindowLong lHwnd, GWL_STYLE, lStyle
  DoEvents
End Sub
------------------
Code này có vẻ như bạn muốn làm mờ nút X trên user form
Hình như là để remove tiêu đề UserForm thì phải
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom