“Nhấn và xem” với VB6
Trong công việc cũng như trong học tập, chắc không ít lần bạn phải tiếp xúc
với tài liệu nước ngoài và tự điển trên máy tính là trợ thủ đắc lực không thể
thiếu. Khả năng 'nhấn và xem' (hay 'click and see') - tra nghĩa từ ngay trong
tài liệu là tính năng rất cần thiết. Bài viết này sẽ hướng dẫn bạn xây dựng
một chương trình dạng 'nhấn và xem' với VB6.
Nguyên tắc hoạt động
Chương trình được đặt tên là CnS. Để có thể tra từ trong các ứng dụng khác (MS
Word, Arobat Reader, IE,...), chúng ta phải 'bắt' - câu móc hệ thống - để phát hiện khi
người dùng nhấn chuột (dĩ nhiên chương trình của chúng ta phải chạy nền), sau đó sao
chụp từ vị trí con trỏ chuột vào bộ nhớ và gửi về cho CnS xử lý. CnS sẽ so sánh từ này
với CSDL từ điển có sẵn và hiển thị form thông tin ngay vị trí từ muốn tra. CnS chạy
nền, đặt biểu tượng ở khay hệ thống.
Khởi tạo chương trình
Để bắt đầu, bạn tạo Standard Project mới, form1 mặc định được tạo. Vào menu
Project/Add Form để thêm form2, Project/Add module để thêm module mới. Đặt tên
form1=frmMain (Visible=false, Caption= 'Click and See'), form2=frmPopup (form hiển thị
thông tin, BoderStyle=0), module1=mHook. Vào Project/Properties chọn Startup Object
là Sub Main.
Tạo một file CSDL trong Access gồm 1 bảng (WordsTable) và trong bảng này tạo 9
trường: Words, Display, Pronunciation, Noun, Verbs, Adjective, Preposition, Adverb và
Other. Lưu với tên EV.mdb cùng thư mục với CnS.
Phần FRMMAIN
Trong frmMain bạn dùng MenuEditor tạo một menu cha (Caption: tùy ý, name:
mnuCnS,bỏ chọn ô Visible) và 2 menu con: 1(Caption: &Return to Program, name:
mnuR), 2(Caption: &Exit Program, name: mnuE). Nhấn Ctrl+T để vào hộp thoại
Components Control, click chọn và thêm lên form:
1. Microsoft ADO Data Control 6.0(OLEDB) (Name:ADO)
2. Microsoft DataGrid Control 6.0(OLEDB) (Name:DG, Enable=False, DataSource =
ADO)
3. Microsoft SysInfo Control 6.0 (Name: SI)
Đối tượng DG kết hợp với ADO sẽ hiển thị và cho phép bạn hiệu chỉnh trực tiếp lên
CSDL (Edit Mode).
Thêm lên form 5 CommandButton:
1.Caption: &Edit Mode, Name:cmdE
2. Caption: &Add Record, Name: cmdAR, Enable=false
3. Caption: &Delete Record, Name: cmdDR,Enable=false
4. Caption: &Return to Systray, Name: cmdRT
5. Caption: &Exit, Name: cmdExit
Ngoài ra, bạn thêm 2 Image để hiển thị trạng thái 'Enable' (hoạt động) và 'Disable' (tắt)
chương trình ở khay hệ thống.
Sub đảm nhiệm việc tạo icon ở khay hệ thống:
Private Sub AddToSysTray()
TrayI.cbSize = Len(TrayI)
TrayI.hWnd = Me.hWnd 'lấy handle của frmMain
TrayI.uId = 1&
TrayI.uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE
TrayI.ucallbackMessage = WM_LBUTTONDOWN
TrayI.hIcon = imgIcon(1).Picture 'Icon hiển thị trạng thái Enable
TrayI.szTip = 'Click and See® Program-Enable' & Chr$(0) 'Chr$(0)- định dạng lại
tooltiptext
Shell_NotifyIcon NIM_ADD, TrayI 'tạo Icon
Me.Hide 'Ẩn frmMain đi
End Sub
và gỡ bỏ icon khỏi khay hệ thống:
Private Sub RemoveFromSystray()
TrayI.hWnd = Me.hWnd
TrayI.uId = 1&
TrayI.cbSize = Len(TrayI)
Shell_NotifyIcon NIM_DELETE, TrayI 'hủy bỏ icon
UnhookWindowsHookEx hHook 'không câu móc hệ thống
End Sub
Thủ tục form_load:
Private Sub Form_Load()
AddToSysTray 'xuống khay hệ thống
bState = 1 'trạng thái của chương trình là Enable
Edit_Mode = 0 'không cho phép hiệu chỉnh DataGrid
'thực hiện câu móc chuột hệ thống:
hHook = SetWindowsHookEx(WH_MOUSE_LL, AddressOf MouseProc,
App.hInstance, 0)
ConnectStr = 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' & App.Path &
'\EV.mdb;Persist
Security Info=False' 'chuỗi ConnectString của ADO
ADO.ConnectionString = ConnectStr
ADO.RecordSource = RecordSourceStr
ADO.Refresh
ADO.Recordset.Sort = 'Words' 'sắp xếp theo trường Words
End Sub
Sự kiện xử lý nhấn chuột lên form (thực ra là nhấn lên Icon ở khay
hệ thống):
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As
Single)
Msg = X / Screen.TwipsPerPixelX 'lấy tọa độ tương ứng với từng thông báo
Select Case Msg
Case WM_RBUTTONUP 'sau khi nhấn chuột phải
Me.PopupMenu mnuCnS 'hiển thị menu Popup
Case WM_LBUTTONDOWN 'nhấn chuột trái
bState = (bState = 0)
Select Case Abs(bState)
Case 0 'Disable chương trình
TrayI.hIcon = imgIcon(0).Picture
TrayI.szTip = 'Click and See Pro gram-Disable' & Chr$(0)
'không câu móc
UnhookWindowsHookEx hHook
Case 1 'Enable chương trình
TrayI.szTip = 'Click and See Pro gram®-Enable' & Chr$(0)
TrayI.hIcon = imgIcon(1).Picture
'câu móc lại
hHook = SetWindowsHookEx(WH_MOUSE_LL, AddressOf MouseProc,
App.hInstance, 0)
End Select
Shell_NotifyIcon NIM_MODIFY, TrayI 'biến đổi thông tin Icon
End Select
End Sub
Khi tìm từ, nếu có DG sẽ trích duy nhất từ đó trong CSDL và hiển thị ở dòng đầu tiên.
Để biết từ cần tìm có trong CSDL hay không ta dựa vào thuộc tính Text của cột đầu
tiên:
Public Function FindWord(ByVal sWord As String) As Boolean
On Error GoTo errTrap
'câu truy vấn, không có khoảng cách trắng giữa dấu nháy đơn và dấu nháy kép
ADO.RecordSource = RecordSourceStr & ' where [Words]= ' ' & sWord & ' ' '
ADO.Refresh
FindWord = IIf(DG.Columns(0).Text <> vbNullString, True, False)
Exit Function
errTrap:
Select Case Err.Number
Case 6160 'lỗi không tìm thấy
FindWord = False 'không tìm thấy
End Select
End Function
Phần FRMPOPUP
Chọn BorderStyle cho form=0-None, Backcolor=Tooltip, Width=2000, Height=3075.
Thêm một Shape Control (mặc định là hình chữ nhật, Top=0, Left=0, Width=2000,
Height=3075) làm đường biên cho form, một CommandButton (Name:cmdClose) để
tạm thời giấu cửa sổ frmPopup, và một vbalRichEditControl (Name:rtfMain,
BackColor:vbWhite, Border=True).
Chú ý, trước khi sử dụng OCX vbalRichEditControl (có cung cấp kèm theo mã nguồn
hoặc có thể dùng RichTextBox), bạn phải chép nó vào thư mục Windows/System32,
nhấn <Start>-Run-cmd, từ dấu nhắc DOS di chuyển đến thư mục System32, gõ
'regsvr32 RichEditControl.ocx' nhấn Enter. Đồng thời cũng đăng kí thêm thư viện
SSubtmr6.dll (có cung cấp kèm theo mã nguồn). vbalRichEditControl là một
RichTextBox cấp cao, tôi đã tích hợp thêm TOM (Text Object Model) và các tính năng
khác nên rất hữu ích. Vào hộp thoại Add Components (Ctrl+T) chọn và thêm lên form
Microsoft Direct Text-to-Speech (file xvoice.dll, Name=TTS ) để thêm chức năng phát
âm cho chương trình. Thêm một Command Button (Name:cmdSpk) để khi nhấn vào đó
sẽ phát âm.