Báo Cáo Luận Văn Tốt Nghiệp Trang 1
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
III. Giới thiệu một số hàm có liên quan 78
IV. Giới thiệu một số cấu trúc dữ liệu có liên quan 92
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
SVTH : Lương Cao Hoài Tâm Lớp TH40
Báo Cáo Luận Văn Tốt Nghiệp Trang 4
và cuối cùng sẽ là nêu những vấn đề còn tồn tại và hướng phát triển trong tương
lai.
SVTH : Lương Cao Hoài Tâm Lớp TH40
Báo Cáo Luận Văn Tốt Nghiệp Trang 5
Chương 1:
TÌM HIỂU VỀ
TÌM HIỂU VỀ
LẬP TRÌNH WINDOWS
LẬP TRÌNH WINDOWS
SVTH : Lương Cao Hoài Tâm Lớp TH40
Báo Cáo Luận Văn Tốt Nghiệp Trang 6
I - KHÁI QUÁT VỀ LẬP TRÌNH TRONG WINDOWS:
Báo Cáo Luận Văn Tốt Nghiệp Trang 7
2 - Thư viện liên kết động DLL (Dynamic Link Library):
Thư viện liên kết động là các tập tin được Windows lưu dưới dạng nhò phân
chứa các hàm mà mọi ứng dụng trên Windows đều có thể sử dụng. Nét đặc
trưng của DLL là nó có thể được sử dụng bởi nhiều ứng dụng tại cùng một thời
điểm hay nói cách khác thư viện liên kết động có thể cùng một lúc được gọi bởi
nhiều chương trình. DLL là một dữ liệu chia sẻ được (shared data).
Có 3 loại DLL khác nhau:
- Thư viện liên kết động API: thuộc hệ thống Windows, khi cài hệ điều
hành thì nó đã có sẵn. Chúng được nạp khi Windows khởi động.
- Thư viện liên kết động third party: do các công ty khác tạo ra trên môi
trường Windows, hỗ trợ thêm công tác lập trình trong Windows.
- Thư viện liên kết động do chúng ta tạo ra.
Windows sử dụng cấu trúc thư viện liên kết động DLL (Dynamic Link
Library) nhằm mục đích không sao chép một khối lượng lớn các mã vào trong
chương trình như ở các thư viện thông thường. Nhờ cấu trúc động của DLL nên
mọi chương trình đều có thể truy cập thư viện trong thời gian thực thi. Các hàm
API được Windows giữ dưới dạng hỗn hợp trong một số DLL. Trong quá trình
dòch khi gặp lệnh gọi hàm API từ chương trình ứng dụng thì chương trình dòch
không thêm mã này vào module thực hiện mà chỉ thêm các lệnh liên kết (chứa
tên của DLL bên trong có hàm cần nạp) và tên hàm đó. Khi thực thi chương
trình thì hàm API thực sự mới được nạp vào bộ nhớ để thực hiện.
Cùng với sự phát triển của Windows là sựï phát triển của lập trình hướng
đối tượng, và để hỗ trợ cho việc lập trình hướng đối tượng, Microsoft đã cung
cấp cho người lập trình một bộ thư viện các lớp cơ bản để phát triển các ứng
dụng hướng đối tượng gọi là MFC (Microsoft Foundation Classes), nội dung của
nó bao gồm thông tin về các lớp cơ bản được chuẩn hóa như lớp application;
document; view; OLE; cửa sổ; nút bấm; text; v.v…, trong các lớp này mọi thứ
liên quan đến nó (bao gồm dữ liệu và các chương trình xử lý của nó) đều được
làm hoàn chỉnh, người lập trình chỉ việc lấy ra sử dụng, hoặc có thể thêm bớt
LRESULT SendMessage(hwnd, uMsg, wParam, lParam)
HWND hwnd; // handle của cửa sổ nhận (đích)
UINT uMsg; // thông điệp để gởi
WPARAM wParam; // thông số thông điệp đầu tiên
SVTH : Lương Cao Hoài Tâm Lớp TH40
Báo Cáo Luận Văn Tốt Nghiệp Trang 9
LPARAM lParam; // thông số thông điệp thứ hai
- Hàm SendMessage gởi thông điệp tới một hay nhiều cửa sổ. Hàm gọi thủ
tục cửa sổ cho cửa sổ và không trở về cho đến lúc thủ tục cửa sổ đã xử lý thông
điệp.
- 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.
b) Hàm PostMessage:
- Cú pháp:
BOOL PostMessage(hwnd, uMsg, wParam, lParam)
HWND hwnd; // handle của của sổ đích
UINT uMsg; // thông điệp gở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 PostMessage gởi (đặt) một thông điệp vào trong hàng thông điệp
cửa sổ và rồi trở về mà không đợi cửa sổ tương ứng xử lý thông điệp. Những
thông điệp trong một hàng thông điệp được lấy bằng cách gọi hàm SetMessage
hay PeekMessage.
- Giá trò trả về: trả về khác 0 nếu thành công, ngược lại 0.
c) Hàm SendDlgItemMessage:
- Cú pháp:
LRESULT
SendDlgItemMessage(hwndDlg,idDlgItem,uMsg,wParam,lParam)
HWND hwndDlg; // handle của hộp hội thoại
int idDlgItem; // mã nhận diện ô điều khiển sẽ nhận thông điệp
TranslateMessage()
Dispatch Message()
WndProc()
WndProc() WndProc()
DefWndProc()
DefWndProc() DefWndProc()
Thread1 Hook Thread2 Hook Thread3 Hook
System Dispatcher
Báo Cáo Luận Văn Tốt Nghiệp Trang 11
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
chạy đa nhiệm trong một thời điểm. Windows 95 và Windows NT mở rộng khả
năng của version Windows trước bằng việc cấp phát cho mỗi dòng xử lý (thread)
hay mỗi tiến trình (proccess) một hàng đợi thông điệp riêng. Trong version
Windows cũ thì tất cả ứng dụng đều dùng chung một hàng đợi thông điệp, vì thế
để các ứng dụng khác xử lý thông điệp, ứng dụng phải trả quyền điều khiển về
cho Windows mỗi khi nó có thể. Với Windows 95 và Windows NT, điều này
không còn nữa.
SVTH : Lương Cao Hoài Tâm Lớp TH40
}
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
SVTH : Lương Cao Hoài Tâm Lớp TH40
Báo Cáo Luận Văn Tốt Nghiệp Trang 13
duy trì có nhiệm vụ lo lưu giữ những thông tin cần thiết mà ứng dụng sẽ cần đến
khi phải hiển thò kết xuất lên một thiết bò vật lý. GDI không bao giờ cho phép
chương trình làm việc trực tiếp với một DC mà GDI phân phối cho chương trình
một handle để nhận dạng một DC cụ thể. Tất cả các hàm API; GDI đều nhận
thông số đầu tiên là một handle – hdc.
DC là một công cụ chứa các thuộc tính vẽ, DC cho phép kết nối logic một
chương trình về một thiết bò cụ thể nào đó. Ngoài ra do Windows là một hệ điều
hành đa nhiệm nên các chương trình không thể truy xuất trực tiếp các thiết bò vật
lý để tránh xung đột. Thay vào đó, chương trình Windows phải sử dụng kết nối
logic do DC đại diện. Nghóa là tất cả các chương trình cách tiếp cận này để GDI
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:
Windows sử dụng các hệ thống tọa độ khác nhau tùy theo hoàn cảnh như:
Hệ toạ độ thiết bò (Device coordinate system)
- Hệ toạ độ toàn màn hình (Full screen coordinate system)
- Hệ toạ độ vùng client (Client area coordinate system)
- Hệ toạ độ toàn cửa sổ (Whole window coordinate system)
- Hệ toạ độ logic (Logical coordinate system)
Trong phạm vi ứng dụng của đề tài chúng tôi chỉ quan tâm đến các hệ toạ
độ :
SVTH : Lương Cao Hoài Tâm Lớp TH40
Windows
Application
GDI
Device Context
Device
Driver
Output
Device
Windows
Application
Windows
Application
Device
Driver
Device
Driver
Output
đổi giữa các hệ tọa độ đã được cung cấp bởi các hàm nêu trên.
5 - Viewport và window:
Mapping mode cho biết ánh xạ tọa độ logic và những kích thước được cung
cấp khi gọi các hàm GDI qua hệ thống tọa độ thiết bò gắn liền với DC. Tức là
SVTH : Lương Cao Hoài Tâm Lớp TH40
Báo Cáo Luận Văn Tốt Nghiệp Trang 16
mapping mode quyết đònh GDI ánh xạ việc ánh xạ một window (tọa độ logic)
qua một viewport (tọa độ thiết bò). Viewport nghóa là một vùng hình chữ nhật
của hệ thống tọa độ thiết bò được đònh nghóa bởi một DC còn window khi sử
dụng để qui chiếu GDI mapping mode là một hình chữ nhật của hệ thống tọa độ
logic được đònh nghóa bởi một DC.
Công thức để chuyển đổi một hệ tọa độ window (logic) qua một hệ tọa độ
viewport (thiết bò):
xviewport = (xwindow - xwindowOrg)(xviewportExt / xwindowExt) +
xviewportOrg
yviewport = (ywindow - ywindowOrg)(yviewportExt / ywindowExt) +
yviewportOrg
Trong đó:
(xwindow,ywindow) là điểm trên tọa độ logic được chuyển đổi thành điểm
(xviewport,yviewport)
(xwindowOrg,ywindowOrg) và (xviewportOrg,yviewportOrg) là origin của
vùng hình chữ nhật window và viewport theo mặc nhiên các điểm này được cho
về (0,0) trên DC mặc nhiên.
Công thức sử dụng 2 điểm cho biết extent của một vùng theo tọa độ logic
(xwindowExt,ywindowExt) và của một vùng theo hệ tọa độ thiết bò
(xviewportExt,yviewportExt).
Tỉ lệ của (viewpot extent / window extent) là hệ số scaling dùng để dòch
đơn vò logic qua đơn vò thiết bò.
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:
phần trong vùng của nó cho cửa sổ con và cửa sổ con sẽ nhận tất cả các tác động
từ bên ngoài vào vùng này. Một cửa sổ con có thể có nhiều cửa sổ con khác và
mỗi cửa sổ con đều có cho riêng nó một handle riêng để giao dòch khi gởi thông
điệp cho cửa sổ cha mẹ. Mỗi cửa sổ con là một cửa sổ độc lập, nó nhận tác động
bên ngoài của riêng nó và các thông điệp khác. Những input gởi cho cửa sổ con
được đi trực tiếp tới cửa sổ con và không chuyển qua cửa sổ cha mẹ ngoại trừ
trường hợp cửa sổ con bò hàm EnabledWindow cho disabled. Trong trường hợp
này thì Windows chuyển bất kỳ input nào tới cửa sổ con đó cho cửa sổ cha mẹ
của nó. Điều này cho phép cửa sổ cha mẹ kiểm tra được input và làm cho cửa sổ
con ở trạng thái enabled nếu nó thấy điều đó là cần thiết.
SVTH : Lương Cao Hoài Tâm Lớp TH40
Báo Cáo Luận Văn Tốt Nghiệp Trang 18
Những hoạt động của cửa sổ cha mẹ cũng ảnh hưởng đến cửa sổ con như
sau:
- Shown: Cửa sổ cha mẹ sẽ được hiển thò trước cửa sổ con.
- Hidden: Cửa sổ cha mẹ sẽ bò che sau cửa sổ con. Cửa sổ con sẽ được nhìn
thấy (hết bò che) (visible) chỉ khi cửa sổ cha mẹ được nhìn thấy.
- Destroyed: Cửa sổ cha mẹ bò huỷ sau cửa sổ con.
- Moved: Cửa sổ con bò di chuyển cùng với vùng client của cửa sổ cha mẹ.
Cửa sổ con đáp ứng cho việc tô vẽ sau khi di chuyển.
- Gia tăng kích thước hay ở trạng thái kích thước cực đại: tô vẽ bất kỳ phần
nào của cửa sổ cha mẹ mà đã được phơi bày ra như là kết quả của kích thước
tăng lên của vùng client.
Windows không tự động xén (clip) một cửa sổ con ra khỏi vùng client của
cửa sổ cha mẹ. Điều này nghóa là cửa sổ cha mẹ vẽ lên trên cửa sổ con nếu nếu
nó tiến hành bất kỳ sự tô vẽ nào trong cùng vò trí với vò trí của cửa sổ con.
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
thống hủy cửa sổ. Ngay cả khi cửa sổ ở trong quá trình đang bò hủy, thủ tục cửa
sổ nhận những thông điệp thêm vào đưa tới nó cơ hội để tiến hành bất kỳ nhiệm
vụ làm sạch (cleanup) nào trước lúc kết thúc. Những thông điệp này gồm WM_
, WM_DESTROY, WM_QUERYENDSESSION và WM_ENDSESSION. Nhưng
khi cửa sổ bò hủy thì không có thêm thông điệp nào được đưa tới thủ tục cho cửa
sổ cụ thể đó. Nếu có nhiều hơn một cửa sổ của lớp, tuy nhiên, thủ tục cửa sổ tiếp
tục nhận thông điệp cho những cửa sổ khác cho đến khi cũng chính chúng bò
hủy. Một thủ tục cửa sổ chỉ rõ làm thế nào tất cả cửa sổ của một cửa sổ đưa ra
thực sự có hành vi bằng cách đáp ứng những gì các cửa sổ tạo ra những lệnh từ
user hay hệ thống. Thủ tục cửa sổ phải kiểm tra những thông điệp mà nó nhận từ
hệ thống và quyết đònh bất kỳ hành động gì sẽ diễn ra. Thủ tục cửa sổ cũng có
thể chọn không đáp ứng một thông điệp được đưa ra. Nếu không đáp ứng thủ tục
phải chuyển thông điệp tới hàm DefWindowProc để đưa cho hệ thống cơ hội để
đáp ứng. Hàm này thực hiện hành động có sẵn trên cơ sở thông điệp được đưa ra
và những thông số của nó. Nhiều thông điệp (đặc biệt là thông điệp vùng non-
client) phải được xử lý vì thế DefWindowProc được yêu cầu trong tất cả các thủ
tục cửa sổ.
Thủ tục cửa sổ cũng nhận các thông điệp mà thực sự đã dự đònh được xử lý
bởi hệ thống. Những thông điệp vùng-nonclient thông báo cho thủ tục biết user
SVTH : Lương Cao Hoài Tâm Lớp TH40
Báo Cáo Luận Văn Tốt Nghiệp Trang 20
thực hiện một vài hành động trong vùng client của cửa sổ hoặc một vài thông tin
về cửa sổ được yêu cầu bởi hệ thống để thực hiện một hành động. Mặc dù
Windows chuyển những thông điệp này tới thủ tục cửa sổ thì thủ tục sẽ chuyể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
5 - Vấn đề tô vẽ màn hình:
Khi một cửa sổ bò di chuyển thì Windows tự động sao chép nội dung của
vùng client tới vò trí mới. Điều này tiết kiệm thời gian bởi vì một cửa sổ không
phải tính toán lại và vẽ lại nội dung của vùng client như là phần của sự di
chuyển. Nếu cửa sổ di chuyển hay thay đổi kích thước thì Windows chỉ sao chép
phần lớn vùng client trước đó khi nó cần điền vò trí mới. Nếu cửa sổ gia tăng
kích thước thì Windows sao chép toàn bộ vùng client và gởi thông báo
WM_PAINT tới cửa sổ để điền vào trong vùng được phơi bày mới hơn. Khi cửa
sổ bò di chuyển thì Windows cho rằng nội dung của vùng client vẫn hợp lệ và có
thể được sao chép không cần thay dổi tới vò trí mới. Tuy nhiên với một vài cửa
sổ thì nội dung của vùng client không còn hợp lệ sau khi di chuyển đặc biệt là
nếu di chuyển luôn sự thay đổi kích thước. Để tô vẽ lại toàn bộ vùng client thay
cho sao chép nội dung trước đó mỗi lần một cửa sổ thay đổi kích thước thì một
cửa sổ sẽ xác đònh kiểu CS_VREDRAW và trong lớp cửa sổ.
Để quản lý hiển thò màn hình, Windows tiến hành nhiều hoạt động ảnh
hưởng tới nội dung của vùng client. Nếu Windows di chuyển, đònh kích thước
hay thay đổi bề mặt màn hình, sự thay đổi có thể ảnh hưởng cửa sổ được đưa ra.
Nếu vậy, Windows đánh dấu vùng bò thay đổi bằng hoạt động sẵn sàng cho việc
cập nhật và ở cơ hội tiếp theo nó gởi thông điệp WM_PAINT tới cửa sổ vì thế
nó có thể cập nhật cửa sổ trong vùng cần cập nhật. Nếu một cửa sổ vẽ trong
vùng client của nó thì nó phải gọi BeginPaint để lấy handle của ngữ cảnh màn
hình, phải cập nhật vùng bò thay đổi như đã đònh nghóa bởi vùng cập nhật và cuối
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ẽ.
SVTH : Lương Cao Hoài Tâm Lớp TH40
Báo Cáo Luận Văn Tốt Nghiệp Trang 22
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
sổ sau khi những hoạt động như di chuyển, đònh kích thước và cuộn cửa sổ.
SVTH : Lương Cao Hoài Tâm Lớp TH40
Báo Cáo Luận Văn Tốt Nghiệp Trang 23
Hàm ValidateRect và ValidateRgn xóa một hình chữ nhật hay một vùng ra
khỏi vùng cập nhật. Những hàm này được sử dụng điển hình khi cửa sổ đã cập
nhật một phần đặc biệt của màn hình trong vùng cập nhật trước khi nhận thông
điệp WM_PAINT.
Hàm GetUpdateRect lấy hình chữ nhật nhỏ nhất bao lấy toàn bộ vùng cập
nhật. Hàm GetUpdateRgn lấy vùng cập nhật chính nó. Những hàm này có thể
được sử dụng để tính toán kích thước hiện hành của vùng cập nhật để quyết đònh
những công việc vẽ nào được yêu cầu.
V – CHƯƠNG TRÌNH WINDOWS TIẾP NHẬN THÔNG ĐIỆP CHUỘT:
Giới thiệu dòng chảy dữ liệu thông điệp nhập từ con chuột:
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.
SVTH : Lương Cao Hoài Tâm Lớp TH40
Hardware event
queue
Device driverMouse
GetMessage()
DispatchMessage()
WindowProc()
DefWindowProc()
Hook
chain
Virtual &
Scan code
Báo Cáo Luận Văn Tốt Nghiệp Trang 24
HTNOWHERE, HTTRANSPARENT thì cursor nằm trên vùng non-client thì
Windows sẽ phát đi thông điệp non-client.
SVTH : Lương Cao Hoài Tâm Lớp TH40
Báo Cáo Luận Văn Tốt Nghiệp Trang 25
Còn khi DefWindows trả về kết quả HTCLIENT thì cursor nằm trên vùng
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ẽ