Các bài tập Microsoft .NET 156 Thử click new Menu Item trong ContextMenu1, chương trình sẽ hiển thị thông điệp You clicked new Menu Item!. Bây giờ click nút Clear ContextMenu rồi right click Textbox1. ContextMenu1 đã bị cleared nên sẽ không hiển thị. Duplicating Menus Một việc khác ta có thể làm trong lúc Runtime của chương trình là cloning (tạo object song sinh). Thí dụ, ta muốn dùng Edit menu của MainMenu1 làm ContextMenu (giống giống như trong VB6) cho Textbox1. Để thực hiện việc này, ta dùng method CloneMenu(). Dưới đây là code ta dùng để thay thế ContextMenu1 trong chương trình bằng Edit menu của MainMenu1. Private Sub BtnCloneMenu_Click( ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles BtnCloneMenu.Click ' Instantiate a new ContextMenu object Dim newContextMenu As New ContextMenu() ' Add a clone copy of EditMenu to this new ContextMenu's collection of MenuItems newContextMenu.MenuItems.Add(editMenuItem.CloneMenu) Các bài tập Microsoft .NET 157 ' Assign this new Context Menu to Textbox1 Textbox1.ContextMenu = newContextMenu End Sub Khởi động chương trình, click nút Clone Menu, rồi right click TextBox1, ContextMenu mới sẽ hiển thị như dưới đây: Lưu ý: Vì CloneMenu() clone hoàn toàn Object editMenuItem, kể cả các Event Handlers của các SubMenuItems nên ta không cần phải làm thêm gì cả. Muốn trở lại trạng thái cũ, tức là dùng ContextMenu1 cho Textbox1, ta chỉ cần reassign ContextMenu1 vào property ContextMenu của Textbox1 như sau: Textbox1.ContextMenu = ContextMenu1 MDI Forms Trong VB6 ta tạo một MDI (Multiple Document Interface) form bằng cách set property MDIChild của form ấy thành True. Một form như thế chỉ có thể được dùng làm child form, tức là nó cần một form MDI parent để hiển thị trong ấy. Ngoài ra, mỗi application chỉ có thể có một form Các bài tập Microsoft .NET 158 MDI parent duy nhất và chỉ trong lúc thiết kế ta mới có thể chỉ định đặc tính của một form là MDIChild. Một form không thể trở thành một MDIChild lúc Runtime. Trong VB.NET, một form có thể trở thành một MDI child lúc Runtime bằng cách set property MDIParent của form ấy để nhắm vào một form MDI parent. Do đó, một form có thể vừa là MDIchild form, vừa là form bình thường tùy theo hoàn cảnh. Thật ra, ngược với VB6, ta không thể set property MDIParent lúc thiết kế, mà phải làm lúc Runtime. Giống như VB6, trong VB.NET ta có thể hiển thị nhiều forms MDIChild trong một form MDI parent, khi parent form di chuyển thì mang theo các forms con. Khi hiển thị nhiều child forms, ta có thể dùng property ActiveForm để biết child form nào hiện thời là Active. Ta thử khởi động một Windows Application mới. Đổi tên Form1 thành ParentForm và chỉ định nó làm MDI parent bằng cách set property IsMDIContainer của nó thành True. Kế đó thêm một form và đổi tên nó thành ChildForm. Dưới đây là code để thêm hai child forms vào ParentForm và hiển thị chúng: ' Declare child forms of type ChildForm Private WithEvents FirstChild As ChildForm Private WithEvents SecondChild As ChildForm Private Sub ParentForm_Load( ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles MyBase.Load ' Instantiate an Object of type Childform FirstChild = New ChildForm() ' Make this form the MDI Parent of FirstChild FirstChild.MdiParent = Me FirstChild.Text = "First Child Form" ' Set Title ' Show FirstChild FirstChild.Show() Các bài tập Microsoft .NET 159 ' Instantiate the second Object of type Childform SecondChild = New ChildForm() ' Make this form the MDI Parent of SecondChild SecondChild.MdiParent = Me SecondChild.Text = "Second Child Form" ' Set Title ' Show SecondChild SecondChild.Show() End Sub Để cung cấp một Menu hiển thị danh sách các forms MDIchild của ParentForm, ta thêm control MainMenu vào ParentForm. Kế đó, tạo một MenuItem tên Windows và set property MDIList của nó thành True. Property này sẽ khiến danh sách các forms child tự động hiển thị làm những menu items nằm phía dưới Menu Windows. Danh sách này tự động cập nhật khi một child form trở thành Active, được thêm vào, hay bị lấy ra. Parent MDI form có một method tên là LayoutMDI để tự động sắp đặt vị trí các forms child theo kiểu Cascade hay Tile layout. Thêm một MenuItem tên Tile Vertical và nhét mấy hàng code dưới đây vào form để xử lý Event click của nó: Private Sub tileVerticalMenuItem_Click( ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles tileVerticalMenuItem.Click Me.LayoutMdi(System.Windows.Forms.MdiLayout.TileVertical) End Sub Khởi động chương trình, by default hai forms childs được layout kiểu Cascade. Trong Menu Windows có hiển thị title của hai forms child và cho biết Second Child Form là Active form. Các bài tập Microsoft .NET 160 Nếu bạn click Tile vertical, hai forms child sẽ được layout kiểu Tile như dưới đây: . Các bài tập Microsoft .NET 156 Thử click new Menu Item trong ContextMenu1, chương trình sẽ hiển thị thông. ContextMenu's collection of MenuItems newContextMenu.MenuItems.Add(editMenuItem.CloneMenu) Các bài tập Microsoft .NET 157 ' Assign this new Context Menu to Textbox1 Textbox1.ContextMenu. một form MDI parent để hiển thị trong ấy. Ngoài ra, mỗi application chỉ có thể có một form Các bài tập Microsoft .NET 158 MDI parent duy nhất và chỉ trong lúc thiết kế ta mới có thể chỉ định đặc tính