thông qua cấu trúc:
Do While 0 <>GetMessage (message, 0, 0,0) TranslateMessage message DispatchMessage message
Loop
Trong đó message là chỉ lệnh mà hệ điều hành cung cấp, thông qua cán (handle) của cửa sổ. Đương nhiên, nếu chỉ lệnh có giá trị WM_QUIT thì hàm WinProc trong cửa sổ chấm dứt vòng lặp. Còn nếu chỉ lệnh message khác giá trị trên, thì 2 dòng lệnh trên sẽ thực hiện.
Cụ thể:
TranslateMessage message -> Dịch chỉ lệnh thành dạng dữ liệu khác đặt kết quả này vào hàng đợi của ứng dụng.
DispatchMessage message ->Nhận chỉ lệnh từ hàm GetMessage và gửi cho hệ thống. Hệ thống sẽ đưa chỉ lệnh cho ứng dụng.
Windows có hàng ngàn chỉ lệnh khác nhau đó là các hằng dạng WM_*.
Một hàm WinProc luôn nhận vào trong nó các biến theo khuôn mẫu sau để xử lý: Function WinProc(hwnd as Long, wc as WNDCLASSEX, message as MSG, wParam as Long, lparam as Long)
Nếu hàm WinProc không xử lý các chỉ lệnh, nó phải đưa trả chỉ lệnh cho hệ điều hành xử lý thông qua hàm DefWindowProc. Hàm DefWindowProc gởi lại chỉ lệnh WM_CLOSE cho WinProc. Hàm WinProc sẽ lại gởi trả WM_CLOSE cho DefWindowProc một lần nữa như mô tả ở trên.
Có thể bạn quan tâm!
- Lập trình Window - 1
- Các Thao Tác Cơ Bản Với Các Đối Tượng Trên Form
- Thuộc Tính, Phương Thức Và Sự Kiện
- Lập trình Window - 5
Xem toàn bộ 248 trang tài liệu này.
Ta có thể tóm lại sơ bộ như sau:
Hình 1.1. Cơ chế xử lý chỉ lệnh của Windows
Các chỉ lệnh đưa tới ngăn chờ trên thông thường từ các nguồn sau:
1) Hệ thống đặt vào
2) Chương trình khác đặt vào
3) Chính chương trình của mình đặt vào thông qua các hàm SendMessage() và PostMessage().
Tuy nhiên, nếu chọn sử dụng hàm SendMessage() thì sau khi chỉ lệnh được WinProc lấy ra xử lý thì chương trình mới tiếp tục chạy tiếp lệnh kế sau. Còn nếu dùng PostMessage() chỉ có tác dụng đặt chỉ lệnh vào hàng đợi và thực hiện ngay lệnh kế tiếp.
Từ đây ta nhận thấy việc xử lý hệ thống của Windows thông qua cơ chế trên thì giản đơn đi rất nhiều.
1.2. Thư viện liên kết động
Windows cung cấp rất nhiều các hàm gọi dưới dạng các thư viện liên kết động (Dynamic Link Libraries - DLL). Các tệp tin DLL này được biên dịch với C/C++.
Thế mạnh của DLL:
Nhất quán: Người sử dụng ưa chuộng Windows vì nó không ít thì nhiều có một giao diện người sử dụng phổ biến cho mọi ứng dụng. Ví dụ các hộp thoại thông dụng, các menu, thanh công cụ của Office97… Nghĩa là có những đoạn chương trình chung để tạo ra chúng.
Dễ bảo trì: Những thay đổi hoặc bổ sung nếu có sẽ thể hiện trên mọi ứng dụng.
Tệp tin EXE nhỏ hơn: Do một phần công việc chứa ở nơi khác, và không gắn kết “cứng nhắc” như liên kết tĩnh, kích cỡ tệp tin EXE được giảm nhỏ.
DLL là nền tảng của thiết kế Windows. Windows thực chất là tập hợp các DLL để các ứng dụng khác nhau có thể dùng chung. Bên trong các DLL này là hàng trăm hàm/thủ tục. Ta gọi chúng là Windows API.
Các API được tổ chức trong bốn DLL chính của Windows:
KERNEL32: Là DLL chính, đảm nhiệm quản lý bộ nhớ, thưc hiện chức năng đa nhiệm và những hàm ảnh hưởng trực tiếp đến hoạt động của Windows.
USER32: Thư viện quản lý Windows. Thư viện này chứa các hàm xử lý menu, định giờ, truyền tin, tệp tin và nhiều phần không được hiển thị khác của Windows.
GDI32: Giao diện thiết bị đồ hoạ (Graphics Device Interface). Thư viện này cung cấp các hàm vẽ trên màn hình, cũng như kiểm tra phần biểu mẫu nào cần vẽ lại.
WINNM: Cung cấp các hàm multimedia để xử lý âm thanh, nhạc, video thời gian thực, lấy mẫu, v.v…
Ta có thể tìm các tệp tin này trong thư mục C:Windowssystem. Ngoài ra, còn có các DLL nhỏ hơn, cũng được dùng phổ biến để cung cấp các dịch vụ đặc biệt cho ứng dụng.
1.3. Windows API
1.3.1. Gọi API
Gọi API không khác gì với gọi hàm/ thủ tục trong module của đề án. Ví dụ ta có thủ tục:
Public sub FindText(obiDataControl as Control, SFilename as String)
„ Code to implement function here End sub
Để gọi thủ tục ta dùng :
FindText datTitles, “Titles”
Chỉ có điều API là một thủ tục không chỉ nằm ngoài module mà còn nằm ngoài Visual Basic.
1.3.2. Khai báo một cuộc gọi API:
Trước khi dùng hàm của DLL, ta cần khai báo hàm đó. Visual Basic cần biết:
Tên hàm / thủ tục.
Tệp tin DLL chứa nó.
Tham số truyền.
Kiểu dữ liệu truyền về nếu là hàm.
Khai báo API tương tự khai báo hàm/ thủ tục thông thường. Ta vẫn bắt đầu bằng từ khoá Sub/Function, chỉ khác là trước đó phải có từ khoá Declare.
Ví dụ: Tạo cửa sổ nhấp nháy bằng cách gọi API Bước 1. Tạo một project mới
Bước 2. Đưa điều khiển định giờ (timer) lên biểu mẫu và gán giá trị cho thuộc tính Interval là 10. Nó sẽ gây ra một sự kiện timer mỗi 10 mi-li-giây.
Bước 3. Nhấn đúp lên điều khiển timer này để mở cửa sổ Code và gò vào thủ tục:
Private Sub Timer1_Timer()
Dim nReturnValue As Integer nReturnValue= Flash(Form1.hWnd, True)
End Sub
Bước 4. Khai báo hàm Flash trong General - Declarations
Private Declare Function Flash Lib "User32" Alias "FlashWindow" _ (ByVal hWnd As Long, ByVal bInvert As Boolean) As Long
Bước 5. Chạy chương trình. Khi biểu mẫu xuất hiện, tiêu đề của nó nhấp nháy.
Giải thích: Từ khoá Declare báo Visual Basic biết đây là khai báo một hàm của DLL. Sau Declare là từ khoá Sub hay Function, cho biết đây là thủ tục hay hàm. Ta chỉ có một trong hai lựa chọn. Từ khoá Lib cho biết tên DLL đang chứa hàm/ thủ
tục đó. Ở đây là thư viện User32. Từ khoá Alias cho biết tên thực sự của hàm/ thủ tục trong thư viện. Nó có thể khác với tên ta khai báo trước từ khoá Lib. Cuối cùng là khai báo các tham số truyền, cùng với kiểu dữ liệu trả về của hàm. Ở đây tham số được truyền là :
(ByVal hWnd As Long, ByVal bInvert As Boolean) As Long
Tham số đầu, hWnd, là “handle”, xác định cửa sổ cần nhấp nháy. Tham số thứ hai, bInvert là giá trị Boolean. Nếu bInvert được truyền vào có giá trị True, thanh tiêu đề sẽ nhấp nháy. Để trả về trạng thái đầu, ta phải gọi lại lần nữa, vớI bInvert mang giá trị False.
Sau khi khai báo hàm API, ta có thể gọi API như một hàm hoặc thủ tục Visual Basic thông thường. Gọi Flash là gọi đến API trong DLL, và ta lưu giá trị trả về trong biến nReturnValue.
Đối với các hàm thông thường, ta có thể không cần sử dụng giá trị trả về của hàm. Tuy nhiên, ta vẫn cần chứa giá trị trả về vào một biến dù ta không có ý định sử dụng nó. Phần lớn API trả về mã lỗi kiểu số, và ta có thể dùng nó để kiểm tra mọi việc có hoạt động chính xác hay không.
Trong thực tế, bỏ qua giá trị trả về không chỉ là lười biếng mà còn thực sự nguy hiểm nếu ta đang gọi nhiều API.
Sử dụng API sai có thể dẫn đến treo Windows, nếu không nói là treo máy. Khi làm việc với các API phức tạp, như những hàm cần cấp phát nhiều vùng nhớ và tài nguyên hệ thống ta không nên bỏ qua các giá trị trả về. Vì hàm DLL nằm ngoài ứng dụng, chúng tự kiểm tra lỗi ta chỉ biết có sai sót thông qua giá trị trả về.
1.3.3. Trình duyệt API ( API Text Viewer)
Được cung cấp sẵn khi cài Visual Studio 6.0. Khi ta cần tra cứu cú pháp chính xác của hàm API, ta dùng API Text Viewer. Để sử dụng API Text Viewer, ta chọn Start/All Programs/Microsoft Visual Studio 6.0/Microsoft Visual Studio 6.0 Tools/API Text Viewer khi đó cửa sổ API Viewer xuất hiện như sau:
Hình 1.2. Cửa sổ API Viewer
Để tra cứu hàm nào, ta chọn File/Load Text File từ menu hệ thống, chọn tệp tin (chẳng hạn Win32API), rồi nhấn Open, khi đó danh sách các hàm API được khai báo trong file văn bản đó được hiển thị trong mục Available, như hình sau:
Hình 1.3. Danh sách hàm trong Win32API
Kích chuột chọn một hàm trong danh sách (chẳng hạn hàm AddPrinter), rồi nhấn nút Add, cú pháp của hàm sẽ được hiển thị trong mục Selected Items, như hình sau:
Hình 1.4. Cú pháp hàm AddPrinter trong cửa sổ API Viewer
Tuy nhiên, để có thông tin chi tiết hơn như hàm API làm gì, truyền tham số gì, trả về giá trị gì, ta cần có quyển sách tra cứu.
Ngoài ra, chương trình này còn cho phép copy nội dung API đến clipboard để dán vào chương trình.
1.4. Liên lạc với các ứng dụng của Windows
1.4.1. Clipboard
Clipboard là vùng bộ nhớ được Windows quản lý cho phép sao chép dữ liệu giữa các ứng dụng.Visual Basic cho phép ta điều khiển hệ thống clipboard thông qua đối tượng Clipboard. Đối tượng này có 6 phương thức và không có thuộc tính. Các phương thức bao gồm:
Clear: Xóa dữ liệu khỏi clipboard.
SetText: Dùng để đặt văn bản vào Clipboard (copy) GetText: Dùng để lấy văn bản từ Clipboard (paste) SetData: Dùng để đặt hình ảnh vào Clipboard GetData: Dùng để lấy hình ảnh từ Clipboard
1.4.2. Chạy một chương trình của Windows
Visual Basic cho phép ta chạy một chương trình khác bằng cách sử dụng thủ tục Shell
TaskId = Shell(PathName, [WindowStyle])
Trong đó PathNane có thể bao gồm một dòng lệnh. WindowStyle là hằng để xác định dạng cửa sổ.
Ví dụ: Để khởi động chương trình NotePad và tải một tệp tin “c:bootlog.txt” vào chương trình, ta viết lời gọi sau:
Shell "notepad c:bootlog.txt", vbNormalFocus
1.5. Giới thiệu Visual Basic 6.0
Visual Basic 6.0 là một công cụ lập trình trực quan. Khác với các môi trường lập trình hướng thủ tục, Visual Basic 6.0 là môi trường lập trình hướng đối tượng. Trong môi trường lập trình hướng thủ tục, nếu như ứng dụng (application) được thiết kế để giải quyết một vấn đề lớn, thì lập trình viên có thể chia nhỏ vấn đề lớn đó thành nhiều vấn đề nhỏ và viết các hàm/thủ tục để giải quyết riêng từng cái. Còn với lập trình hướng đối tượng, lập trình viên sẽ chia nhỏ vấn đề cần giải quyết thành các đối tượng. Mỗi đối tượng có những đặc điểm, mà ta gọi là thuộc tính (properties) và những chức năng riêng biệt mà ta gọi là phương thức (methods). Lập trình viên phải đưa ra các thuộc tính và phương thức mà đối tượng cần thể hiện. Phương thức là đoạn chương trình chứa trong đối tượng, cho đối tượng biết cách thức để thực hiện một công việc gì đó, phương thức chỉ được thực hiện khi có lời gọi theo cú pháp:
<đối tượng>.<phương thức>. Tương tự thuộc tính và phương thức, các đối tượng còn có một bộ sự kiện (events) khác nhau. Các sự kiện là những phản ứng của đối tượng, nó xảy ra thường là kết quả của một hành động nào đó, như di chuyển chuột, nhấn nút bàn phím, hoặc gò vào hộp văn bản, …
1.5.1. Khởi động Visual Basic 6.0
Ta có thể khởi động Visual Basic 6.0 theo các cách sau:
Cách 1: Nhấp trái chuột vào nút Start, chọn Programs, chọn Microsoft Visual Studio 6.0, chọn Microsoft Visual Basic 6.0
Hình 1.5. Khởi động Visual Basic 6.0 từ nút Start
Cách 2: Chọn biểu tượng Microsoft Visual Basic 6.0 trên màn hình nền nhấn Enter hoặc nhấp đúp chuột
Hình 1.6. Biểu tượng của Visual Basic 6.0 trên màn hình nền
1.5.2. Giới thiệu màn hình làm việc
Sau khi khởi động Visual Basic 6.0 chúng ta được đưa vào môi trường phát triển tích hợp của Visual Basic (Gọi tắt là IDE- Integrated Development Environment). Đây là nơi mà ta có thể tạo ra các chương trình.
Hình 1.7. Màn hình làm việc của Visual Basic 6.0
a) Thanh tiêu đề (Title Bar)
Thanh tiêu đề thể hiện tên của chương trình (project) mặc định là Project1
b) Thanh thực đơn (Menu Bar)
Thanh thực đơn xuất hiện ngay dưới thanh tiêu đề, chứa các tuỳ chọn thực đơn cho phép người sử dụng thao tác với Visual Basic bằng cách chọn các mục chọn đơn bằng chuột hoặc phím tắt trên thực đơn để thực hiện.
c) Thanh công cụ (Tool Bar)
Thanh công cụ là thanh chứa các lệnh được thể hiện dưới dạng biểu tượng giúp người sử dụng có thể thi hành một lệnh nhanh hơn.