• Khi một mục trên thanh menu được chọn thì mục đó sẽ được đánh dấu " " Bài 2: Xây dựng chương trình như bài 1 nhưng có thêm menu "Màu chữ" cho phép người dùng đặt màu chữ cho nội dung
Trang 1Ch−¬ng iiI
SỬ DỤNG HỘP THOẠI CHUẨN & MENU
MỤC TIÊU: SAU KHI HOÀN THÀNH CÁC BÀI TẬP, NGƯỜI HỌC CÓ THỂ
Xây dựng được các hệ thống menu một cấp nhiều cấp, menu Popup
Xây dựng được các hệ thống thanh công cụ - Toolbar
Sử dụng thành thạo các thuộc tính và phương thức của điều khiển Dialog Phân biệt được giữa ứng dụng đa cửa sổ và đơn cửa sổ
Viết được một ứng dụng soạn thảo văn bản đơn giản với đa cửa sổ
A - ĐỀ BÀI TẬP
Bài 1: Xây dựng chương trình soạn thảo văn bản sử dụng điều khiển RichText
Hình 3.1 – giao diện chương trình
Yêu cầu:
• Chương trình hỗ trợ các phím tắt (Ctrl-O để mở, Ctrl-S để lưu v.v…)
• Có thể định dạng chữ Đậm, nghiêng, gạch chân bằng cách nhấn tổ hợp phím
tắt tương ứng là Ctrl-B, Ctrl-I, Ctrl-U
• Vùng soạn thảo (Textbox) có thể thay đổi kích thước khi Form thay đổi
• Khi một mục trên thanh menu được chọn thì mục đó sẽ được đánh dấu " "
Bài 2: Xây dựng chương trình như bài 1 nhưng có thêm menu "Màu chữ" cho
phép người dùng đặt màu chữ cho nội dung văn bản
Hình 3.2 – Giao diện chương trình (Có thêm mục chọn "Màu chữ")
Trang 2Bài 3: Xây dựng chương trình như bài 2, nhưng thêm khả năng hiển thị menu ngữ cảnh như sau: Khi người dùng chọn một đoạn văn bản và click chuột phải trong
Richtextbox thì hiển thị (Popup) menu "Định dạng" còn khi người dùng không chọn đoạn văn bản nào nhưng click chuột phải thì hiển thị Menu "File" Tuy nhiên, việc
định dạng font chữ ở đây là định dạng riêng cho phần được bôi đen
Hình 3.3 - Hiển thị menu cảm ngữ cảnh Bài 4: Xây dựng chương trình như bài 3 nhưng sử dụng cơ chế đa cửa sổ
(Multi documents) Tức là chương trình cho phép soạn thảo nhiều tệp tin trong nhiều cửa sổ khác nhau
Hình 3.4 - Hệ thống đa cửa sổ (MultiDocuments) Bài 5: Xây dựng chương trình như bài 4, nhưng thêm một số mục trên thanh
Menu của FormMDI bằng các nút lệnh trên thanh công cụ (ToolBar)
Hình 3.5 - Hệ thống soạn thảo đa cửa sổ với thanh công cụ
Trang 3Bài 6 : Như bài 5 nhưng chương trình có thêm thanh trạng thái (status bar) trong
form chính (Xem hình 6) Trong thanh trạng thái có 3 ô, ô thứ nhất cho biết tổng số
ký tự trong Richtextbox, ô thứ hai hiển thị thời gian, ô thứ 3 hiển thị ngày trong máy tính
Hình 3.6 - Bổ sung thêm thanh trạng thái
Trang 4B HƯỚNG DẪN - GIẢI MẪU
Bài 1
a Thiết kế giao diện
Hình 3.10 – Giao diện chương trình
Hình 3.11 - Đặt tên cho mục Menu
Ngoài ra, trong lúc thiết kế đặt thuộc tính Scrollbar của Richtextbox là 3- Both
b Hướng dẫn:
• Kết hợp sử dụng điều khiển Common Dialog để mở, lưu File
• Sử dụng phương thức LoadFile, SaveFile để nạp, lưu file đang soạn thảo
c Chương trình mẫu
Option Explicit
'/// Xử lý khi người dùng click vào mục ""Đặt Font chữ" trên menu
Private Sub mnuFont_Click()
dlgMain.Flags = cdlCFBoth Or cdlCFEffects '/// Phải có trước khi ShowFont
'/// Đặt font chữ của Richtext theo như thông tin người dùng đã chọn
rtfNoiDung.Font.Name = dlgMain.FontName
Trang 5rtfNoiDung.Font.Bold = dlgMain.FontBold
rtfNoiDung.Font.Italic = dlgMain.FontItalic
rtfNoiDung.Font.Underline = dlgMain.FontUnderline
rtfNoiDung.Font.Size = dlgMain.FontSize
End Sub
'/// Đảo lại trạng thái trước đó: Nghiêng Không nghiêng, Chọn Không chọn
Private Sub mnuItalic_Click()
mnuItalic.Checked = Not mnuItalic.Checked '/// Hiện / ẩn dấu tích ( )
rtfNoiDung.Font.Italic = Not rtfNoiDung.Font.Italic '///Nghiêng Không nghiêng
End Sub
'/// Xử lý cập nhật lại định dạng và trạng thái chọn khi người dùng chọn "Chữ nghiêng"
Private Sub mnuUnderline_Click()
mnuUnderline.Checked = Not mnuUnderline.Checked
rtfNoiDung.Font.Underline = Not rtfNoiDung.Font.Underline
End Sub
'/// Xử lý cập nhật lại định dạng và trạng thái chọn khi người dùng chọn "Chữ đậm"
Private Sub mnuBold_Click()
mnuBold.Checked = Not mnuBold.Checked
rtfNoiDung.Font.Bold = Not rtfNoiDung.Font.Bold
End Sub
'/// Tạo mới tài liệu khi người dùng chọn mục "New Ctrl-N"
Private Sub mnuNew_Click()
rtfNoiDung.TextRTF = ""
End Sub
'/// Xử lý mở file sử dụng điều khiển Dialog
Private Sub mnuOpen_Click()
dlgMain.Filter = "Các file RTF |*.rtf|Các file TXT|*.txt|Tất cả các file (*.*)|*.*|" dlgMain.DialogTitle = "Më file"
dlgMain.ShowOpen
rtfNoiDung.LoadFile dlgMain.FileName
End Sub
'/// Lưu nội dung đang soạn ra đĩa, sử dụng phương thức SaveFile của Richtext
Private Sub mnuSave_Click()
dlgMain.Filter = "Các file RTF |*.rtf|Các file TXT|*.txt|Tất cả các file (*.*)|*.*|" dlgMain.DialogTitle = "Lưu văn bản ra file"
dlgMain.ShowSave
rtfNoiDung.SaveFile dlgMain.FileName, rtfRTF
End Sub
'/// Thay đổi kích thước của Richtext để nó luôn bằng Form mỗi khi kéo giãn Form
Private Sub Form_Resize()
rtfNoiDung.Top = 0
rtfNoiDung.Left = 0
rtfNoiDung.Height = Me.ScaleHeight
rtfNoiDung.Width = Me.ScaleWidth
End Sub
d Chú ý:
• Có thể gán tổ hợp phím tắt cho các mục menu trong khi soạn Menu
Trang 6• Hộp thoại Common Dialog không tự lưu file hay mở file mà nó chỉ cung cấp một hộp thoại để người dùng chọn hay gõ tên file mà thôi
• Có thể thay đổi phần mở rộng mặc định khi hộp Dialog mở ra
• Khi hộp thoại Dialog mở ra, rất có thể người dùng sẽ nhấn Cancel Khi đó, tên file nhận được sẽ là tên được mở trước đó Như vậy, thực tế cần phải biết được người dùng đã nhấn "Open" hay nút "Cancel" để có xử lý phù hợp
• Font chữ trong menu thường là font hệ thống do vậy, nhìn chung là sẽ không hiển thị đúng trên các máy tính khác nhau khi chúng ta sử dụng Tiếng việt
• Khi lưu tệp văn bản bằng phương thức SaveFile, có một tham số cho biết là lưu dưới dạng tệp văn bản (Text) hay tệp Richtext Giá trị của tham số này tương ứng là rtfText và rtfRTF
Bài 2
a Giao diện như bài 1 nhưng có thêm mục "Màu chữ" với tên là mnuForeColor
b Hướng dẫn: Sử dụng phương thức ShowColor của điều khiển Dialog
c Chương trình mẫu: (Chèn thêm đoạn lệnh xử lý sự kiện mnuForeColor_Click vào
phần Code của bài 1)
'///…………chèn phần chương trình nguồn của bài 1 vào đây ………
Private Sub mnuForeColor_Click()
dlgMain.ShowColor
rtfNoiDung.SelStart = 0
rtfNoiDung.SelLength = Len(rtfNoiDung.Text)
rtfNoiDung.SelColor = dlgMain.Color
rtfNoiDung.SelLength = 0
End Sub
d Ghi chú
• Điều khiển Richtext không có phương thức cho phép ta đặt màu chữ của toàn
bộ nội dung mà chỉ cho phép đặt màu chữ của phần văn bản được bôi đen thông qua thuộc tính SelColor (Selected Color)
• Có thể chọn (bôi đen) một đoạn văn bản bằng cách thiết lập các thuộc tính SelStart (Selected Start - vị trí bắt đầu bôi đen) và SelLength (Selected Length – Bôi đen bao nhiêu ký tự) Điều này có thể áp dụng cho cả Textbox
Bài 3
a Thiết kế giao diện (Như bài tập số 2)
Hiển thị menu "File" khi chưa bôi đen Hiển thị menu "Định dạng" khi bôi đen
Hình 3.12 - Kết quả khi chạy chương trình
Trang 7b Hướng dẫn
• Sử dụng phương thức PopupMenu để hiển thị menu tại vị trí con chuột
• Đặt thuộc tính chữ đậm, nghiêng, màu … cho các thuộc tính SelBold, SelItalic, SelColor… tương ứng của điều khiển RichtextBox
• Muốn biết người dùng có bôi đen đoạn văn bản nào đó hay không thì chỉ việc kiểm tra dữ liệu trong thuộc tính SelText (nếu có thì độ dài của sẽ lớn hơn 0)
c Chương trình mẫu (Chương trình nguồn giống như bài tập số 2 nhưng sửa đổi các
thủ tục sự kiện có tên sau đây )
Private Sub mnuItalic_Click()
mnuItalic.Checked = Not mnuItalic.Checked
rtfNoiDung.SelItalic = Not rtfNoiDung.SelItalic
End Sub
' -Private Sub mnuUnderline_Click()
mnuUnderline.Checked = Not mnuUnderline.Checked
rtfNoiDung.SelUnderline = Not rtfNoiDung.SelUnderline
End Sub
' -Private Sub mnuBold_Click()
mnuBold.Checked = Not mnuBold.Checked
rtfNoiDung.SelBold = Not rtfNoiDung.SelBold
End Sub
' -Private Sub mnuForeColor_Click()
dlgMain.ShowColor
rtfNoiDung.SelColor = dlgMain.Color
End Sub
' -Sub rtfNoiDung_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single)
If Button = 2 Then '/// Nếu click chuột phải (nút chuột trái là 1)
If Len(rtfNoiDung.SelText) = 0 Then Me.PopupMenu mnuFile
If Len(rtfNoiDung.SelText) > 0 Then Me.PopupMenu mnuFormat
End If
End Sub
d Ghi chú: Khi làm việc với điều khiển Richtext, nếu các thuộc tính của điều khiển
này có tiền tố là "Sel", ví dụ SelText, SelColor, SelBold… thì ta hiểu là đang làm việc
với phần được bôi đen (hay chỉ phần được bôi đen bị tác động)
Bài 4
a Thiết kế giao diện
• Với loại ứng dụng đa cửa sổ này thì trước tiên ta cần phải tạo ra một form dạng "MDI Form" Để tạo menu dạng này, hãy vào menu Project và chọn mục:
Sau đó, các form về sau khi thêm thì cần đặt thuộc
MDI ban đầu
• Trong bài tập này, tạo 2 form, một form loại MDI với tên là frmMain và một form thường có tên là frmDocument Trong frmDocument, thêm một Richtext với tên là rtfNoiDung Trong frmMain, tạo hệ thống menu như sau:
Trang 8Hình 3.13 – Giao diện của Form MDI
Hình 3.14– Giao diện của frmDocument (cần đặt thuộc tính MDIChild = True)
b Hướng dẫn
• Sử dụng từ khoá New để tạo một thể hiện form mới
• Sử dụng hàm ActiveForm để trỏ tới form đang được kích hoạt
c Chương trình mẫu (Viết cho form: frmDocument và MDI: frmMain)
frmDocument.frm
Option Explicit
'/// Khi người dùng kéo giãn Form thì đặt lại kích thước của Richtext bằng với Form
Private Sub Form_Resize()
rtfNoiDung.Top = 0
rtfNoiDung.Left = 0
rtfNoiDung.Height = Me.ScaleHeight
rtfNoiDung.Width = Me.ScaleWidth
End Sub
frmMain.frm
Option Explicit
Dim SoTT As Integer '/// Biến dùng để lưu số lượng Form tạo ra
'/// Người dùng click chọn menu : "Tài liệu mới"
Private Sub mnuNew_Click()
Dim F As New frmDocument '///Tạo một thể hiện mới của frmDocument
SoTT = SoTT + 1
F.Caption = "Tài liệu thứ " & SoTT '/// Đặt tiêu đề cho cửa sổ (form) mới
End Sub
Trang 9'/// Người dùng click chọn mục "mở tài liệu"
Private Sub mnuOpen_Click()
Dim TenFile As String
dlgMain.Filter = "Tất cả các file văn bản |*.rtf;*.txt|Tất cả các file|*.*|"
dlgMain.ShowOpen
TenFile = dlgMain.FileName
Dim FormMoi As New frmDocument '///Tạo 1 thể hiện mới của frmDocument
FormMoi.Caption = TenFile '/// Đặt caption là tên của file vừa mở
FormMoi.rtfNoiDung.LoadFile TenFile '/// Nạp file đó vào điều khiển Richtext
End Sub
' -'/// Lưu nội dung trong Richtext của của form đang kích hoạt ra file
Private Sub mnuSave_Click()
Dim TenFile As String
Dim FormDangSoanThao As frmDocument '/// Khai báo biến Form
dlgMain.Filter = "Tất cả các file văn bản|*.txt|File RTF|*.rtf|Tất cả các file|*.*|" dlgMain.ShowSave
TenFile = dlgMain.FileName
Set FormDangSoanThao=ActiveForm '///Gán biến file cho form đang kích hoạt
FormDangSoanThao.rtfNoiDung.SaveFile TenFile, rtfRTF '/// Lưu ra file
FormDangSoanThao.Caption = TenFile '/// Cập nhật lại tiêu đề của form
End Sub
d Ghi chú
• Trong khi chương trình đang chạy, nếu muốn tạo ra một form mới có đầy đủ tính chất như một form đã có thì sử dụng từ khoá :
Dim <Biến> As New <Tên form đang tồn tại>, như ví dụ ở trên Ngoài ra còn
có một cách khác, ví dụ:
Dim F As frmDocument
Set F = New frmDocument
• Trong trường hợp một ứng dụng có nhiều form cùng tồn tại thì ActiveForm sẽ trả về (trỏ tới) form đang được kích hoạt
• Có thể thay đổi màu nền của form MDI bằng cách đặt lại thuộc tính
BackColor, hay cũng có thể đặt vào đó một file ảnh qua thuộc tính picture
• Muốn một form ở dạng MDIChild thì đặt thuộc tính MDIChild = True
• Nếu form con có hệ thống menu thì menu của form MDI sẽ bị ẩn đi
• Nếu các form đã được đóng hết và người dùng click chọn mục "Lưu file ra đĩa" thì sẽ có lỗi xuất hiện Ở đây có 2 giải pháp : thứ nhất là "Disable" mục này thứ hai là cần kiểm tra giá trị trả về từ hàm ActiveForm Nếu giá trị này là
Nothing thì thoát ngay, cụ thể là: If ActiveForm Is Nothing Then Exit Sub
Bài 5
a Thiết kế giao diện
Hệ thống giao diện giống như bài tập 4, nhưng thêm thanh công cụ (Toolbar) và đối tượng chứa ảnh ImageList (Tên của các điều khiển được in đậm bên cạnh)
Trang 10Hình 3.15 – Giao diện form MDI và đặt tên cho các điều khiển
Lưu ý: Thanh công cụ nằm trong thư viện: Microsoft Window Common Control 6.0
Tiếp theo, cần đặt thuộc tính cho 2 điều khiển ImageList và Toolbar như sau:
b1 Mở trang Property (click chuột phải và chọn Properties) của điều khiển ImageList
như trong hình 16
Hình 3.16 - Chọn kích thước Icon là 16x16 cho ImageList
Hình 3.17 – Chèn và đặt tên cho các biểu tượng của ImageList
- Các biểu tượng ở đây chỉ mang ý nghĩa minh hoạ cho sinh động, thực tế bạn có thể chọn các biểu tượng khác theo sở thích
- Các biểu tượng nên được đặt tên, như trong bài tập này, 3 biểu tượng ở trên có các tên (Key) lần lượt là icoBold, icoItalic, icoUnderline Khi đặt tên thì về sau ta có
thuộc tính Key chính là tên
Trang 11thể tham chiếu tới nó thông qua tên này Cũng xin nói thêm ở đây là việc đặt tên bằng chữ thường và chữ HOA là quan trọng
B2 Thêm các nút vào Toolbar và thiết lập các thông số
Hình 3.19 - Gắn kết Toolbar với điều khiển ImageList
Hình 3.20 – Thêm các nút vào Toolbar và đặt thuộc tính cho mỗi nút
b Hướng dẫn: Phần viết lệnh trong bài tập này tương tự như bài tập trước, tuy nhiên
còn phải chèn thêm vào các sự kiện Click chọn trên thanh công cụ Khi người dùng click một nút trên thanh công cụ thì sự kiện ButtonClick sẽ xuất hiện
c Chương trình mẫu
frmDocument.frm
'/// Khi người dùng kéo giãn Form thì đặt lại kích thước của Richtext bằng với Form
Private Sub Form_Resize()
rtfNoiDung.Top = 0
rtfNoiDung.Left = 0
rtfNoiDung.Height = Me.ScaleHeight
rtfNoiDung.Width = Me.ScaleWidth
End Sub
Đoạn lệnh sau viết trong Form frmMain:
frmMain.frm
Dim SoTT As Integer '/// Biến dùng để lưu số lượng Form tạo ra
'/// Người dùng click chọn menu : "Tài liệu mới"
Private Sub mnuNew_Click()
Dim F As New frmDocument '///Tạo một thể hiện mới của frmDocument
SoTT = SoTT + 1
F.Caption = "Tài liệu thứ " & SoTT '/// Đặt tiêu đề cho cửa sổ (form) mới
Trang 12End Sub
' -'/// Người dùng click chọn mục "mở tài liệu"
Private Sub mnuOpen_Click()
Dim TenFile As String
dlgMain.Filter = "Tất cả các file văn bản |*.rtf;*.txt|Tất cả các file|*.*|"
dlgMain.ShowOpen
TenFile = dlgMain.FileName
Dim FormMoi As New frmDocument '///Tạo 1 thể hiện mới của frmDocument
FormMoi.Caption = TenFile '/// Đặt caption là tên của file vừa mở
FormMoi.rtfNoiDung.LoadFile TenFile '/// Nạp file đó vào điều khiển Richtext
End Sub
' -'/// Lưu nội dung trong Richtext của của form đang kích hoạt ra file
Private Sub mnuSave_Click()
Dim TenFile As String
Dim FormDangSoanThao As frmDocument '/// Khai báo biến Form
dlgMain.Filter = "Tất cả các file văn bản|*.txt|File RTF|*.rtf|Tất cả các file|*.*|" dlgMain.ShowSave
TenFile = dlgMain.FileName
Set FormDangSoanThao=ActiveForm '///Gán biến file cho form đang kích hoạt
FormDangSoanThao.rtfNoiDung.SaveFile TenFile, rtfRTF '/// Lưu ra file
FormDangSoanThao.Caption = TenFile '/// Cập nhật lại tiêu đề của form
End Sub
'/// - '/// Sự kiện này được kích hoạt khi người dùng click một nút trên thanh Toolbar
'/// Khi chọn định dạng đậm, nghiêng, gạch chân thì đảo lại giá trị trước đó (sử dụng phép NOT) '/// -
Private Sub tbrMain_ButtonClick(ByVal Button As MSComctlLib.Button)
Dim F As frmDocument
Set F = ActiveForm '/// Trỏ đến Form đang được kích hoạt
Select Case Button.Key
Case "cmdBold"
F.rtfNoiDung.Font.Bold = Not F.rtfNoiDung.Font.Bold
If F.rtfNoiDung.Font.Bold = True Then Button.Value = tbrPressed
If F.rtfNoiDung.Font.Bold = False Then Button.Value = tbrUnpressed
Case "cmdItalic"
F.rtfNoiDung.Font.Italic = Not F.rtfNoiDung.Font.Italic
If F.rtfNoiDung.Font.Italic = True Then Button.Value = tbrPressed
If F.rtfNoiDung.Font.Italic = False Then Button.Value = tbrUnpressed
Case "cmdUnderline"
F.rtfNoiDung.Font.Underline = Not F.rtfNoiDung.Font.Underline
Button.Value=IIf(F.rtfNoiDung.Font.Underline=True, tbrPressed, tbrUnpressed)
End Select
End Sub