Thiết kế UserForm bài số 13: Tạo menu chuột phải

Euler

Mod
Thành viên BQT
Bài học thiết kế số 01
Bài học thiết kế số 02
Bài học thiết kế số 03 .
Bài học thiết kế số 04 .
Bài học thiết kế số 05 .
Bài học thiết kế số 06 .
Bài học thiết kế số 07 .
Bài học thiết kế số 08 .
Bài học thiết kế số 09 .
Bài học thiết kế số 10 .
Bài học thiết kế số 11 .
Bài học thiết kế số 12 xem .
=========================
Nói tới sự kiện click chuột phải trên UserForm, chúng ta đã có một topic .
Tuy nhiên, thiết kế giao diện cho Menu chuột phải nếu theo cách làm ở topic mà tôi vừa nói ở trên, sẽ có những khó khăn nhất định, mức độ tùy biến thấp.
Sau khi tham khảo cách làm của một Tool của Nhật, tôi thấy rằng cách dưới đây sẽ có nhiều ưu điểm hơn.
Bởi vì các bạn có thể tùy biến rộng hơn.

1. Cách nghĩ:
Chẳng hạn tôi có một Label1. Tôi muốn khi click chuột phải trên Label 1 thì sẽ hiện ra Frame1.
Bạn cần đăng nhập để thấy đính kèm

Như vậy Frame1 sẽ đóng vai trò là Menu chuột phải cho nhãn Label1.
Vì chúng ta thiết kế trực tiếp trên UserForm, do đó mức độ tùy biến của các bạn là tùy ý.

2. Frame1 được ẩn đi như thế nào?
Bạn có thể thiết định Visible để ẩn Frame1 ngay khi UserForm được khởi động.
Hoặc các bạn giấu nó đi bằng cách thu gọn UserForm.
Bạn cần đăng nhập để thấy đính kèm


3. Khi click chuột phải trên Label1, Frame1 được hiển thị nhưng ta cần điều chỉnh vị trí cho Frame1 hiển thị sát ngay Label1.

Mã:
Private Sub Label1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    If Button <> 2 Then Exit Sub 'Nếu không phải là click chuột phải thì thôi'
    Frame1.Left = Label1.Left + Label1.Width 'Điều chỉnh vị trí cho Frame1 sát với Label1'
    Frame1.Top = Label1.Top
    Me.Frame1.Visible = True 'Hiển thị Frame1'
End Sub
Bạn cần đăng nhập để thấy đính kèm


Trên đây tôi đã trình bày xong cách nghĩ-ý tưởng. Tôi nghĩ đến đây thì với những người có khả năng code VBA ở mức độ nào đó đã có thể tự mình luyện tập.
Tuy nhiên, với các bạn chưa có nhiều kinh nghiệm code, việc tự làm file demo có thể là khó. Vậy thì ở phần sau tôi sẽ nói rõ hơn và cung cấp file demo cho các bạn.
 
V

vothanhthu

Guest
Cái này hay quá đi mất.

Thứ cũng đóng góp thêm chút ít. Dựa vào những gì đã có ở #1, ta hoàn toàn có thể tạo ra thêm một Menu chuột phải đúng nghĩa.
Bạn cần đăng nhập để thấy đính kèm


Ta tạo thêm một sự kiện khi click chuột sẽ ẩn frame đi
Mã:
Private Sub UserForm_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
Frame1.Visible = False 'CLICK TRAI THI FRAME BIEN MAT
End Sub
Và sự kiện ẩn Frame khi mở Userform lên
Mã:
Private Sub UserForm_Initialize()
Frame1.Visible = False 'TAT FRAME KHI MO USERFORM
End Sub
Và còn lại là các nút gọi Macro với đổi tên Label đơn giản
Mã:
Private Sub CommandButton1_Click()
Label2.Caption = CommandButton1.Caption
End Sub

Private Sub CommandButton2_Click()
Label2.Caption = CommandButton2.Caption
End Sub

Private Sub CommandButton3_Click()
Label2.Caption = CommandButton3.Caption
End Sub

Private Sub CommandButton4_Click()
Label2.Caption = CommandButton4.Caption
End Sub

Private Sub CommandButton5_Click()
Label2.Caption = CommandButton5.Caption
End Sub
Đây là File Demo, để tải về

Vậy là chúng ta đã có thể tạo Menu chuột phải cho một Label hoặc một Control nào đó rồi.
 
Sửa lần cuối bởi điều hành viên:

tuhocvba

Administrator
Thành viên BQT
Nếu chuột phải, mà không trỏ chuột vào menu đó hoặc chuột nằm ngoài cái label1 của các bạn trong thời gian độ 3-5s thì nên tắt menu một cách tự động.
@vothanhthu nghiên cứu lại cái file mà Euler nhờ hôm trước ấy. Mình thấy cái menu chuột phải nó tự động tắt đi nếu di chuyển chuột ra label khác thì sau một khoảng thời gian nhất định, menu tự tắt.
 

vbano1

SMod
Thành viên BQT
Để di chuyển chuột ra ngoài thì ẩn menu popup:
Bạn cần đăng nhập để thấy đính kèm


Ta cần code cho sự kiện chuột di chuyển trên UserForm:
Mã:
Private Sub UserForm_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    With Me
        With .Frame
            If .Visible Then .Visible = False         
        End With
    End With
End Sub
File demo .
 
V

vothanhthu

Guest
Dựa trên #4 và Bài học số 4, link . Ta tinh chỉnh thêm một chút nhìn cho đẹp hơn, đổi màu khi chọn vào Menu
Bạn cần đăng nhập để thấy đính kèm

Các đoạn Code cần thêm vào:
Sub gọi để hủy toàn bộ màu trên Label
Mã:
Sub NullColor()
      Me.Label2.BackColor = &H8000000F
      Me.Label3.BackColor = &H8000000F
End Sub
Di chuyển chuột vào Label 2 và Label3 thì sẽ đổi màu XANH LÁ
Mã:
Private Sub Label2_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    Call NullColor
    Label2.BackColor = RGB(0, 255, 0)

Private Sub Label3_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
     Call NullColor
     Label3.BackColor = RGB(0, 255, 0)
End Sub
End Sub
Click chuột vào Label 2 và 3 thì sẽ mất Frame
Mã:
Private Sub Label2_Click()
    Me.Frame1.Visible = False
    Label4.Caption = "Label2 Click"
    DoEvents
End Sub

Private Sub Label3_Click()
    Me.Frame1.Visible = False
    Label4.Caption = "Label3 Click"
    DoEvents
End Sub
Sự kiện di chuyển chuột trong Userform
Mã:
Private Sub UserForm_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    Call NullColor

    With Me.Frame1
        If .Visible Then .Visible = False
    End With
End Sub
Và Code sự kiện gọi Frame khi click chuột phải vào Label1 tại #1
Mã:
Private Sub Label1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    If Button <> 2 Then Exit Sub
    Frame1.Left = Label1.Left + Label1.Width
    Frame1.Top = Label1.Top
    Me.Frame1.Visible = True
End Sub
File demo
 
Top