Những câu hỏi nhỏ (phan 2)
Chức năng Wordwrap / Mẫu hàm API Có rất nhiều cách gọi trình duyệt Internet Explorer của Windows. Ơở đây tôi xin bày cho bạn 1 cách đơn giản nhất. Để chạy một chương trình khác từ ...
Chức năng Wordwrap / Mẫu hàm API
Có rất nhiều cách gọi trình duyệt Internet Explorer của Windows. Ơở đây tôi xin bày cho bạn 1 cách đơn giản nhất. Để chạy một chương trình khác từ Visual Basic, bạn buộc phải dùng hàm Shell(), đối số là gì, đó mới là điều quan trọng.
Thường IE nằm ở Program FilesInternet ExplorerIExplorer.exe thư mục Program Files nằm cùng ổ đĩa với thư mục Windows. Tóm lại, ta tìm thư mục Windows ở ổ đĩa nào, sau đó lấy 2 ký tự đầu tiên là tên ổ đĩa (Vi dụ C:), kế đến bạn hãy ghép với "Program FilesInternet ExplorerIExplorer.exe" để được đường dẫn đến IE rõ ràng. Tuy nhiên cách này sẽ "phá sản" nếu như người dùng "ngẫu hứng" cài IE ở một thư mục khác.
Có một cách khác hơi "mánh mung" một chút, nhưng đơn giản hơn và triệt để hơn rất nhiều. Bạn có thể "xí gạt" Windows để gọi IE thông qua Windows Explorer bằng cách chuyển cho nó một tham số là file htm, lúc này tự động Windows Explorer nhận biết và "alô" đến cho IE để vào thế chỗ. Vậy cũng xong chuyện, việc gọi Windows Explorer rất đễ dàng
Thí dụ: Cần gọi IE để hiển thị file "testfile.htm" bạn có thể dùng hàm Shell() như sau:
Shell("explorer.exe testfile.htm",vbNormalFocus)
Lưu ý: cách này đòi hỏi hệ thống bạn phải có Internet Explorer 4 trở lên.
Thật là đơn giản phải không bạn ?
Tạo chức năng WordWrap bằng thuộc tính ScrollBars của TextBox
Gọi Internet Explorer / Mẫu hàm API
Trong các trình soạn thảo văn bản (như Notepad). Nếu chức năng Wordwrap được chọn, khi gõ văn bản đến giới hạn của cạnh phải của sổ, thì văn bản tự động rớt xuống dòng dưới. Ngược lại nếu không cho hiệu lực chức năng này, chỉ khi nào bạn nhấn phím Enter mới xuống dòng được.
Bạn có muốn tạo 1 tính năng Wordwrap như trong Notepad không ? Cũng dễ lắm. Chúng ta hãy lợi dụng thuộc tính ScrollBars của Textbox để làm tính năng Wordwrap.
Properties ScrollBars
Thuộc tính này dùng để quy định cho Textbox có các thanh cuộn hay không, nhưng thuộc tính này chỉ có tác dụng khi thuộc tính Multiline của Textbox = True.
0 - None: Textbox không có thanh cuộn.
1 - Horizontal: Chỉ có thanh cuộn ngang.
2 - Vertical: Chỉ có thanh cuộn đứng.
3 - Both:Có cả 2 thanh cuộn ngang và đứng.
Tính năng Wordwrap chỉ có tác dụng khi thuộc tính ScrollBars là:
0 - None hoặc 2 - Vertical
Không có Wordwrap khi ScrollBars là:
1 - Horizontal hoặc 3 - Both
Nhưng thuộc tính này không thể thay đổi trong lúc chương trình thực thi. Chỉ cho phép thay đổi trong lúc thiết kế mà thôi. Do đó bạn phải tạo luôn 2 Textbox: Một Textbox không có Wordwrap (Text1), một Textbox có Wordwrap (Text2).
Trong lúc thiết kế bạn hãy cho 1 Textbox ẩn đi (Visible = False). Trong thí dụ minh họa này tôi cho Text2 ẩn.
Text1.Visible = True
Text2.Visible = False
Sau đó hãy tạo một Control nào đó để chuyển đổi qua lại giữa chế độ Wordwrap và không Wordwrap. Trong minh họa này tôi đã tạo luôn một trình Notepad, và đặt lệnh Wordwrap vào menu Edit của chương trình (Name: WWrap).
Sau đây là Code của một số Control cần thiết cho việc Demo chức năng Wordwrap.
Option Explicit
Private Sub Form_Resize()
Text1.Move 0, 0, ScaleWidth, ScaleHeightText2.Move 0, 0, ScaleWidth, ScaleHeight
End Sub
Điều chỉnh kích thước và vị trí của 2 Textbox, cho thích hợp với kích thước của Form mỗi khi người dùng thay đổi kích thước cửa sổ, hoặc chương trình khởi động. Xin bạn hãy nhớ một điều là: tình huống Form_Resize luôn luôn được triệu gọi mỗi khi Form_Load.
Private Sub mnuWWrap_Click()
mnuWWrap.Checked = Not (mnuWWrap.Checked) If mnuWWrap.Checked = True Then Text1.Visible = False Text2.Visible = True Text2.SetFocus Else Text1.Visible = True Text2.Visible = False Text1.SetFocus End If
End Sub
Các lệnh cần xử lý khi người dùng chọn chức năng Wordwrap. Cho ẩn hiện Text1 hay Text2 tùy theo trạng thái (check hoặc không check) của menu WordWrap.
Private Sub Text1_Change()
Text2.Text = Text1.Text
End Sub
Private Sub Text2_Change()
Text1.Text = Text2.Text
End Sub
Tuy nhiên tại mỗi thời điểm, người dùng chỉ làm việc (gõ văn bản) trên một Textbox mà thôi, cho nên ta phải tiến hành cập nhật liên tục nội dung của 2 Textbox mỗi khi có 1 sự thay đổi nào đó trên bất cứ Textbox nào nhờ vào thủ tục tình huống Change.
Nhưng nếu chỉ bấy nhiêu đó thôi thì không ổn. Mỗi lần người dùng chuyển qua lại giữa Wordwrap và không Wordwrap tức là thay đổi Textbox, tự nhiên người dùng có cảm giác là lạ do con trỏ không nằm đúng vị trí quả thật là hơi "vô duyên". Để khắc phục nhược điểm trên bạn hãy thêm vài dòng Code sau đây vào chương trình đảm bảo người dùng không hề biết được là bạn đã đánh tráo Textbox của họ mỗi khi chọn chức năng Wordwrap.
Private Sub Text1_GotFocus()
Text1.SelStart = Text2.SelStart
End Sub
Private Sub Text2_GotFocus()
Text2.SelStart = Text1.SelStart
End Sub
Bây giờ bạn hãy chạy thử chương trình và gõ vào vài dòng văn bản, sau đó chọn lệnh Wordwrap vài lần xem, úi cha ! thật là tuyệt, chính bạn còn bị "lừa"nữa.
Gọi Internet Explorer / Chức năng Wordwrap
Để biết cách khai báo hàm API bạn cần khởi động tiện ích API Text Viewer được cung cấp kèm theo Visual Basic.
Nạp file Win32api.txt vào, chọn Declares trong phần API Type (có thể bạn phải chờ giây lát để chương trình load file này lên vì kích thước rất lớn). Hoặc bạn cũng có thể xem trực tiếp file này (dạng Text) bằng Wordpad.
Sau đó, bạn hãy chọn hàm trong danh sách Available Items, hàm nào cần dùng nhấn nút Add để thêm vào hộp văn bản Select Items phía đưới. Sau khi đã chọn xong tất cả các hàm cần dùng, nhấn nút Copy để chép các hàm vừa chọn vào Clipboard. Kế đến bạn chỉ việc Paste vào Visual Basic để dùng mà thôi.
Các hàm API có 2 dạng: hàm (Function) có trị trả về và thủ tục (Sub) không có trị trả về.
Khai báo cho hàm có trị trả về như sau:
Declare Function <tên hàm API> Lib <Tên thư viện> [Alias <tên bí danh>]([danh sách các đối số])
Khai báo cho các thủ tục:
Declare Sub <tên hàm API> Lib <tên thư viện> [Alias <tên bí danh>]([danh sách các đối số])
<tên hàm API> là tên hàm trong các file thư viện DLL.
<tên thư viện> tên file thư viện DLL để Visual Basic tìm các hàm API. Các file thư viện này phải có đầy đủ tên cùng phần mở rộng, riêng đối với 3 thư viện USER, KERNEL, và GUI thì không cần phải có phần mở rộng. Tên này là một String nên cần phải bao trong dấu "".
[Alias <tên bí danh>] có thể có hay không cũng được. Bạn cần khai báo bí danh khi muốn triệu gọi hàm API với một cái tên khác do chính bạn đặt, hoặc trong tên hàm chuẩn có chứa ký tự bị cấm sử dụng trong Visual Basic, lúc này bạn hãy đặt bí danh cho nó để Visual Basic sử dụng được.
Ví dụ hàm API "AddfontResource " sau đây được đặt lại bí danh là AddFont cho ngắn gọn mỗi lần gọi hàm.
Declare Function AddFontResource Lib "gdi32" Alias "AddFont" (ByVal lpFileName As String) As Long
Phạm vi sử dụng của hàm API cũng phụ thuộc vào các vị trí khai báo nó như cách khai báo các biến trong Visual Basic
Thêm một đối tượng trong lúc chương trình thực thi |
Ngoài các Control trong lúc thiết kế chương trình được bạn tạo ra, trong lúc chương trình đang thực thi (chạy) bạn vẫn có thể tạo thêm các Control một cách khá dễ dàng với điều kiện như sau để tạo nên một mảng các Control.- Phải có tối thiểu 1 Control ban đầu- Có thuộc tính Index = 0Trong lúc chương trình chạy bạn có thể dùng câu lệnh sau đây để Load một Control lên. Khi Control được Load lên nó sẽ mang các thuộc tính giống hệt với cái ban đầu chỉ trừ chỉ số Index. Bạn hãy dùng lệnh sau để Load. Với Index là chỉ số của phần tử kế tiếp trong mảngLoad object(index)Visual Basic chỉ cho phép bạn Load đến 32767 (Giới hạn của Integer) phần tử trong một mảng mà thôi.Sau đây là một thí dụ minh họa cách thêm CommandButton- Bạn hãy tạo một CommandButton, đặt thuộc tính Name = cmdBtn và Index = 0 (zero). Khi bạn nhập vào thuộc tính Index của một con số cũng có nghĩa là bạn đã tạo một mảng các đối tượng đó.- Paste vào đoạn Code sau:Private Sub cmdBtn_Click(Index As Integer)Dim btn As CommandButtonDim iIndex As IntegeriIndex = cmdBtn.CountIf iIndex <= 32767 Then Load cmdBtn(iIndex) Set btn = cmdBtn(iIndex) With btn .Top = cmdBtn(iIndex - 1).Top + 620 .Caption = "Command" & iIndex + 1 .Visible = True End With Set btn = NothingEnd IfEnd Sub Nhấn F5 chạy thử chương trình, Click chuột vào CommandButton bạn sẽ thấy một CommandButton nữa xuất hiện phía dưới. |
Nhờ ToolTip để hiển thị dữ liệu quá dài trong ListBox |
Bạn có khi nào bạn gặp trường hợp Item cần hiển thị trong ListBox lại dài hơn bề rộng của Listox không ? Trong rất dị hợm phải không ? Tự nhiên mất khúc đuôi của người ta.Và đây là giải pháp. Bạn hãy dùng một ToolTip, nội dung của ToolTip chính là nội dung Item của ListBox mỗi khi bạn rê Mouse đến.Hãy mở 1 form mới, trên đó tạo 1 ListBox (Name: List1). Tôi phải dùng đến hàm API SendMessage và hằng (LB_ITEMFROMPOINT = &H1A9) để làm việc này.Option ExplicitPrivate Declare Function SendMessage Lib "user32" Alias "SendMessageA" _(ByVal hwnd As Long,ByVal wMsg As Long, ByVal wParam As Long, _lParam As Any) As LongPrivate Const LB_ITEMFROMPOINT = &H1A9Ơở thủ tục tình huống Form_Load() bạn hãy thêm vào vài dòng lệnh để Add vào ListBox (Nhớ cho dòng dữ liệu dài dài một chút để thấy rõ tác dụng).Private Sub Form_Load()List1.AddItem "Tao bo dia cai dat phan mem"List1.AddItem "Su dung Font Navigator"List1.AddItem "Tao man hinh Splash Screen"List1.AddItem "EditPlus (Text/HTML Editor for Windows)"List1.AddItem "Tu tao Progress bar cho ung dung"List1.AddItem "Combo box tu hien danh sach khi nhan focus"List1.AddItem "Cua so FormLayout dung de lam gi"End Sub'Khi rê mouse trên ListBox, thủ tục sau đây sẽ lấy nội dung của Item tại vị trí Mouse và cho hiện lên bằng ToolTip.Private Sub List1_MouseMove(Button As Integer, Shift As Integer, _X As Single, Y As Single)Dim lXPoint As LongDim lYPoint As LongDim lIndex As Long If Button = 0 Then 'Nếu không có nút nào được nhấnlXPoint = CLng(X / Screen.TwipsPerPixelX)lYPoint = CLng(Y / Screen.TwipsPerPixelY)With List1 lIndex = SendMessage(.hwnd,LB_ITEMFROMPOINT,0, _ByVal ((lYPoint * 65536) + lXPoint)) 'Hiện ToolTip hoặc xóa cái trước đó If (lIndex >= 0) And (lIndex <= .ListCount) Then.ToolTipText = .List(lIndex)Else.ToolTipText = ""End IfEnd WithEnd IfEnd Sub |
Làm sao để TextBox tự động Select văn bản mỗi khi nhận focus ? |
Bạn có chú ý ở hầu hết các phần mềm, nếu người dùng cần nhập liệu vào một hộp văn bản (TextBox) nào đó, thì khi người dùng nhấn Mouse hoặc Tab để chuyển đến TextBox, tức thì toàn bộ dữ liệu đang hiện có trong TextBox sẽ được Select. Cách này giúp người dùng gõ dữ liệu khác đè lên dữ liệu hiện hữu, mà không phải mất công xóa đi rồi gõ lại cái khác.Viết một thủ tục riêng, thủ tục này nhận đối số là một TextBoxPublic Sub FocusMe(ctlName As TextBox)With ctlName.SelStart = 0.SelLength = Len(ctlName)End WithEnd Sub'Bây giờ bạn hãy gọi hàm này trong thủ tục tình huống GotFocus của một TextBoxPrivate Sub txtFocusMe_GotFocus()Call FocusMe(txtFocusMe)End SubHy vọng những câu hỏi nhỏ này sẽ giúp ích cho bạn trong lúc phát triển một ứng dụng bằng Visual Basic. Chúc bạn thành công. |
Trong kỳ này:
1. Kiểm tra sự tồn tại của file ở bất kỳ đâu2. Kiểm tra độ phân giải màn hình3. Import file reg vào registry4. Sự khác nhau khi load form ở chế độ MODAL & MODELESS5. Khi nào, tại sao phải dùng Option Explicit6. Tạo menu PopUp
1. Kiểm tra sự tồn tại của file ở bất kỳ đâu
2. Kiểm tra độ phân giải màn hình3. Import file reg vào registry4. Sự khác nhau khi load form ở chế độ MODAL & MODELESS5. Khi nào, tại sao phải dùng Option Explicit6. Tạo menu PopUp
Để giữ cho ứng dụng của bạn suôn sẻ khi chạy tránh trường hợp bị lỗi chương trình và ngừng một cách "bất hợp pháp", nếu người gặp lỗi là chính bạn thì không có gì, nhưng nếu người gặp lỗi không phải là bạn, bạn sẽ bị "mất mặt" vì chương trình của mình. Cụ thể hơn, trong quá trình làm việc với file, bạn cần phải luôn kiểm tra file có tồn tại hay không trước khi thực hiện một tác vụ ghi đọc nào đó. Dưới đây là một chương trình con dùng để kiểm tra, đối số duy nhất là đường dẫn file cần mở.
Public Sub VerifyFile(FileName As String)
'
On Error Resume Next
'Mở file thử để kiểm tra
Open FileName For I`165432nput As #1
If Err Then
MsgBox ("The file " & FileName & " cannot be found.")
Exit Sub
End If
Close #1
'
End Sub
Bạn hãy đặt nó vào một module để sử dụng cho toàn chương trình.
Nếu quá trình kiểm tra diễn ra tốt đẹp thì không có gì, nếu có trục trặc bạn sẽ thấy một MsgBox xuất hiện, nhờ bẫy lỗi, chương trình của chúng ta vẫn hoạt động tiếp tục. Bây giờ bạn hãy tạo một form mới, thêm vào một CommandButton (Name: cmdVerify), gõ vào đoạn Code cho tình huống Click(), nhấn F5 chạy thử. Với chương trình con như vậy bạn có thể gọi nó để kiểm tra sự tồn tại của file trong chương trình.
Private Sub cmdVerify_Click()
'
Call VerifyFile("MyFile.txt")
'
End Sub
2. Kiểm tra độ phân giải màn hình
1. Kiểm tra sự tồn tại của file ở bất kỳ đâu3. Import file reg vào registry4. Sự khác nhau khi load form ở chế độ MODAL & MODELESS5. Khi nào, tại sao phải dùng Option Explicit6. Tạo menu PopUp
Nếu chương trình của bạn có đòi hỏi phải chạy trong một độ phân giải màn hình nhất định nào đó, bạn có thể dùng cách sau đây để kiểm tra độ phân giải của màn hình có thích hợp với chương trình của mình không, rồi sau đó mới chạy.
Hàm CheckRez(rộng, cao) nhận vào 2 tham số là chiều rộng và cao của màn hình (tính bằng Pixel) trả về một giá trị kiểu Boolean (True/False). Nếu trả về True có nghĩa là độ phân giải màn hình đang sử dụng thích hợp với độ phân giải bạn cần kiểm tra.
Vd: CheckRez(800,600) = True
Do Visual Basic sử dụng đơn vị là Twip mà bạn lại sử dụng là Pixel cho nên phải có sự chuyển đổi đơn vị.
Public Function CheckRez(pixelWidth As Long, _pixelHeight As Long) As Boolean
'
Dim lngTwipsX As Long
Dim lngTwipsY As Long
'
' chuyển đổi từ pixels sang twips
lngTwipsX = pixelWidth * 15
lngTwipsY = pixelHeight * 15
'
' kiểm tra lại độ rộng và cao của màn hình
If lngTwipsX <> Screen.Width Then
CheckRez = False
Else
If lngTwipsY <> Screen.Height Then
CheckRez = False
Else
CheckRez = True
End If
End If
'
End Function
Kế đến, bạn hãy dùng câu lệnh if cùng với điều kiện kiểm tra là hàm CheckRez ở đoạn mã bắt đầu của chương trình.
If CheckRez(640, 480) = False Then
MsgBox "Incorrect screen size!"
Else
MsgBox "Screen Resolution Matches!"
End If
3. Inport một file Registry (*.reg)
1. Kiểm tra sự tồn tại của file ở bất kỳ đâu2. Kiểm tra độ phân giải màn hình3. Sự khác nhau khi load form ở chế độ MODAL & MODELESS4. Khi nào, tại sao phải dùng Option Explicit5. Tạo menu PopUp
Nếu bạn cần Import một file reg vào Registry mà không muốn làm bận tâm đến người dùng. Bạn hãy chạy Regedit với thông số /s kèm theo sau là tên file và đường dẫn file reg cần Import vào Registry. Cụ thể như sau:
Dim strFile As String
Dim lngRet
strFile = App.Path & "myreg.reg"
If Len(Dir$(strFile)) > 1 Then
lngRet = Shell("Regedit.exe /s " & strFile, vbNormalFocus)
End If
Với cách này file reg của bạn sẽ được Merge vào Registry một cách âm thầm, không ai hay biết.
Và đương nhiên bạn cũng có thể gõ trực tiếp như vậy vào hộp thoại run của Windows.
Sự khác nhau khi load form ở chế độ MODAL và MODELESS
1. Kiểm tra sự tồn tại của file ở bất kỳ đâu2. Kiểm tra độ phân giải màn hình3. Import file reg vào registry5. Khi nào, tại sao phải dùng Option Explicit6. Tạo menu PopUp
Những Form được load ở chế độ MODAL thường có yêu cầu bắt buộc và chờ người dùng nhập dữ liệu trước khi thi hành các lệnh khác trong cùng một thủ tục (Sub / Function). Form loại này thường giữ focus của chương trình cho đến khi nó được người dùng "giải tán". Khi hiển thị form ở chế độ này, các lệnh không thuộc form đang hiển thị sẽ không được thực hiện, mà phải chờ cho đến khi form này được đóng lại. Các MsgBox, InputBox chính là một dạng của Modal form. Để hiển thị form ở chế độ này bạn dùng cú pháp lệnh sau:
MyForm.SHOW vbModal
Khi load form ở chế độ MODELESS các lệnh sẽ được lần lượt thực hiện một cách bình thường từ trên xuống dưới trong một thủ tục (không cần người dùng phải quan tâm, để từ từ rồi xem cũng được). các MDI child luôn ở dạng modeless. Để hiển thị form ở chế độ modeless bạn dùng lệnh:
MyForm.SHOW
Tại sao phải dùng Option Explicit?
1. Kiểm tra sự tồn tại của file ở bất kỳ đâu2. Kiểm tra độ phân giải màn hình3. Import file reg vào registry4. Sự khác nhau khi load form ở chế độ MODAL & MODELESS5. Tạo menu PopUp
Nếu dòng Option Explicit xuất hiện trong cửa sổ code của chương trình cũng có nghĩa là Vb bắc buộc bạn phải khai báo biến một cách tường minh trước khi sử dụng chúng. Mệnh đề Option Explicit được đặt ở dòng đầu tiên trong cửa sổ Code (General Declaration). Quả thật việc bắt buộc phải khai báo biến sẽ làm cho chương trình rõ ràng, giảm thiểu tối đa các sai sót ngoài ý muốn (bugs) do khả năng tự phát sinh biến mới mà không cần khai báo của Visual Basic . Đây cũng là con dao 2 lưỡi, theo tôi tính năng này hại nhiều hơn là lợi.
Bạn có thể gõ trực tiếp mệnh đề Option Explicit hay nhờ VB tự động thêm giúp bằng cách vào Tools / Options. Check vào Require Variable Declaration trong thẻ (tab) Editor.
Option Explicit sẽ vô hiệu khả năng tự phát sinh biến của Vb. Như vậy, tất cả các biến muốn sử dụng đều phải khai báo bằng từ khóa DIM hay #800000IM, biến nào chưa được khai báo VB sẽ thông báo lỗi và bắt bạn phải khai báo mới chạy được chương trình. Kiểu dữ liệu mặc nhiên mà mỗi lần Visual Basic (Basic) tạo biến mới là Variant.
Tạo menu PopUp
(THIEN DANG)
1. Kiểm tra sự tồn tại của file ở bất kỳ đâu2. Kiểm tra độ phân giải màn hình3. Import file reg vào registry4. Sự khác nhau khi load form ở chế độ MODAL & MODELESS5. Khi nào, tại sao phải dùng Option Explicit
Trong ứng dụng ngoài loại menu kéo xuống (PullDown) còn một loại menu nữa khá linh động gọi là menu PopUp. Loại menu này bạn rất thường sử dụng trong Windows 9.x, được kích hoạt bằng phím phải chuột. Một ứng dụng Windows hoàn chỉnh chạy trong Windows 9.x không thể không có loại menu cấp tốc này.
Trong Visual Basic loại menu này thật ra cũng là một menu PullDown bình thường mà thôi. Khi nào cần hiện thành menu PopUp bạn chỉ việc gọi tên menu tương ứng (Name của Menu). Để cho thành menu PopUp thứ thiệt bạn hãy cho menu này ẩn đi (Visible = False), khi nào người dùng nhấn phím phải chuột bạn sẽ cho nó hiện ra bằng method Popupmenu
Trong chương trình ta có thể dùng hành vi (method) popupmenu để gọi một menu hiển thị, menu này phải được tạo trước (menu editor) và có ít nhất 1 mục chọn con tức là menu thứ cấp.
Cú pháp: object.PopupMenu menuname, flags, x, y
Trong đó:
object: tên form mà trình đơn sẽ xuất hiện. Nếu không ghi có nghĩa là dùng form hiện hành.
menuname: tên menu cần hiển thị.
flags: giá trị nguyên qui định vị trí xuất hiện của menupopup.
Tên Hằng | Giá Trị | ý nghĩa |
vbPopupMenuLeftAlign | 0 | Trị mặc định, cạnh trái của trình đơn sẽ ở vị trí x. |
vbPopupMenuCenterAlign | 4 | Trình đơn sẽ canh giữa so với vị trí x. |
vbPopupMenuRightAlign | 8 | Cạnh phải của trình đơn sẽ ở vị trí x. |
... | ... | ... |
x,y | Tọa độ trình đơn sẽ xuất hiện. Nếu không ghi mặc nhiên trình đơn sẽ xuất hiện ở vị trí mouse |
Sau đây là một thí dụ về PopUp menu:
Mở một form trống và tạo 1 hệ thống menu như hình sau. Trong hình menu chính là Record (Name: mnuRec) vào có một số menu con như: Insert, Append, Edit, Delete.
Để "chộp" được sự kiện nhấn Mouse bạn hãy khảo sát tình huống MouseDown của form này. Gõ vào đoạn Code sau:
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = 2 Then' Kiểm tra xem nút phải chuột có bị nhấn không
PopupMenu mnuRec, 0' Cho hiển thị menu mnuRec
End If
End Sub
Nhấn F5 chạy thử bạn sẽ được như hình bên. Nhưng chúng ta lại không muốn cái menu này luôn xuất hiện sờ sờ trên form, hãy cho nó biến mất.
Bạn chỉ cần cho cái menu "đầu đàn" mnuRec biến mất là các menu con bên trong cũng mất tích theo. Hãy mở hộp thoại Menu Editor ra, click chọn menu Record, bỏ dấu check ở CheckBox Visible, click OK. Hà hà bây giờ nó biến mất tiêu rồi.
Nhấn F5, chạy thử chương trình, nhấn nút phải chuột... Bây giờ thì thành công rồi hén. Hãy áp dụng cách này vào ứng dụng Visual Basic của bạn để tiện cho người dùng.