intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

Báo Cáo Luận Văn: Nghiên cứu các phương pháp nhận dạng từ dưới cursor mouse trên destop windows"

Chia sẻ: Nguyễn Thị Ngọc Huỳnh | Ngày: | Loại File: PDF | Số trang:86

184
lượt xem
15
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

LỜI MỞ ĐẦU 3 CHƯƠNG 1: TÌM HIỂU VỀ LẬP TRÌNH WINDOWS I. Khái quát về lập trình trong Windows II. Thông điệp và xử lý thông điệp III. Giao diện thiết bị đồ họa GDI IV. Cửa sổ trong Windows V. Chương trình Windows tiếp nhận thông điệp chuột CHƯƠNG 2: TÌM HIỂU VỀ HOOK 1 - Chuỗi hook 2 - Thủ tục hook 3 - Các loại hook 4 - Sử dụng hook 5 - Hook trong Windows 3.x 6 - Giới thiệu một số hàm liên quan đến hook ...

Chủ đề:
Lưu

Nội dung Text: Báo Cáo Luận Văn: Nghiên cứu các phương pháp nhận dạng từ dưới cursor mouse trên destop windows"

  1. 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 Khái qu át về lập trình trong Windows I. 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 Khái qu át về kỹ thuật override I. 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 Kết xuất văn bản trong Windows I. 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 Ph ân tích vấn đề I. 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 KẾT QUẢ VÀ HƯ ỚNG PHÁT TRIỂN 97 SVTH : Lương Cao Ho ài Tâm Lớp TH40
  2. Báo Cáo Luận Văn Tố t Nghiệp Trang 2 Đề tài : Nghiên cứu các phương pháp nhận dạng từ dưới cursor mouse trên Desktop Windows. Viết chương trình nhận dạng từ này. SVTH : Lương Cao Ho ài Tâm Lớp TH40
  3. Báo Cáo Luận Văn Tố t Nghiệp Trang 3 Lời Mở Đầu gày nay, hầu như mọi công việc hàng ngày liên quan đến cuộ c sống củ a chúng ta đều diễn ra trên máy tính. Từ việc soạn thảo văn bản, gởi nhận thông tin đến việc tra cứu, truy cập th ông tin từ hệ thống m ạng máy tính tồn cầu Internet đố i với người sử dụng là công việc thư ờng ngày và rất phổ biến. Từ đó, sẽ phát sinh vấn đề là n gười sử dụng sẽ cần tìm hiểu ý nghĩa của 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à n hậ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ó ý n ghĩ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ó ý n ghĩ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à n ghiê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 đ ã n ghiê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à 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
  4. Báo Cáo Luận Văn Tố t Nghiệp Trang 4 Chương 1: TÌM HIỂU VỀ LẬP TRÌNH WINDOWS SVTH : Lương Cao Ho ài Tâm Lớp TH40
  5. Báo Cáo Luận Văn Tố t Nghiệp Trang 5 I - KHÁI QUÁT VỀ LẬP TRÌNH TRONG WINDOWS: 1 - Khái quá t về lập trình trong Windows: Mô i trường lập trình Windows về cơ bản là dựa trên bộ h àm API (Application Programmer Interface), nó có chức n ăng như các ngắt trong b ảng 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 n gô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 n guyê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ó n hiệ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. 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: SVTH : Lương Cao Ho ài Tâm Lớp TH40
  6. Báo Cáo Luận Văn Tố t Nghiệp Trang 6 - 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 n gườ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 hồ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 m ột ít tính năng đặc trưng cho đối tượng của mình. Mụ c tiêu chính của MFC là hệ thống hóa các h àm API, cung cấp một thể thức gọ i gọn các h àm API, cung cấp mộ t “khung làm việc” (framework) cự c m ạnh đ ể n gười lập trình không cần 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 ngồ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. SVTH : Lương Cao Ho ài Tâm Lớp TH40
  7. Báo Cáo Luận Văn Tố t Nghiệp Trang 7 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ụn g 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) // handle của cửa sổ nhận (đích) HWND hwnd; // thông điệp để gởi UINT uMsg; WPARAM wParam; // thông số thông điệp đầu tiên LPARAM lParam; // thông số thông điệp thứ h ai - 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) // handle của của sổ đ ích HWND hwnd; // thông điệp gởi UINT uMsg; WPARAM wParam; // thông số thông điệp đầu tiên LPARAM lParam; // thông số thông điệp thứ h ai - 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. SVTH : Lương Cao Ho ài Tâm Lớp TH40
  8. Báo Cáo Luận Văn Tố t Nghiệp Trang 8 - 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 // thông điệp gởi đ i UINT uMsg; WPARAM wParam; // thông số thông điệp đầu tiên LPARAM lParam; // thông số thông điệp thứ h ai - 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. - 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: Hardware Event Occur System Message Queue System Dispatcher System Dispatcher Thread1 Message Queue Thread2 Message Queue Thread3 Message Queue Thread1 Hook Thread2 Hook Thread3 Hook SVTH : Lương Cao Ho ài Tâm Lớp TH40 GetMessage() GetMessage() GetMessage() TranslateMessage() TranslateMessage() TranslateMessage() Dispatch Message() Dispatch Message() Dispatch Message()
  9. Báo Cáo Luận Văn Tố t Nghiệp Trang 9 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 n guồ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: Hardware Events Other threads PostMessage() System Message Queue Other threads PostMessage() System Dispatcher Message Sent From Other Threads SentMessage() PostMessage() Thread Message Queue (To Another Thread) TranslateMessage() Message Loop SentMessage() WndProc() 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 SVTH : Lương Cao Ho ài Tâm Lớp TH40
  10. Báo Cáo Luận Văn Tố t Nghiệp Trang 10 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. Windows sinh ra thông điệp cho mọi sự kiện ph ần cứng, ví dụ như n gười dùng nhấn mộ t phím ho ặc di chuyển chuột. Nó gởi thông điệp đến hàng đợi thông điệp của thread thích hợp, n ếu thông đ iệp được dành cho nhiều thread thì 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 { // handle cửa sổ HWND hwd; //số chỉ định loại message UINT message; //được chuyển cho WndProc() WPARAM wParam; //được chuyển cho WndProc() LPARAM wParam; //số mili giây từ lúc b ắt đ ầu DWORD time; //cấu trú c đ iểm POINT POINT pt; } 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 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 SVTH : Lương Cao Ho ài Tâm Lớp TH40
  11. Báo Cáo Luận Văn Tố t Nghiệp Trang 11 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 đó . Ngồ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 có th ể giải quyết tranh chấp khi 2 chương trình yêu cầu dùng cùng mộ t thiết b ị nên DC còn có vai trò làm permission slip. DC lưu trữ thông tin liên quan đến mặt bằng vẽ và những kh ả năng của nó . Trước khi sử dụng bất kỳ hàm vẽ GDI nào thì đ iều phải tạo một DC cho thiết b ị, và khi sử dụng xong thì phải trả nó về cho Windows nhằm đ ảm bảo cho ho ạt động của hệ thống được thông suốt b ởi vì số lư ợng DC m à Windows qu ản lý là có giới h ạn. DC ở Win16: Ngữ cảnh thiết bị (DC) là một nối kết giữa mộ t ứng dụng Windows, mộ t driver thiết bị và m ột thiết b ị đầu ra (output device). Windows duy trì một cache gồm 5 DC đặc biệt cho hoạt động hệ thống. Ứng dụng phải giải phóng các DC này sau khi sử dụng. Luồng thông tin từ ứng dụng Windows qua DC và device driver tới thiết bị đ ầu ra: Truy xuất thiết b ị đầu ra (Accessin g Output Devices): Bất k ỳ ứng dụ ng Windows nào cũng có thể sử dụng hàm GDI để truy xuất một thiết bị đầu ra. GDI chuyển các gọi độ c lập thiết bị từ ứng dụng tới driver thiết bị. Rồ i driver thiết bị thông dịch các gọi đó vào trong sự h oạt động độc lập thiết bị. Những đặc tính củ a DC mô tả các đố i tượng vẽ đư ợc chọn (pens và brushes), font được chọn và m àu củ a nó, cách thức mà đố i tượng được vẽ (hay ánh xạ) tới thiết b ị, vùng trên thiết bị có sẵn cho output (vùng xén) và những 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. Windows Device Output Application Driver Device Windows GDI Device Output Application Device Driver Device SVTH : Lương Cao Ho ài Tâm Lớp TH40 Windows Device Output
  12. Báo Cáo Luận Văn Tố t Nghiệp Trang 12 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ị h ay 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: Windows sử dụng các hệ thống tọa độ khác nhau tù y theo hồn cảnh như : Hệ toạ độ thiết bị (Device coordinate system) - Hệ toạ độ tồn màn h ình (Full screen coordinate system) - Hệ toạ độ vùng client (Client area coordinate system) - Hệ toạ độ tồ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ạ độ : 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 ở o rigin 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 d evice unit (pixel) giống như tọa độ màn h ình. SVTH : Lương Cao Ho ài Tâm Lớp TH40
  13. Báo Cáo Luận Văn Tố t Nghiệp Trang 13 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 độ tồn m àn hình, h ệ tọa độ vùng client hoặc h ệ tọa độ tồ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 tốn sử dụng hệ tọa độ là ph ải kiểm sốt được việc sử dụng các hệ tọa độ một cách đồng bộ bởi vì việc chuyển đổ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à m apping 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 n ghĩ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) SVTH : Lương Cao Ho ài Tâm Lớp TH40
  14. Báo Cáo Luận Văn Tố t Nghiệp Trang 14 (xwindowOrg,ywindowOrg) và (xviewportOrg,yviewportOrg) là o rigin 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: 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 b ar;... nói chung là tồ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. 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ừ n gườ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. SVTH : Lương Cao Ho ài Tâm Lớp TH40
  15. Báo Cáo Luận Văn Tố t Nghiệp Trang 15 - Cửa sổ con: là cửa sổ xác đ ịnh vùng client của cửa sổ cha mẹ, được sử dụng đ ể chia vù ng client của cửa sổ cha m ẹ ra thành các vùng chức năng kh ác nhau. Một ứng dụ ng dùng hàm ShowWindo w đ ể cho thấy hay che dấu một cửa sổ con. Mỗi cửa sổ con phải có mộ t cửa sổ cha m ẹ. Cửa sổ cha m ẹ nhường một 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 ngồ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 ngồ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 ẹ n goạ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. 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ị d i 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 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 SVTH : Lương Cao Ho ài Tâm Lớp TH40
  16. Báo Cáo Luận Văn Tố t Nghiệp Trang 16 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ủ 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ổ h ay 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ó cũng có th ể n hận thông điệp từ các cửa sổ khác gồm cả nh ững cử a sổ nó sở hữu. Những thông điệp n ày có thể là những yêu cầu về thông tin hay thông b áo mà mộ t sư kiện được đưa ra đã xảy ra trong một cửa sổ khác. Một thủ tụ c cửa sổ tiếp tục nh ận thông đ iệp fừ hệ thống và có thể chấp nhận những cử a sổ khác trong hệ thống cho đến khi thủ tụ c cửa sổ, thủ tục cửa sổ của một cửa sổ cha mẹ hay h ệ 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à n hữ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ổ. SVTH : Lương Cao Ho ài Tâm Lớp TH40
  17. Báo Cáo Luận Văn Tố t Nghiệp Trang 17 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 th ực h iệ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 độ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 h iệ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 b iệ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ố: cho biết cửa sổ nhận thông điệp hwnd loại thông điệp wMsg thông tin thông điệp-đ ặc biệt thêm vào 16-bit wParam thông tin thông điệp-đ ặc biệt thêm vào 32-bit lParam Hàm trả về giá trị 32-bit cho biết kết qu ả xử lý thông điệp 4 - Default window procedure: Hàm DefWindowProc là phần xử lý thông điệp có sẵn cho những thủ tục cửa sổ không hay không th ể truy xuất một vài thông điệp được gởi tới cho chúng. Hầu h ết các thủ tục cửa sổ thì h àm DefWindowProc thự c hiện hầu hết, n ếu không muốn nói là tất cả, việc xử lý thông điệp vùng client. Đây là các th ông điệp biểu hiện những hành động được thực hiện trên các phần khác của cửa sổ hơn là vùng client. SVTH : Lương Cao Ho ài Tâm Lớp TH40
  18. Báo Cáo Luận Văn Tố t Nghiệp Trang 18 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 tố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ổ d i 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 tồ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 tồ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ổ . Để q uả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 đ ể hồ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à ngồ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ô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 SVTH : Lương Cao Ho ài Tâm Lớp TH40
  19. Báo Cáo Luận Văn Tố t Nghiệp Trang 19 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 n gữ 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à b ackground 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 ngồ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. Vùng cập nhật: Một vùng cập nhật xác định ph ần củ a vùng client được đánh d ấu cho việc vẽ cho thông đ iệp WM_PAINT kế tiếp. Mụ c đích của vùng cập nh ật là đ ể lưu các ứng dụng thời điểm nó đ ưa ra đ ể vẽ tồn bộ nội dung của vùng client. Nếu chỉ có phần m à cần vẽ đ ược cộng vào vùng cập nhật th ì chỉ có phần đó được vẽ. Hàm InvalidateRect và InvalidateRgn cộng một h ình chữ nhật hay mộ t vùng vào vùng cập nhật. Hình chữ nh ật hay vù ng phải được đ ưa ra ở trong tọa độ client. Vùng cập nhật bản thân nó được định nghĩa trong tọa độ client. Windows cộng những vùng và h ình chữ nhật củ a chính nó vào mộ t vùng cập nhật củ a cửa sổ sau khi những hoạt động như di chuyển, đ ịnh kích thước và cuộn cửa sổ . 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 tồ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 tố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: Hardware event queue Hook Virtual & chain Scan code GetMessage() Mouse Device driver DispatchMessage() SVTH : Lương Cao Ho ài Tâm Lớp TH40 WindowProc()
  20. Báo Cáo Luận Văn Tố t Nghiệp Trang 20 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. 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 hardware event queue. 3 - Hardware event queue: Các mouse event được đưa vào hardware event queue ch ờ giao cho message loop của chương trình giải quyết. Queu này là một vùng đệm có thể chứa tối đ a 120 event. Những event trong queue chư a thuộ c một chương trình cụ thể nào cho tới khi nó được tiếp nhận bởi hàm GetMessage(). Điều này đảm bảo cho hệ thống ho ạt động đúng đắn. Sau đó là vòng lặp GetMessage(). 4 - GetMessage() loop: GetMessage() loop đ ưa các thông điệp vào xử lý. GetMessage() sẽ quyết đ ịnh chương trình nào sẽ tiếp nhận thông điệp b ằng cách xem chương trình nào sở h ữu cửa sổ mà con trỏ chuộ t nằm trên đó . Tù y theo vị trí của con trỏ m à phát sinh hai lo ại thông điệp: thông đ iệp vùng client và thông điệp vùng non-client. Muốn biết cursor ở vùng nào thì GetMessage() chuyển đi mộ t thông đ iệp WM_NCHITTEST cho thủ tục cửa sổ. Hàm GetMessage() dựa vào cơ chế pull-model để đọc thông tin tình huống trong queue và lại dựa vào push-model để biết vị trí của cursor. Tức là GetMessage() sẽ gọ i thủ tục cửa sổ như là một chương trình thường trú vậy. GetMessage() sử dụng hàm SendMessage() để gọi thủ tục cửa sổ. Trị trả về nằm trong phạm vi củ a thông điệp WM_NCHITTEST m à GetMessage() gởi cho thủ tụ c SVTH : Lương Cao Ho ài Tâm Lớp TH40
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
2=>2