Báo Cáo Luận Văn Tốt Nghiệp Trang 1
SVTH : Lương Cao Hoài Tâm Lớp TH40
MỤC LỤC
LỜI MỞ ĐẦU 3
CHƯƠNG 1: TÌM HIỂU VỀ LẬP TRÌNH WINDOWS 4
I. Khái quát về lập trình trong Windows 5
II. Thông điệp và xử lý thông điệp 7
III. Giao diện thiết bò đồ họa GDI 11
IV. Cửa sổ trong Windows 15
V. Chương trình Windows tiếp nhận thông điệp chuột 22
CHƯƠNG 2: TÌM HIỂU VỀ HOOK 26
1 - Chuỗi hook 27
2 - Thủ tục hook 27
3 - Các loại hook 28
4 - Sử dụng hook 30
5 - Hook trong Windows 3.x 31
6 - Giới thiệu một số hàm liên quan đến hook 33
CHƯƠNG 3: KỸ THUẬT OVERRIDE HÀM API 36
I. Khái quát về kỹ thuật override 37
II. Lý do sử dụng kỹ thuật override trong lập trình Windows 37
III. Cơ chế hoạt động và quản lý bộ nhớ trên Windows 16bits 38
IV. Cơ chế hoạt động và quản lý bộ nhớ trên Windows 32bits 41
V. Hiện thực kỹ thuật override trên Windows 16bits 45
VI. Một số hàm được sử dụng trong kỹ thuật override 50
CHƯƠNG 4: KẾT XUẤT VĂN BẢN TRONG WINDOWS 54
I. Kết xuất văn bản trong Windows 55
II. Các hàm căn bản để kết xuất văn bản 55
CHƯƠNG 5: PHÂN TÍCH VÀ THIẾT KẾ CHƯƠNG TRÌNH 66
I. Phân tích vấn đề 67
II. Thiết kế chương trình 68
một từ, một câu hoặc cần phải dòch một đoạn văn bản, một file dữ liệu nào đó ra
tiếng Việt và ngược lại. Đây là một nhu cầu cần thiết và hầu như xảy ra thường
xuyên đối với nhiều người, do đó nhận dạng từ đặc biệt là nhận dạng từ trên
màn hình trong môi trường Windows là việc làm cần thiết và có ý nghóa thực tế.
Kết quả của việc nhận dạng từ sẽ được dùng để xây dựng nên các ứng
dụng khác chẳng hạn như các từ điển được tra cứu theo kiểu tương tác trực tiếp
sẽ rất thuận tiện cho người sử dụng bởi vì theo cách này thì cho dù đang ở trong
bất kỳ ứng dụng nào khi cần tra cứu thì thao tác trực tiếp ngay trên ứng dụng
đang dùng tức là chỉ cần click chuột vào đó chứ không cần phải mở từ điển rồi
tra cứu từ đó theo kiểu cổ điển.
Vì thế, trong thời gian làm Luận Án Tốt nghiệp được sự hướng dẫn của
thầy Lê Tấn Hùng nhóm sinh viên chúng tôi thực hiện đề tài: “ Nhận dạng từ
dưới cursor mouse trên deskop Windows. Viết chương trình nhận dạng từ này ”.
Trong giai đoạn đầu của Luận Án Tốt Nghiệp chúng tôi đã nghiên cứu được một
số vấn đề quan trọng và căn bản có ý nghóa trong việc thực hiện yêu cầu đã đặt
ra của đề tài. Đề tài này chỉ tập trung nhận dạng từ ở dạng text trên desktop của
môi trường Windows rồi xuất kết quả ra.
Trong thời gian làm Luận Án Tốt Nghiệp nhóm sinh viên chúng tôi đã tiến
hành nghiên cứu cơ chế hoạt động và quản lý của hệ điều hành Windows.
Nghiên cứu về phương thức lập trình trong môi trường Windows và các phương
tiện mà Windows hỗ trợ khi lập trình. Tham khảo và nghiên cứu kỹ thuật
override các hàm giao tiếp của Windows ở chế độ 16 bit và 32 bit. Nghiên cứu
cách xử lý các thông điệp trong Windows và tìm hiểu về cách kết xuất văn bản,
về chế độ ánh xạ, vấn đề tọa độ . . . và cách xử lý văn bản. Trên cơ sở đó bước
đầu chúng tôi đã xây dựng xong một ứng dụng có khả năng nhận dạng được từ
trên nền Windows 16 bit được viết bằng ngôn ngữ Visual C++ version 1.5 và
hướng phát triển trong thời gian tới là hiện thực nó trên nền Win32.
Báo cáo của chúng tôi sẽ lần lượt điểm qua những nội dung mà chúng tôi
đã nghiên cứu và tìm hiểu được trong thời gian qua. Sau đó là phần giới thiệu chi
tiết về chương trình từ khâu phân tích-thiết kế cho đến phần chương trình nguồn
V
V
E
E
À
ÀL
L
A
A
Ä
Ä
P
P
T
T
R
R
Ì
Ì
N
vector ngắt của DOS, nhưng nó thân thiện hơn ở chỗ cách gọi hàm API giống hệt
cách gọi hàm của ngôn ngữ cấp cao, mỗi hàm có một tên gọi hẳn hoi, và tên gọi
thường được đặt rất phù hợp với công dụng của hàm (mặc dù có hơi dài dòng) từ
đó tạo khả năng gợi nhớ cao. Với Windows, người lập trình không còn phải lập
trình theo kiểu assembly nữa mà lập trình theo kiểu ngôn ngữ cấp cao, mọi hoạt
động trong máy ở mức thấp từ hàm API trở xuống thuộc phạm vi của Windows,
và Windows không khuyến khích việc các ứng dụng can thiệp vào lónh vực này.
Bù lại, bằng các hàm API, nó hỗ trợ rất hiệu quả cho người lập trình, giúp khai
thác khả năng của thiết bò triệt để, dễ dàng và tiện lợi hơn bao giờ hết. Có thể
nói Windows đã mở ra cho người lập trình không gian rộng lớn để phát triển ứng
dụng, và hạn chế không gian phát triển hệ thống. Điều này dẫn đến hệ quả là
các ứng dụng được tạo ra hết sức dễ dàng, và quan trọng là hệ thống chạy ổn
đònh hơn, không bò treo do lỗi của ứng dụng, không thể xâm nhập, nhưng sẽ
rất khó khăn nếu người lập trình muốn trực tiếp điều khiển hoạt động trong máy
và phát triển về lập trình hệ thống.
- Tìm hiểu hàm Windows API: Windows là một hệ điều hành đa nhiệm
(multitasking) mà qua đó các ứng dụng ở trong môi trường Windows sẽ giao tiếp
với user thông qua một hay nhiều giao diện. Để truy cập các giao diện này thì
các ứng dụng được xây dựng trên môi trường Windows sẽ sử dụng tập các hàm
được gọi là giao diện chương trình ứng dụng API (Application Program
Interface). Chương trình của người sử dụng có thể gọi tới các hàm API để truy
cập tới mọi tài nguyên của Windows. GDI là một bộ phận của API, giao diện
thiết bò đồ họa GDI (Graphic Device Interface) có nhiệm vụ duy trì sự độc lập
của Windows đối với các thiết bò đồ họa hay còn gọi là khả năng độc lập thiết bò
(device independent) tức là cho phép Windows làm việc với nhiều kiểu thiết bò
đồ họa khác nhau.
THƯ VIỆN ĐIỆN TỬ TRỰC TUYẾN
Báo Cáo Luận Văn Tốt Nghiệp Trang 7
SVTH : Lương Cao Hoài Tâm Lớp TH40
2 - Thư viện liên kết động DLL (Dynamic Link Library):
cấp một “khung làm việc” (framework) cực mạnh để người lập trình không cần
THƯ VIỆN ĐIỆN TỬ TRỰC TUYẾN
Báo Cáo Luận Văn Tốt Nghiệp Trang 8
SVTH : Lương Cao Hoài Tâm Lớp TH40
phải quan tâm đến những đoạn chương trình thuộc về “thủ tục” mà chỉ cần quan
tâm đến phần cốt lõi để đạt được mục đích.
II - THÔNG ĐIỆP VÀ XỬ LÝ THÔNG ĐIỆP:
1 - Khái niệm:
Lập trình trên môi trường Windows khác với lập trình ở các môi trường
khác ở điểm là lập trình trên Windows luôn luôn gắn liền với những thông điệp.
Mọi hoạt động xảy ra trên một chương trình Windows đều thông qua các thông
điệp. Thông điệp sẽ được hệ thống báo cho các ứng dụng biết các tác động từ
bên ngoài vào hệ thống Windows. Một cửa sổ có thể gởi đi một thông điệp cho
một cửa sổ khác và các cửa sổ đáp ứng lại thông điệp bằng cách gởi đi một
thông điệp khác cho một cửa sổ khác.
Trong Windows có 3 loại thông điệp cơ bản:
- Những thông điệp tổng quát: có mã nhận diện mang tiền tố WM_ được
coi là phần lớn trong ứng dụng và Windows đã cung cấp các hàm để giải quyết.
- Những control notification: đây là những thông điệp WM_COMMAND
được chuyển từ cửa sổ con tới cửa sổ bố mẹ.
- Những nút lệnh: là thông điệp WM_COMMAND phát đi từ trình đơn, từ
các nút điều khiển. Đây là loại thông điệp yêu cầu ứng dụng phải thực hiện một
công việc gì đó.
2 - Gởi đi các thông điệp:
Windows cho phép ứng dụng gởi đi những thông điệp cho mình, cho các
ứng dụng khác hoặc cho hệ thống.
Có 3 hàm Windows API để gởi thông điệp đi:
a) Hàm SendMessage:
Cú pháp:
LRESULT SendMessage(hwnd, uMsg, wParam, lParam)
UINT uMsg; // thông điệp gởi đi
WPARAM wParam; // thông số thông điệp đầu tiên
LPARAM lParam; // thông số thông điệp thứ hai
- Hàm SendDlgItemMessage gởi một thông điệp tới một điều khiển trong
hộp hội thoại.
THƯ VIỆN ĐIỆN TỬ TRỰC TUYẾN
Báo Cáo Luận Văn Tốt Nghiệp Trang 10
SVTH : Lương Cao Hoài Tâm Lớp TH40
- Giá trò trả về: cho biết kết quả xử lý thông điệp và phụ thuộc vào thông
điệp được gởi.
3 - Vòng lặp thông điệp:
Một thread hoặc một process đẩy một thông điệp ra khỏi hàng đợi bằng
cách dùng vòng lặp thông điệp. Vòng loop chính của một ứng dụng đặt tại cuối
hàm WinMain() của ứng dụng đó. Vòng lặp thông điệp có dạng như sau:
while GetMessage(&msg,NULL,0,0)
{ TranslateMessage(&msg);
DispatchMessage(&msg);
}
Sau đây là Sơ đồ dòng thông điệp:
System Dispatcher
THƯ VIỆN ĐIỆN TỬ TRỰC TUYẾN
Báo Cáo Luận Văn Tốt Nghiệp Trang 11
SVTH : Lương Cao Hoài Tâm Lớp TH40
Nó mô tả đơn giản hóa quá trình xử lý thông điệp. Thông điệp có thể bắt
nguồn từ nhiều cách khác nhau, sơ đồ sau đây sẽ giải thích chi tiết hơn về vòng
lặp thông điệp và chỉ ra cách thông điệp được đặt vào hàng đợi như thế nào:
Thông điệp không chỉ phát xuất từ sự kiện phần cứng, cũng có thể có
thông điệp của chương trình phát xuất từ một chương trình đang chạy. Các
threads có thể gởi dữ liệu trở về sau và về trước bằng cách gởi thông điệp.
Thông điệp có thể gởi vào hàng đợi bằng hàm PostMessage() , hoặc chúng có
thể được gởi trực tiếp cho vòng lặp thông điệp để xử lý ngay lập tức bằng hàm
SendMessage().
4 - Xử lý thông điệp:
Việc xử lý thông điệp là yếu tố chính làm cho các ứng dụng Windows vận
hành được. Hệ thống và các ứng dụng khác sinh ra các thông điệp cho mọi sự
kiện xuất hiện trong hệ thống thông điệp của Windows sẽ cho phép Windows
nó cũng được đưa vào các hàng đợi của các thread đó.
Một thông điệp trên thực tế là một cấu trúc dữ liệu như sau:
typedef struct tagMSG {
HWND hwd; // handle cửa sổ
UINT message; //số chỉ đònh loại message
WPARAM wParam; //được chuyển cho WndProc()
LPARAM wParam; //được chuyển cho WndProc()
DWORD time; //số mili giây từ lúc bắt đầu
POINT pt; //cấu trúc điểm POINT
}
III - GIAO DIỆN THIẾT BỊ ĐỒ HỌA GDI
(GRAPHIC DEVICE INTERFACE):
1 - Khái niệm:
Windows là một hệ điều hành đa nhiệm (multitasking) trong đó các ứng
dụng giao tiếp với user thông qua một hay nhiều giao diện. Để truy xuất các
giao diện thì chương trình ứng dụng phải sử dụng các hàm Giao diện chương
trình ứng dụng. API là tập các lệnh mà một ứng dụng sử dụng để yêu cầu và tiến
hành các dòch vụ cấp thấp được thi hành bởi Windows.
Giao diện thiết bò đồ họa GDI (Graphic Device Interface) là một phần của
API có nhiệm vụ duy trì sự độc lập của Windows đối với các thiết bò đồ họa (cho
phép Windows làm việc với nhiều thiết bò đồ họa khác nhau). Windows GDI là
một thư viện bao gồm một số hàm giúp kết xuất đồ họa (graphic output) lên màn
hình, máy in…GDI sẽ tạo ra: điểm, đường kẻ, hình dạng (shape: chữ nhật, tròn…),
chữ văn bản.
2 - Device Context:
Ngữ cảnh thiết bò DC (Device Context) là một phần quan trọng của GDI
Windows. Một DC là một cấu trúc dữ liệu dài khoảng 800 bytes được Windows
THƯ VIỆN ĐIỆN TỬ TRỰC TUYẾN
Báo Cáo Luận Văn Tốt Nghiệp Trang 13
thông tin quan trọng khác. Cấu trúc chứa những đặc tính DC được gọi là khối dữ
liệu DC. THƯ VIỆN ĐIỆN TỬ TRỰC TUYẾN
Báo Cáo Luận Văn Tốt Nghiệp Trang 14
SVTH : Lương Cao Hoài Tâm Lớp TH40
3 - Chế dộ ánh xạ (mapping mode):
Để duy trì sự độc lập thiết bò, GDI tạo ra output ở không gian luận lý và
ánh xạ nó lên màn hình. Chế độ ánh xạ cho biết mối quan hệ giữa không gian
luận lý và những pixel trên thiết bò.
Có tới 8 chế độ ánh xạ khác nhau nhưng chúng tôi chỉ quan tâm tới chế độ
ánh xạ MM_TEXT vì đây là chế độ ánh xạ mặc đònh. Trong chế độ này một đơn
vò luận lý được ánh xạ tới một pixel trên thiết bò hay màn hình. Như vậy đơn vò
tính luận lý là pixel và các tọa độ x, y cũng được tính theo pixel, trò x tăng khi
qua phải và giảm khi qua trái, trò y tăng khi đi xuống và giảm khi đi lên. Origin
của hệ thống tọa độ là góc trái-trên (upper-left) của màn hình.
4 - Hệ thống tọa độ windows:
Output
Device
THƯ VIỆN ĐIỆN TỬ TRỰC TUYẾN
Báo Cáo Luận Văn Tốt Nghiệp Trang 15
SVTH : Lương Cao Hoài Tâm Lớp TH40
a) Full screen coordinate system:
Là hệ thống tọa độ thiết bò liên quan tới trọn màn hình. Tọa độ màn hình
được tính theo pixel và chọn tọa độ (0,0) làm góc upper-left của màn hình. Hệ
thống này sử dụng khi liên quan đến trọn màn hình trên tọa độ màn hình.
Thường vò trí của một đối tượng như con nháy hoặc con trỏ hoặc cửa sổ so với
góc upper-left của màn hình thì dùng hệ tọa độ này.
b) Client area coordinate system:
Cũng là hệ tọa độ thiết bò, nó khác với hệ tọa độ trọn màn hình ở origin của
hệ tọa độ. Tọa độ trọn màn hình là tương đối so với upper-left của màn hình còn
tọa độ vùng client là tương đối so với upper-left của vùng client. Tọa độ này
cũng tính theo device unit (pixel) giống như tọa độ màn hình.
Hàm ClientToScreen để chuyển tọa độ vùng client qua tọa độ trọn màn
hình.
Hàm ScreenToClient chuyển tọa độ trọn màn hình qua tọa độ vùng client.
c) Whole window coordinate system:
Gần giống hệ tọa độ vùng client, là tương đối so với góc upper-left của cửa
sổ, được sử dụng khi vẽ vùng nonclient của cửa sổ.
d) Logical coordinate:
Hầu hết các hàm GDI sử dụng hệ tọa độ này. Hệ thống tọa độ logic không
phải là hệ thống tọa độ thiết bò, hệ thống tọa độ logic bao giờ cũng được ánh xạ
lên một hệ thống tọa độ thiết bò. Hệ tọa độ logic có thể được ánh xạ lên hệ tọa
độ toàn màn hình, hệ tọa độ vùng client hoặc hệ tọa độ toàn cửa sổ.
Dùng hàm DPtoLP để chuyển tọa độ thiết bò sang hệ tọa độ logic.
Dùng hàm LPtoDP để chuyển tọa độ logic sang hệ tọa độ thiết bò.
Như vậy điều quan trọng trong việc tính toán sử dụng hệ tọa độ là phải
Việc chuyển đổi ngược lại tương tự bằng các biến đổi công thức trên.
IV - CỬA SỔ TRONG WINDOWS:
Cửa sổ là khái niệm cơ bản trong giao diện GDI của Windows, nó là một
kiến trúc chuẩn mực để từ đó xây dựng nên các đối tượng khác như: cửa sổ chính
của ứng dụng (main frame); text box; edit control; button; combo box; menu;
scroll bar;... nói chung là toàn bộ những công cụ tạo nên giao diện GDI đều có
thể gọi là cửa sổ. Cũng có thể xem cửa sổ như vùng chữ nhật màn hình mà nơi
đó ứng dụng in ra các kết xuất và nhận các dữ liệu từ người dùng.
THƯ VIỆN ĐIỆN TỬ TRỰC TUYẾN
Báo Cáo Luận Văn Tốt Nghiệp Trang 17
SVTH : Lương Cao Hoài Tâm Lớp TH40
Windows quản lý tất cả cửa sổ hiện có trong hệ thống bằng cách gán cho
mỗi cửa sổ một handle (trên thực tế nó là một số nguyên)ø, ta chỉ cần có được
handle cửa sổ thì có thể thao tác mọi thứ trên cửa sổ đó.
Một cửa sổ chia sẻ màn hình với các cửa sổ khác, kể cả các cửa sổ của ứng
dụng khác. Chỉ có một cửa sổ trong một thời điểm có thể nhận dữ liệu nhập từ
người dùng. Người dùng có thể dùng chuột, bàn phím, hay các thiết bò nhập khác
để tương tác với cửa sổ này và ứng dụng sở hữu nó.
1 - Các loại cửa sổ:
Windows cung cấp nhiều kiểu cửa sổ khác nhau để có thể kết hợp hình
thành nên các hình thức cửa sổ khác nhau. Các kiểu được sử dụng trong hàm
CreateWindow khi cửa sổ được tạo.
Một số kiểu cửa sổ sau:
- Cửa sổ chồng lên nhau (Overlapped windows hay top-level window): là
cửa sổ không bao giờ có cửa sổ cha mẹ.
- Cửa sổ bò sở hữu (Owned windows): là kiểu đặc biệt, được sở hữu bởi một
cửa sổ bò chồng
- Cửa sổ pop-up: là kiểu đặc biệt của cửa sổ overlapped nhưng có thể có
hoặc không title bar.
- Cửa sổ con: là cửa sổ xác đònh vùng client của cửa sổ cha mẹ, được sử
Windows chỉ xén cửa sổ con ra khỏi vùng client của cửa sổ cha mẹ nếu cửa sổ
cha mẹ có kiểu WS_CLIPCHILDREN. Nếu cửa sổ con bò xén thì cửa sổ cha mẹ
không thể tô vẽ lên nó. Một cửa sổ con có thể chồng lên các cửa sổ con khác
trong cùng vùng client. Cửa sổ anh em (cùng cha mẹ) có thể tô vẽ trong mỗi
vùng client của các cửa sổ khác trừ khi một cửa sổ con có kiểu
WS_CLIPSIBLINGS. Nếu ứng dụng xác đònh kiểu này cho một cửa sổ con thì
bất kỳ phần nào của cửa sổ anh em của cửa sổ con đó nằm trong cửa sổ này đều
bò xén. Nếu một cửa sổ có kiểu WS_CLIPCHILDREN hoặc
WS_CLIPSIBLINGS thì một mất mát nhỏ trong sự thực hiện (performance) xảy
ra. Mỗi cửa sổ chiếm tài nguyên hệ thống bởi vậy ứng dụng sẽ không sử dụng
các cửa sổ con một cách bừa bãi. Để hoạt động tối ưu một ứng dụng cần chia
luận lý cửa sổ chính của nó trong thủ tục cửa sổ của cửa sổ chính còn hơn là
dùng các cửa sổ con.
2 - Thủ tục cửa sổ (Window Procedures):
Một thủ tục cửa sổ xử lý tất cả những thông điệp được gởi tới tất cả các cửa
sổ trong lớp được đưa ra. Windows gởi các thông điệp tới thủ tục cửa sổ khi nó
nhận input từ user có ý đònh chuyển cho cửa sổ được đưa ra hay khi nó cần thủ
THƯ VIỆN ĐIỆN TỬ TRỰC TUYẾN
Báo Cáo Luận Văn Tốt Nghiệp Trang 19
SVTH : Lương Cao Hoài Tâm Lớp TH40
tục để thực hiện một vài hành động trên cửa sổ của nó như việc tô vẽ lại bên
trong vùng client.
Thủ tục cửa sổ nhận các kiểu thông điệp như: nhập vào từ bàn phím, chuột;
yêu cầu tiêu đề cửa sổ; tường thuật sự thay đổi gây ra bởi cửa sổ khác (như thay
đổi file WIN.INI); cơ hội sửa đổi đáp ứng hệ thống tiêu chuẩn đến những hoạt
động chắc chắn (như điều chỉnh menu trước lúc hiển thò); yêu cầu thực hiện một
vài hành động trên cửa sổ hay vùng client của nó (cập nhật vùng client); thông
tin về tình trạng của nó trong mối quan hệ với các cửa sổ khác (truy xuấ nhất
đònh thất bại của nó tới bàn phím hay trở thành cửa sổ hoạt động).
Một thủ tục cửa sổ nhận hầu hết các thông điệp là từ Windows nhưng nó
chúng cho hàm DefWindowProc và không cố gắng xử lý chúng. Ở trường hợp
này thủ tục cửa sổ phải phớt lờ thông điệp hay trả về không chuyển nó tới
DefWindowProc.
3) Thông điệp cửa sổ:
Một thông điệp cửa sổ là một tập những giá trò mà Windows gởi tới thủ tục
cửa sổ để cung cấp input cho cửa sổ hay yêu cầu cửa sổ thực hiện một vài hành
động. Windows tính đến một sự thay đổi rộng khắp những thông điệp mà nó hay
ứng dụng của nó có thể gởi tới thủ tục cửa sổ. Hầu hết những thông điệp được
gởi tới cửa sổ như là kết quả của hàm đưa ra đang được thực thi hay như là kết
quả của input từ user. Mỗi thông điệp gồm 4 giá trò: một handle xác đònh cửa sổ,
một danh hiệu thông điệp, một giá trò thông điệp-đặc biệt 16-bit và một giá trò
thông điệp-đặc biệt 32-bit. Những giá trò này được chuyển tới thủ tục cửa sổ như
là những thông số riêng lẻ. Rồi thủ tục cửa sổ kiểm tra danh hiệu thông điệp để
quyết đònh những đáp ứng gì phải làm và làm thế nào để thông dòch giá trò 16-bit
và 32-bit.
Cú pháp thủ tục cửa sổ:
-
LONG FAR PASCAL WndProc(hwnd, wMsg, wParam, lParam)
HWND hwnd;
WORD wMsg;
WORD wParam;
DWORD lParam;
Các thông số:
hwnd cho biết cửa sổ nhận thông điệp
wMsg loại thông điệp
wParam thông tin thông điệp-đặc biệt thêm vào 16-bit
lParam thông tin thông điệp-đặc biệt thêm vào 32-bit
Hàm trả về giá trò 32-bit cho biết kết quả xử lý thông điệp
THƯ VIỆN ĐIỆN TỬ TRỰC TUYẾN
Báo Cáo Luận Văn Tốt Nghiệp Trang 21
cùng nó phải gọi EndPaint để hoàn tất công việc. Một cửa sổ có thể vẽ trong
vùng client của nó bất kỳ lúc nào tức là ngoài thời điểm mà nó đáp ứng thông
điệp WM_PAINT chỉ cần nó lấy ngữ cảnh màn hình cho vùng client trước lúc nó
tiến hành vẽ.
THƯ VIỆN ĐIỆN TỬ TRỰC TUYẾN
Báo Cáo Luận Văn Tốt Nghiệp Trang 22
SVTH : Lương Cao Hoài Tâm Lớp TH40
Thông điệp WM_PAINT: là một yêu cầu của Windows tới một cửa sổ để
cập nhật màn hình cửa nó. Windows gởi WM_PAINT bất cứ khi nào cần vẽ một
phần lại cửa sổ. Khi cửa sổ nhận thông điệp WM_PAINT thì nó sẽ lấy vùng cập
nhật bằng hàm BeginPaint và nó sẽ tiến hành bất kỳ hoạt động gì cần thiết để
cập nhật phần đó của vùng client.
InvalidateRect và InvalidateRgn thực sự không sinh ra thông điệp
WM_PAINT. Windows tích luỹ những thay đổi được tạo ra bởi các hàm này và
những thay đổi của riêng nó trong lúc một cửa sổ xử lý những thông điệp khác
trong hàng thông điệp của nó. Làm trễ WM_PAINT làm cho cửa sổ xử lý tất cả
những thay đổi cùng một lúc thay vì cập nhật những những mẫu nhỏ trong những
bước riêng lẻ làm lãng phí thời gian.
Để chỉ thò Windows gởi thông điệp WM_PAINT một ứng dụng có thể sử
dụng UpdateWindow, hàm này gởi thông điệp trực tiếp tới cửa sổ, bất chấp
những thông điệp khác trong hàng thông điệp của ứng dụng. UpdateWindow
được sử dụng khi một cửa sổ cần cập nhật vùng client của nó ngay lập tức
(chẳng hạn chỉ ngay sau cửa sổ được tạo). Khi một cửa sổ nhận WM_PAINT nó
phải gọi BeginPaint để lấy ngữ cảnh màn hình cho vùng client và lấy thông tin
khác như vùng cập nhật và background bò xóa hay không. Windows tự động
chọn vùng cập nhật như là vùng xén của ngữ cảnh màn hình. GDI huỷ bỏ (xén)
những gì được vẽ bên ngoài vùng xén chỉ những gì ở bên trong vùng cập nhật là
thực sự nhìn thấy được. BeginPaint xóa vùng cập nhật để ngăn chặn vùng giống
nhau từ việc sinh ra các thông điệp WM_PAINT đến sau. Sau khi vẽ xong
Windows phải gọi hàm EndPaint để giải phóng DC.
1 - Mouse:
Khi mouse báo vò trí của mình (vò trí cursor) và có tác động lên mouse thì
một tín hiệu được phát đi từ mouse gây ra một ngắt quãng, mouse driver giải
quyết ngắt quãng này.
Hardware event
queue
Device driver Mouse
GetMessage()
DispatchMessage()
WindowProc()
DefWindowProc()
Hook
chain
Virtual &
Scan code
THƯ VIỆN ĐIỆN TỬ TRỰC TUYẾN
Báo Cáo Luận Văn Tốt Nghiệp Trang 24
SVTH : Lương Cao Hoài Tâm Lớp TH40
2 - Mouse device driver:
Khi Windows khởi động thì mouse driver tự động nạp vào và kiểm tra xem
có chuột hay không. Nếu có thì Windows gọi driver cung cấp một thủ tục để báo
cáo các biến cố xảy ra trên chuột. Khi có một mouse event thì driver thông báo
cho Windows biết. Nếu event là di chuyển mouse thì ưu tiên đáp ứng vò trí con
trỏ di chuyển ngay lúc ngắt. Còn lại tất cả các event khác đều được đưa vào
client và những thông điệp do Windows phát đi lúc này thì sẽ được trình ứng
dụng xử lý.
Hàm SendMessage() sẽ sử dụng mã hit-test code để quyết đònh xem loại
thông điệp chuột nào mà cho phát sinh. Khi hit-test code bằng HTCLIENT thì
một thông điệp vùng client sẽ được phát sinh còn tất cả các hit-test code khác sẽ
phát sinh ra những thông điệp chuột vùng non-client.
Trước khi SendMessage() trả về một thông điệp chuột cho chương trình của
ta thì có một việc mà hàm này phải thi hành: nó phải bảo đảm là hình dáng
cursor phù hợp vò trí hiện thời của mouse. Muốn thế nó phải gởi đi một thông
điệp khác cho thủ tục cửa sổ WM_GETCURSOR. Tương tự như thông điệp
WM_NCHITTEST đa số chương trình phớt lờ thông điệp này và giao cho
DefWindowProc() thực hiện. Mã hit-test code được cho ở trong byte thấp của
thông số lParam để cho DefWindowProc() biết mà thiết đặt hình dáng của con
trỏ.
Hai thông điệp WM_NCHITTEST và WM_SETCURSOR bao giờ cũng đi
trước một thông điệp chuột. Vì Windows phải tìm ra xem vò trí cursor hiện ở
trong vùng client hay vùng non-client để phát ra thông điệp vùng client hay
thông điệp vùng non-client một cách thích hợp. Một khi đã được nhận diện thì
Windows phải đảm bảo là người sử dụng nhận được hình dáng cursor thích hợp.
Windows cho phép đặt message hook để thay đổi dòng chảy các thông
điệp. Một WH_GETMESSAGE hook có thể thay đổi dòng chảy của bất cứ thông
điệp chuột của vùng client hoặc vùng non-client. Khi GetMessage() sẵn sàng
đem một thông điệp vào chương trình của ta thì nó sẽ gọi hook xem có thay đổi
gì không trước khi thông điệp được chuyển cho chương trình.
Khi GetMessage() đã đưa thông điệp vào chương trình rồi thì thông điệp sẽ
được trao trực tiếp cho thủ tục cửa sổ thích hợp bởi hàm DispatchMessage(). Bây
giờ thông điệp đã nằm trong thủ tục cửa sổ.
5 - Thủ tục cửa sổ:
Hơn 20 thông điệp của Windows về chuột (trừ WM_NCHITTEST) thì có 10
thông điệp thuộc vùng non-client do DefWindowProc() giải quyết. Hai thông số