Làm sao để hiện 1 controls bên dưới trỏ chuột khi click chọn (1 người xem)

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

vba_gpe

Thành viên thường trực
Tham gia
15/12/10
Bài viết
296
Được thích
44
Nghề nghiệp
Thất nghiệp
Em nhờ anh/chị giúp vấn đề này với.
Em muốn làm 1 form, trong form có 1 listview gồm nhiều dòng.
Khi chọn vào từng dòng, có 1 frame (hay một cotrol bất kỳ nào như label) xuất hiện bênh dưới con trỏ chuột của em.

E nghĩ chỉ cần bắt được vị trí của trỏ chuột, sau đó gán 2 giá trị left và top của controls là được, tuy nhiên khi đưa vào lại không khớp vì giá trị pixel nó đi đâu đâu. Có cách nào quy đổi từ giá trị pixel của chuột sang giá trị left, top của control không?

Em tham khảo trên diễn đàn mình chỉ có bài viết bắt vị trí của trỏ chuột trong excel chứ chưa thấy trong form.
Tham khảo trên google thì thấy có code bắt vị trí của chuột.
Mã:
Public CusorLocation As POINTAPI
Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long
Type POINTAPI
    x As Long
    y As Long
End Type

Em có gửi file nhờ anh/chị xem giúp.
Cảm ơn mọi người rất nhiều.
 

File đính kèm

Lần chỉnh sửa cuối:
Chưa hiểu mục đích của bạn là gì, nếu chỉ là để ghi chú thôi thì bạn thử tìm hiểu theo từ khóa "Tooltip" xem sao nhé.
 
Upvote 0
Chưa hiểu mục đích của bạn là gì, nếu chỉ là để ghi chú thôi thì bạn thử tìm hiểu theo từ khóa "Tooltip" xem sao nhé.
Dạ mục đích của em là ngay chỗ cái dòng thông tin đó, em đưa vào một cái Frame (Giống như cái chọn lịch của Microsoft project vậy đó anh).
 

File đính kèm

  • vd.jpg
    vd.jpg
    36 KB · Đọc: 61
Upvote 0
Dạ mục đích của em là ngay chỗ cái dòng thông tin đó, em đưa vào một cái Frame (Giống như cái chọn lịch của Microsoft project vậy đó anh).

Mấu chốt là bạn cần cho mục đích gì, bạn có thể chia sẻ được không, vì nếu theo định hướng của bạn là chèn "cái Frame" vào vị trí con trỏ chuột thì mình tự hỏi bạn click chuột vào frame này như thế nào đây.
 
Upvote 0
Mấu chốt là bạn cần cho mục đích gì, bạn có thể chia sẻ được không, vì nếu theo định hướng của bạn là chèn "cái Frame" vào vị trí con trỏ chuột thì mình tự hỏi bạn click chuột vào frame này như thế nào đây.
Ý em là mình làm cái chọn ngày giống như cái của Project vậy đó anh. (Giống như trên hình em đưa lênh) Trong đó cái lịch thì mình không cần bàn, cái lịch ở đây là tương ứng một cái frame của Form vậy, trong đó mình sẽ làm riêng cho cái lịch.
Chủ yếu là bây giờ mình bắt đúng cái vị trí của con trỏ chuột tại từng vị trí của listview để load cái frame (Hay là cái lịch) vào vị trí đó để chọn lịch là được.
Trên hình em đưa lênh đó là cái grid (Về chỗ này mình có thể sử dụng list view được phải không anh).
Cảm ơn anh.
 
Lần chỉnh sửa cuối:
Upvote 0
Ý em là mình làm cái chọn ngày giống như cái của Project vậy đó anh. (Giống như trên hình em đưa lênh) Trong đó cái lịch thì mình không cần bàn, cái lịch ở đây là tương ứng một cái frame của Form vậy, trong đó mình sẽ làm riêng cho cái lịch.
Chủ yếu là bây giờ mình bắt đúng cái vị trí của con trỏ chuột tại từng vị trí của listview để load cái frame (Hay là cái lịch) vào vị trí đó để chọn lịch là được.
Trên hình em đưa lênh đó là cái grid (Về chỗ này mình có thể sử dụng list view được phải không anh).
Cảm ơn anh.

Vậy bạn gửi file đính kèm của bạn có list view lên nhé, để mọi người hướng dẫn cho thống nhất (nếu bạn đã bước đầu làm được code nào thì cũng cứ up lên)
 
Upvote 0
Em có gửi kèm theo file.
Nhờ anh chị xem giúp

Có kèm hình minh họa mong muốn của em.
 

File đính kèm

  • vd.xls
    vd.xls
    44 KB · Đọc: 24
  • Hinh minh hoa.jpg
    Hinh minh hoa.jpg
    64 KB · Đọc: 18
