Ch
ng M i - Dùng Menu
ươ
ườ
t c các commands c a m t program đ ộ ủ ơ ấ ả c s p x p th t ế ừ theo t ng ượ ắ ứ ự ạ ể ng g p: menu và pop-up (hi n lên) ạ ặ drop-down (th xu ng) ả ố ng trình. Thông th menu. Ta phía trên chóp ươ ệ ng nó n m ằ ở ườ ộ ề ế ả ọ ằ ẽ ả ữ ứ ề ằ ẳ ộ ố ớ ọ ẽ ấ ả ộ Menu trong Windows là n i t lo i đ giúp ta dùng d dàng. ễ Có hai lo i menu ta th ườ dùng drop-down menu làm Menu chánh cho ch màn nh. N m d c theo chi u ngang là Menu Bar, n u ta click lên m t command trong Menu Bar thì program s th xu ng m t menu v i nh ng MenuItems n m d c theo chi u th ng đ ng. N u ta ế click lên MenuItem nào có d u hình tam giác nh bên ph i thì program s popup m t Menu nh ư ỏ Format | Make Same Size): trong hình d i đây (khi ta click ướ
Main Menu
ể ạ ặ ữ ướ ế ộ ề ộ ả ộ ệ ớ ủ ủ ể ộ ớ ủ Ta dùng Menu Editor đ t o ho c s a m t Menu cho program. Menu thu c v m t Form. Do đó, ế tr c h t ta select m t Form đ làm vi c v i Designer c a nó (ch không ph i code c a Form). K đó ta dùng Menu Command Tools | Menu Editor hay click lên icon c a Menu Editor trên Toolbar đ ể làm cho Menu Editor hi n ra. ệ
ằ ầ ơ ẽ ể ủ ị ộ ệ ầ ệ ể ạ ư ợ ố ủ Đ u tiên có m t v t màu xanh n m trong khung tr ng c a Menu Editor, n i s hi n th Caption c a ắ ữ &File vào Textbox Caption, nó cũng hi n raệ Menu Command đ u tiên c a Form. Khi ta đánh ch ủ trên v t xanh nói trên. K đó, b n có th đánh tên c a Menu Command vào Textbox Name. Dù ta ủ cho Menu Command m t tên nh ng ta ít khi dùng nó, tr tr ừ ườ ra/bi n m t). Bình th ề ấ ế ộ ng ta dùng tên c a MenuItems nhi u h n. ườ ng h p mu n nó visible/invisible (hi n ệ ơ ủ ế
i đây ta còn ph i edit thêm vào các MenuItems Open, Save, ể ư ộ ướ ả Đ có m t Menu nh trong hình d Close và Exit.
ướ ủ ụ ề ằ c. Khi ta click d u tên ch qua ph i thì MenuItem ta đang Edit s ấ ả ỉ t c các MenuItems c a Menu Command File đ u n m th t qua bên ph i ả i đây cho th y t Hình d ấ ấ ả ẽ phía tr v i b n d u ch m (....) ướ ở ấ ớ ố có thêm b n d u ch m, t c là th t m t b c trong Menu (Nested). ụ ứ ố ấ ấ ộ ậ ấ
ấ ấ nh v y, khi ta click d u tên ch qua trái thì MenuItem ta đang Edit s m t b n d u ẽ ấ ố ỉ T ch m, t c là tr i m t b c trong Menu. ng t ự ư ậ ứ ươ ấ ộ ậ ồ
ố ế ể ử ụ ấ & tr ướ ạ ạ c character b n N u mu n cho User dùng Alt key đ x d ng Menu, b n đánh thêm d u mu n trong menu Caption. Thí d ụ Alt-F s th xu ng Menu c a Menu Command File. ẽ ả ủ ố ố
&Open tên mnuOpen, thì khi b n Click lên Caption nó trên Form trong ạ ặ ế ế ị ạ ỏ ủ Sub mnuOpen_Click(), gi ng nh Sub ư ố N u b n đ t cho MenuItem ế t k , VB6 IDE s hi n th cái v c a lúc thi ẽ ể cmdButton_Click() c a m t CommandButton: ộ ủ
Private Sub mnuOpen_Click() MsgBox "You clicked mnuOpen" End Sub
ụ ể ể ơ ộ i ta th c, nh ng ng ư ượ ườ ộ ả "You clicked ng dùng ườ t m t menuItem Event v i m t CommandButton Event. Do đó, ta có ạ ể ễ ể ặ ệ ớ ộ Trong thí d trên ta đánh thêm m t Statement đ hi n th m t message đ n gi n ị ộ mnuOpen". B n có th đ t cho m t MenuItem tên gì cũng đ prefix mnu đ d phân bi ộ nh ng tên mnuFile, mnuOpen, mnuSave, mnuClose, mnuExit. ữ
ạ ể ạ Cái g ch ngang gi a MenuItems Close và Exit đ Menu Separator b ng cách cho Caption nó b ng . ữ ằ ằ c g i là ộ ượ ọ Menu Separator. B n có th nhét m t d u tr ( - ) ừ ấ
ủ ể ể ộ Shortcut trong Menu Editor. ừ ọ ộ Ngoài Alt key ta còn có th cho User dùng Shortcut c a menuItem. Đ cho MenuItem m t Shortcut, b n ch n cho nó m t Shortcut t ạ Trong hình d i đây ta ch n ComboBox ọ Ctrl+O cho mnuOpen. ướ
c Enabled và Visible. Lúc thi ượ ở t k b n có th cho MenuItem giá tr kh i ế ế ạ ể ị ằ ư ể ạ ạ ổ By default, menuItem đ đ u c a Enabled và Visible b ng cách dùng Checkboxes Enabled và Visible. ầ ủ Trong khi ch y program (at runtime), b n cũng có th thay đ i các values Enabled và Visible nh sau:
mnuSave.Enabled = False mnuOpen.Visible = False
Khi m t MenuItem có Enabled=False thì nó b m và user không dùng đ c. ị ờ ộ ượ
ấ ạ ể ể ố ỉ ượ Delete đ h y b MenuItem đã đ ố c selected lên và xu ng c selected, ể ủ ỏ ạ c selected và Next đ ch n MenuItem ượ ượ ể ọ B n dùng các d u mũi tên ch lên và xu ng đ di chuy n MenuItem đã đ trong danh sách các MenuItems. B n dùng button Insert đ nhét m t MenuItem m i ngay trên MenuItem đã đ ngay d ộ i MenuItem đã đ ớ c selected. ể ướ ượ
Pop-up Menu
ố ớ ệ ớ ệ ấ ộ ườ ụ ằ ộ
ng Menu Bar Command y có th visible ườ ấ ộ Đ i v i User, đang khi làm vi c v i m t Object trong Windows ti n nh t là ta có th làm hi n th ị ể ể ng đó là Context Menu (Menu áp d ng cho đúng tình hu ng) b ng m t Mouse click. Thông th ố Right Click và cái Context Menu còn đ Pop-up Menu. Chính cái Pop-Up menu th t ra là c g i là ậ ượ ọ Drop-down menu c a m t Menu Bar Command. Bình th ể ủ hay invisible (tàn hình).
i đây, khi User Right click trên Form, mnuEdit s hi n lên. N u bình th ẽ ệ ướ ế ườ ạ ng b n Trong hình d không mu n cho User dùng nó trong Main Menu thì b n cho nó invisible: ạ ố
c vi t trong Event Mousedown c a m t Object mà tình c ệ ượ ế ờ ở ủ ộ Code làm cho Popup menu hi n lên đ đây là c a chính cái Form: ủ
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) ' Popup the Edit Menu if User clicked the Right Button of the Mouse If Button = vbRightButton Then PopupMenu mnuEdit End If End Sub
ả ườ ể ạ ể ệ ộ ề ể ử ạ ữ ủ ầ Ngay c khi b n mu n cho mnuEdit bình th ng là invisible, b n cũng nên đ cho nó visible trong ố lúc đ u đ ti n b code vào dùng đ x lý Click Events c a nh ng MenuItems thu c v mnuEdit ỏ nh mnuCopy, mnuCut và mnuPaste. ư
Ch a menu Settings trong Registry ứ
Gi i đây: ả ỉ t program b n cho User m t Option WordWrap nh d ộ ư ướ ạ
i khi User kh i đ ng program thì Option ạ ể ầ ớ ớ ọ ở ộ B n mu n Program nh Option mà User đã ch n, đ l n t ố nguyên giá tr nh cũ. WordWrap còn gi ị ư ữ
ệ t c a Windows Operating System dùng đ ch a nh ng d ki n liên h ứ ặ ư ộ Key trong Registry. Registry là m tộ ệ ể ứ ữ ệ ệ ủ ữ
c s p đ t theo t ng lo i theo đ ng c p. B n có th Edit tr c ti p tr s các Keys ự ế ị ố ừ ể ặ ạ ẳ ấ ạ Registry Editor. Cách ti n nh t là ch a value c a Option WordWrap nh m t ủ ấ lo i c s d li u đ c bi ạ ơ ở ữ ệ đ n Users, Hardware, Configurations, ActiveX Components ..v.v. dùng trong computer. Trong ế Registry, data đ ượ ắ trong Registry b ng cách dùng ằ
ừ ệ ầ ắ ị ạ i, c. Trong program n y ta cũng nhân ti n b t program nh luôn v trí c a Form khi program ng ng l đ l n t i khi User kh i đ ng program thì program s có v trí lúc đ u gi ng y nh tr ể ầ ớ ư ướ ủ ầ ở ộ ớ ẽ ố ị
ể ứ Checked value c a mnuWordWrap và ủ Sub Form_QueryUnload vì nó s đ c executed tr Left, Top c a Form. ủ c khi Form Unload. Ta s dùng ẽ Code y ta s đ trong ấ Sub SaveSetting đ ch a ẽ ể ẽ ượ ướ
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) SaveSettings End Sub
Private Sub SaveSettings() ' Save Location of the form
SaveSetting App.Title, "Location", "Left", Me.Left SaveSetting App.Title, "Location", "Top", Me.Top ' Save the setting of WordWrap in menu SaveSetting App.Title, "Settings", "WordWrap", mnuWordWrap.Checked End Sub
ng nó là tên c a VB Project, nh ng b n có th s a nó ự ề ủ ườ ể ữ ủ ư ạ App.Title là T a đ c a program. Thông th trong Project Property Dialog (Tab Make) :
ứ ứ ọ Key) vào Registry b n có th s p đ t cho nó n m trong ể ắ ặ ằ ộ đây ta đ t ra hai Sections tên Location đ ch a Top,Left c a Form và tên ặ ủ ạ ể ứ Khi ch a value c a m t th gì (ta g i là ủ Section nào tùy ý. Ở Settings đ ch a Key mnuWordWrap.Checked. ể ứ
ố ị ủ ỉ ầ ứ Registry nh d i đây: Mu n cho program có các giá tr c a Keys ch a trong Registry khi nó kh i đ ng ta ch c n dùng Function GetSetting trong Sub Form_Load đ đ c vào t ể ọ ở ộ ư ướ ừ
Private Sub Form_Load() ' Initialise Location of the form by reading the Settings from the Registry Me.Left = Val(GetSetting(App.Title, "Location", "Left", "0")) Me.Top = Val(GetSetting(App.Title, "Location", "Top", "0")) ' Initialise setting of WordWrap in the menu mnuWordWrap.Checked = ( GetSetting(App.Title, "Settings", "WordWrap", "False") = "True" ) End Sub
"0" (string "0" đ c converted b i Val ra 0) là default ầ ượ ư ở Lúc đ u khi ch a có gì trong Registry thì value cho Left và Top, còn "False" là default value c a mnuWordWrap.Checked. ủ
ố ứ ủ ớ Recent Files đ hi n th t ủ ị ừ ộ ế ớ Ngoài ra ta cũng mu n program nh tên c a ba Files User dùng g n đây nh t. T c là trong Drop- ầ ấ m t đ n ba tên Files, down c a Menu Command File s có MenuItem ẽ ể ể ư c h t, ta c n t o ra 3 SubmenuItem có cùng tên mnuRFile nh ng cái m i nh t n m trên h t. Tr ầ ạ ướ ế ế ấ ằ ể ể Index). Ta s dùng Captions c a chúng đ hi n mang Index b ng 0,1 và 2 (b n đánh vào Textbox ạ ằ ủ ẽ
Recent Files s b làm m đi (t c là ị ư ả ẽ ị ứ ờ th tên các Files. Lúc ch a có Filename nào c thì MenuItem mnuRecentFiles.Enabled = False ).
ư ộ ủ |. Thí d : "LattestFileName.txt ụ ấ ứ ẽ ấ ộ Ta s ch a tên các Files nh m t String trong Section Settings c a Registry. Ta phân cách tên các |OldFileName.txt|OldestFilename.txt" Files b ng delimiter character M i l n User Open m t File ta s thêm tên File y vào trong Registry và b t c lúc nào ch gi ỉ ữ ạ l i tên c a 3 Files m i dùng nh t. ẽ ứ ằ ỗ ầ ủ ấ ớ
D i đây là code dùng đ thêm tên File m i dùng nh t vào Registry: ướ ể ấ ớ
Private Sub mnuOpen_Click() ' Initialise Folder in Common Dialog CommonDialog1.InitDir = App.Path ' Launch the dialog CommonDialog1.ShowOpen ' Save the Filename in the Registry, using Object myRecentFiles myRecentFiles.AddFile CommonDialog1.FileName End Sub
Code dùng trong Sub Form_Load đ đ c tên RecentFiles và hi n th trong Menu: ể ọ ể ị
' Set myRecentFiles = New clsRecentFiles ' Pass the form handle to it ' This effectively loads the most recently used FileNames to menu myRecentFiles.Init Me
t lo vi c ch a tên Files vào Registry và hi n th clsRecentFiles đ đ c bi ẽ ể ặ ứ ệ ệ ể ị ộ Ta s dùng m t Class tên ộ tên các Files y trong Menu. Bên trong clsRecentFiles ta cũng dùng clsString, là m t Class giúp ta ấ ng t khúc String trong Registry ra tên c a các Files d a vào ch các delimiter character |. ủ ự ắ ỗ
' Author: Le Duc Hong http://www.vovisoft.com ' Class Name: clsRecentFiles ' This Class saves the most Recent FileNames used in the Registry in form of ' a String delimited by |. ' Up to MaxFiles Filenames maybe stored. ' You need to pass the Form that contains the menu to it. ' The assumption is that you have created an array of MenuItems named mnuRFile ' to display the FileNames ' Const MaxFiles = 3 ' Maximum number of FileNames to remember Private myForm As Form Private RecentFiles As clsString Public Sub Init(TForm As frmMenu) Set myForm = TForm Set RecentFiles = New clsString ' Read the Most Recent Filename String from the Registry RecentFiles.Text = GetSetting(App.Title, "Settings", "RecentFiles", "") ' Assign the Delimiter character and tokennise the String (i.e. split it) into FileNames RecentFiles.Delimiter = "|" UpdateMenu End Sub
Public Sub AddFile(FileName As String) ' Add the latest FileName to the list and update the Registry ' Prefix the FileName to the existing MostRecentFileName String RecentFiles.Text = FileName & "|" & RecentFiles.Text ' Discard the oldest FileNames if the total number is greater than MaxFiles If RecentFiles.TokenCount > MaxFiles Then Dim TStr As String Dim i As Integer ' Reconstitute the String that contains only the most recent MaxFiles FileNames For i = 1 To MaxFiles
TStr = TStr & RecentFiles.TokenAt(i) & "|" Next ' Remove the last delimiter character on the right RecentFiles.Text = Left(TStr, Len(TStr) - 1) End If ' Update the String in the Registry SaveSetting App.Title, "Settings", "RecentFiles", RecentFiles.Text UpdateMenu End Sub Private Sub UpdateMenu() ' Display the most recent Filenames in the menu Dim i As Integer ' If there is no FileNames to display then disable the MenuItem entry If RecentFiles.TokenCount = 0 Then myForm.mnuRecentFiles.Enabled = False Exit Sub Else ' Otherwise enable the MenuItem entry myForm.mnuRecentFiles.Enabled = True End If ' Assign FileName to Caption of mnuRFile array and make the MenuItem elements visible For i = 1 To RecentFiles.TokenCount myForm.mnuRFile(i - 1).Caption = RecentFiles.TokenAt(i) ' Assign to Caption myForm.mnuRFile(i - 1).Visible = True ' Make the MenuItem visible If i = MaxFiles Then Exit For ' This line maybe unnecessary Next ' Make the rest of the MenuItem array mnuRFile invisible if there are less than MaxFiles If RecentFiles.TokenCount < MaxFiles Then For i = RecentFiles.TokenCount To MaxFiles - 1 myForm.mnuRFile(i).Visible = False Next End If End Sub
B n có th ch y Line Command RegEdit sau khi click Start | Run ể ạ ạ
Location và Settings c a Folder ế ủ ứ ủ đ xem chi ti t c a các Keys mà program đã ch a trong Sections ể HKEY_CURRENT_USER\Software\VB and VBA Program Settings\Menu