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:
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 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.
SVTH : Lương Cao Hoài Tâm Lớp TH40
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
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 để người lập trình không cầ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 8
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)
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
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.
SVTH : Lương Cao Hoài Tâm Lớp TH40
Báo Cáo Luận Văn Tốt Nghiệp Trang 10
- 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:
SVTH : Lương Cao Hoài Tâm Lớp TH40
Thread1 Message Queue Thread2 Message Queue Thread3 Message Queue
System Dispatcher
Hardware Event Occur
System Message Queue
GetMessage()
TranslateMessage()
Dispatch Message()
GetMessage()
TranslateMessage()
Dispatch Message()
GetMessage()
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
Hardware Events
Message Sent
From Other Threads
System Dispatcher
System Message Queue
Thread Message Queue
WndProc()
Message Loop
PostMessage()
TranslateMessage()
SentMessage()
SentMessage()
(To Another Thread)
Other threads
PostMessage()
Other threads
PostMessage()
Báo Cáo Luận Văn Tốt Nghiệp Trang 12
Windows sinh ra thông điệp cho mọi sự kiện phần cứng, ví dụ như ngườ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 {
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
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
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 (Accessing 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ự hoạ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.
SVTH : Lương Cao Hoài Tâm Lớp TH40
Báo Cáo Luận Văn Tốt Nghiệp Trang 14
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:
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
Device
Output
Device
Không có nhận xét nào:
Đăng nhận xét