Lần chỉnh sửa cuối:
Upvote 0
Em nhờ anh/chị giúp vấn đề này với.
Em muốn làm 1 form, trong form có 1 listview gồm nhiều dòng.
Khi chọn vào từng dòng, có 1 frame (hay một cotrol bất kỳ nào như label) xuất hiện bênh dưới con trỏ chuột của em.
E nghĩ chỉ cần bắt được vị trí của trỏ chuột, sau đó gán 2 giá trị left và top của controls là được, tuy nhiên khi đưa vào lại không khớp vì giá trị pixel nó đi đâu đâu. Có cách nào quy đổi từ giá trị pixel của chuột sang giá trị left, top của control không?
Bạn sử dụng thủ tục sự kiện Listbox1_MouseDown để lấy vị trí con trỏ chuột trong listbox. Kết hợp với các thuộc tính top, left của listbox1 để tính vị trí trong form. Còn nếu bạn muốn tìm vị trí trên màn hình thì kết hợp thêm top, left của form.
 
Upvote 0
Bạn sử dụng thủ tục sự kiện Listbox1_MouseDown để lấy vị trí con trỏ chuột trong listbox. Kết hợp với các thuộc tính top, left của listbox1 để tính vị trí trong form. Còn nếu bạn muốn tìm vị trí trên màn hình thì kết hợp thêm top, left của form.
Nhờ bạn Hau151978 làm mẫu giúp một file được không? Mình đang bị vướng cái chỗ quy đổi từ vị trí của chuột qua vị trí của các control trong form.
Vị trí của chuột là đơn vị tính pixel, còn controls trong form hình như là đơn vị tính khác hay sao đó. Mình lấy top, left của 1 cái cotrols bất kỳ mà không phù hợp với vị trí của chuột.
Cảm ơn bạn nhiều
 
Lần chỉnh sửa cuối:
Upvote 0
Em có gửi kèm theo file.
Nhờ anh chị xem giúp

Có kèm hình minh họa mong muốn của em.
Bạn nên dùng sự kiện mousedown và mouseup trong listview như bạn Hau151978 đã nói nhằm tận dụng tọa độ của con trỏ chuột.
Bạn cần lưu ý:
Tọa độ X, Y trả về trong sự kiện mousedown/up là Pixel, trong khi đó, tọa độ của thuộc tính Top/ left các control trên form là Point. Do vậy cần có chuyển đổi giữa pixel với point. Bạn có thể tra microsoft support để tìm hiểu về việc chuyển đổi này hoặc có thể sự dụng hàm sau:
[GPECODE=vb]Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal HDC As Long) As Long
Private Declare Function GetDeviceCaps Lib "gdi32" (ByVal HDC As Long, ByVal nIndex As Long) As Long
Private Const LOGPIXELSX = 88
Private Const LOGPIXELSY = 90
Public Enum Direction
VERTICAL = 1
HORIZONTAL = 0
End Enum
Function PixelsToPoint(Pixels As Long, Dir As Direction) As Long
On Error GoTo Error
Dim HDC As Long
Dim PixelsPerInch As Long
HDC = GetDC(0)
If Dir = HORIZONTAL Then
PixelsPerInch = GetDeviceCaps(HDC, LOGPIXELSX)
Else
PixelsPerInch = GetDeviceCaps(HDC, LOGPIXELSY)
End If
lDeviceHandle = ReleaseDC(0, HDC)
PixelsToPoint = Pixels * 72 / PixelsPerInch
fExit:
On Error Resume Next
Exit Function
Error:
MsgBox Err.Description, vbOKOnly + vbCritical, "Error: " & Err.Number
End Function
[/GPECODE]
Tọa độ X, Y trả về của sự kiện ListView lấy "gốc tọa độ" (0,0) là phía trên bên trái của Listview, còn Left/ Top thì lấy phía trên bên trái của User form.
Sự kiện của Listview1 có thể như sau:
[GPECODE=vb]Private Sub ListView1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As stdole.OLE_XPOS_PIXELS, ByVal Y As stdole.OLE_YPOS_PIXELS)
Frame1.Visible = True
Frame1.Top = ListView1.Top + PixelsToPoint(Y, VERTICAL)
Frame1.Left = ListView1.Left + PixelsToPoint(X, HORIZONTAL)
End Sub
[/GPECODE]
 
Upvote 0
Tọa độ X, Y trả về của sự kiện ListView lấy "gốc tọa độ" (0,0) là phía trên bên trái của Listview, còn Left/ Top thì lấy phía trên bên trái của User form.
Cảm ơn anh rất nhiều, em đã làm được.
Hàm này em đã thấy ở bài viết của anh Tuân nhưng chưa được giải thích cặn kẽ nên chưa hiểu.
Bây giờ đã hiểu tường tận.
Chúc anh/chị nhiều sức khỏe.
 
Upvote 0

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

Back
Top Bottom