Bài giảng Lập trình windows

Tóm tắt Bài giảng Lập trình windows: ...u baṇ tra trong các file header (đây là môṭ thói quen tốt khi làm việc với các hàm API) bạn sẽ thấy các dòng khai báo sau: #define WM_INITDIALOG 0x0110 #define WM_COMMAND 0x0111 #define WM_LBUTTONDOWN 0x0201 vân vân. Các thông điệp đƣợc sử dụng để tru yền thông hầu nhƣ moị...eturn NULL return NULL; } Tiếp đến là hàm Serialize cho mảng các đối tƣơṇg của lớp document (CSerializeDoc): void CSerializeDoc::Serialize(CArchive& ar) { // Pass the serialization on to the object array m_oaPeople.Serialize(ar); } Hàm làm công tác môi trƣờng, dọn dẹp...e, ServerCtrlHandler, &Context); SetServiceStatus (hSStat, &hServStatus); /* Start service-specific work; generic work is complete. */ if (ServiceSpecific (argc, argv) != 0) { hServStatus.dwCurrentState = SERVICE_STOPPED; hServStatus.dwServiceSpecificExitCode = 1; /* Server init...

pdf96 trang | Chia sẻ: havih72 | Lượt xem: 299 | Lượt tải: 1download
Nội dung tài liệu Bài giảng Lập trình windows, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
c ; 
 PAINTSTRUCT ps ; 
 RECT rect ; 
 switch (message) 
 { 
 case WM_PAINT: 
 hdc = BeginPaint (hwnd, &ps) ; 
 GetClientRect (hwnd, &rect) ; 
 EdrCenterText (hdc, &rect, 
 TEXT ("This string was displayed by a DLL")) ; 
Bài giảng môn học: Lâp̣ triǹh Windows 
81 
 EndPaint (hwnd, &ps) ; 
 return 0 ; 
 case WM_DESTROY: 
 PostQuitMessage (0) ; 
 return 0 ; 
 } 
 return DefWindowProc (hwnd, message, wParam, lParam) ; 
} 
6. Đặt chế độ dịch là Project thứ hai phụ thuôc̣ (dependencies) vào Project 
thƣ́ nhất và thƣ muc̣ Output cùng taṃ của hai Project là ../Release. 
7. Dịch và chạy chƣơng trình. 
Ở đây chúng ta có hai phiên bản của một hàm trong thƣ viện liên kết động đƣợc sử 
dụng, điều này cho phép dùng các hàm có hỗ trợ Unicode trong trƣờng hợp hệ thống có hỗ trợ 
và ngƣợc lại sử dụng một hàm không có Unicode , thƣờng tên của hàm se ̃có thêm chƣ̃ W nếu 
có hỗ trợ Unicode và A nếu không. 
Đồng thời chúng ta cũng t hấy trong ma ̃của thƣ viêṇ có môṭ hàm DllMain , hàm này có 
vai trò tƣơng tƣ ̣nhƣ hàm WinMain trong môṭ chƣơng trình . Tác dụng của hàm DllMain là 
khởi taọ và thu hồi bô ̣nhớ và nhƣ̃ng thƣ́ liên quan khác , chúng ta sẽ bàn tới vấn đề này ở cuối 
chƣơng, hiêṇ taị chỉ cần return TRUE là ổn. 
Điều bí ẩn còn laị có le ̃là ở điṇh danh EXPORT . Các hàm trong một thƣ viện liên kết 
đôṇg đƣơc̣ sƣ̉ duṇg bởi các ƣ́ng duṇg khác phải đƣơc̣ xuất khẩu . Điều này không liên quan tới 
các vấn đề thƣơng mại thông thƣờng mà chỉ là một chỉ thị đảm bảo trình biên dịch sẽ thêm tên 
hàm vào thƣ viện import simpledll .lib để trình liên kết có thể đƣa các thông tin phù hơp̣ vào 
chƣơng trình (file *.exe) để có thể nạp các thƣ viện dll khi chƣơng trình chạy . Điṇh danh 
EXPORT còn bao gồm chỉ điṇh lớp chƣ́a __declspec(dllexport) và một chỉ thị tiền xử lý if 
extern “C” để đề phòng trƣờng hơp̣ file header đƣơc̣ biên dic̣h theo kiểu C++. Điều này ngăn 
chăṇ trình biên dic̣h khỏi các lỗi trùng tên của các hàm C ++ và cho phép các thƣ viện liên kết 
đôṇg có thể đƣơc̣ sƣ̉ duṇg bởi cả các chƣơng trình C và C++. 
Điểm vào và điểm thoát của thƣ viêṇ (Entry and Exit Point) 
Hàm DllMain đƣợc gọi đến khi thƣ viện liên kết động lần đầu tiên đƣợc nạp vào bộ nhớ 
để thực hiện và khi nó kết thúc nhiệm vụ (bị loại khỏi bộ nhớ ). Tham số đầu tiên của hàm 
DllMain là handle tới instance của th ƣ viêṇ. Nếu nhƣ thƣ viêṇ có sƣ̉ duṇg các tài nguyên đòi 
hỏi một handle instance (chẳng haṇ nhƣ các hôp̣ thoaị ), chúng ta nên lƣu lại hInstance vào 
môṭ biến toàn cuc̣ . Tham số cuối cùng của hàm DllMain đƣơc̣ dƣ̃ trƣ ̣dành cho hê ̣t hống sƣ̉ 
dụng. 
Tham số fdwReason có thể là môṭ trong 4 giá trị chỉ ra tại sao Windows lại gọi tới hàm 
DllMain. Trong các muc̣ tiếp theo chúng ta nên nhớ rằng môṭ chƣơng trình đơn có thể đƣơc̣ 
Bài giảng môn học: Lâp̣ triǹh Windows 
82 
nạp nhiều lần và chạy đồng thời t rên Windows. Mỗi lần chƣơng trình đƣơc̣ nap̣ nó đƣơc̣ xem 
nhƣ là môṭ tiến trình (process) riêng rẽ. 
Giá trị của tham số fdwReason bằng DLL _PROCESS_ATTACH chỉ ra rằng thƣ viêṇ 
liên kết đôṇg đa ̃đƣơc̣ ánh xa ̣vào vùng điạ chỉ của mô ̣ t tiến trình . Đây là môṭ đầu mối cho 
phép thƣ viện thực hiện bất cứ khởi tạo nào đòi hỏi đƣợc phục vụ cho các yêu cầu tiếp theo 
của tiến trình. Các khởi tạo kiểu này có thể là cấp phát bộ nhớ chẳng hạn . Trong thời gian tiến 
trình đang chạy , DllMain đƣơc̣ goị với môṭ tham số DLL _PROCESS_ATTACH chỉ môṭ lần 
trong cả thời gian tồn taị của process đó . Bất cƣ́ môṭ tiến trình nào khác sƣ̉ duṇg cùng file 
DLL se ̃goị đến hàm DllMain với môṭ giá trị tham số DLL_PROCESS_ATTACH. 
Nếu nhƣ viêc̣ khởi taọ là thành công DllMain se ̃trả về môṭ giá tri ̣ khác 0, giá trị trả về là 
0 sẽ làm cho Windows không chạy chƣơng trình. 
Nếu giá tri ̣ của fdwReason bằng DLL _PROCESS_DETACH thì có nghĩa là chƣơng 
trình không cần file DLL nữa , và đây là một cơ hội để thƣ viện thực hiện các công việc dọn 
dẹp của nó . Trên các hê ̣điều hành 32 bit của Windows điều này không thƣc̣ sƣ ̣cần thiết 
nhƣng là môṭ thói quen lâp̣ trình tốt. 
Tƣơng tƣ ̣khi hàm DllMain đƣơc̣ goị với môṭ giá tri ̣ tham số là 
DLL_THREAD_ATTACH thì có nghiã là môṭ tiến trình sƣ̉ duṇg thƣ viêṇ đa ̃taọ ra môṭ luồng 
(thread) mới. Khi luồng kết thúc Windows laị goị tới hàm DllMain với tham số là 
DLL_THREAD_DETACH. Cũng có thể xảy ra trƣờng hợp Windows thực hiện lời gọi tới 
hàm DllMain với giá trị của tham số fdwReason bằng DLL _THREAD_DETACH mà không 
thƣc̣ hiêṇ lời goị với giá tri ̣ DLL _THREAD_ATTACH trƣớc đó nếu nhƣ thƣ viêṇ liên kết 
đôṇg đƣơc̣ gắn với môṭ tiến trình sau khi luồng đa ̃đƣơc̣ taọ ra. 
Luồng vâñ tồn taị khi hàm DllMain đƣơc̣ goị đến với tham số 
DLL_THREAD_DETACH. Nó thậm chí có thể gửi các thông điệp trong tiến trì nh. Nhƣng 
các luồng không nên sử dụng hàm PostMessage () vì luồng có thể kết thúc trƣớc khi thông 
điêp̣ đến đích. 
Chƣơng trình để test thƣ viêṇ liên kết đôṇg là môṭ chƣơng trình đơn giản và là môṭ 
Project khác (thuôc̣ loaị Win 32 Application). Chúng ta có thể để các file của 2 Project vào 
cùng một thƣ mục hoặc riêng rẽ trong 2 thƣ muc̣. 
Trong quá trình dic̣h chƣơng trình file simpledll .dll và simpledll .lib se ̃đƣơc̣ sinh ra 
trƣớc, file simpledll .lib se ̃đƣơc̣ tƣ ̣ đôṇg liên kết với chƣơng trình thƣ̉ nghiêṃ và file 
simpledll.dll se ̃đƣơc̣ nap̣ vào bô ̣nhớ khi chƣơng trình chaỵ . Cần chú ý là chƣơng trình 
usedll.exe không chƣ́a ma ̃của hàm sƣ̉ duṇg trong thƣ viêṇ , mã của hàm chỉ đƣợc nạp vào b ộ 
nhớ khi chƣơng trình chaỵ. 
Viêc̣ include file simpledll .h cũng giống nhƣ chúng ta include file windows .h, liên kết 
với file simpledll .lib cũng tƣơng tƣ ̣nhƣ liên kết với file user 32.lib và liên kết với file 
simpledll.dll cũng giống nhƣ chƣơng trình liên kết với file user32.dll. 
Măc̣ dù chúng ta xếp môṭ file DLL là môṭ mở rôṇg của Windows nhƣng nó cũng là môṭ 
mở rôṇg của chƣơng trình ƣ́ng duṇg của chúng ta . Tất cả nhƣ̃ng gì file DLL thƣc̣ hiêṇ đều là 
thay măṭ cho ƣ́ng duṇg sƣ̉ duṇg nó . Chẳng haṇ tất cả các thao tác cấp phát bô ̣nhớ đƣơc̣ kiểm 
soát bởi chƣơng trình . Bất cƣ́ cƣ̉a sổ nào nó taọ ra đều sở hƣ̃u bởi chƣơng trình và bất cƣ́ file 
nào đƣợc mở cũng đƣợc kiểm soát bởi ch ƣơng trình. Nhiều chƣơng trình có thể sƣ̉ duṇg cùng 
Bài giảng môn học: Lâp̣ triǹh Windows 
83 
môṭ file dll đồng thời , nhƣng Windows se ̃đóng vai trò lá chắn để ngăn chăṇ các can thiêp̣ lâñ 
nhau giƣ̃a các ƣ́ng duṇg này. 
Nhiều tiến trình có thể chia sẻ cùng môṭ môṭ đoaṇ ma ̃trong môṭ thƣ viêṇ liên kết đôṇg . 
Tuy nhiên dƣ́ liêụ đƣơc̣ sƣ̉ đuṇg bởi môṭ thƣ viêṇ DLL se ̃là khác nhau với các tiến trình khác 
nhau. Mỗi tiến trình có môṭ không gian điạ chỉ dƣ̃ liêụ của riêng nó để chƣ́a các dƣ̃ li ệu có thể 
sƣ̉ duṇg đến bởi file DLL . Chia sẻ bô ̣nhớ giƣ̃a các tiến trình đòi hỏi môṭ số kỹ thuâṭ khác mà 
chúng ta sẽ bàn tới trong phần tiếp theo. 
7.4. Chia sẻ bô ̣nhớ giƣ̃a các thƣ viêṇ liên kết đôṇg 
Windows cô lâp̣ các ƣ́ ng duṇg sƣ̉ duṇg cùng môṭ thƣ viêṇ liên kết đôṇg đồng thời . Tuy 
nhiên đôi khi đây không phải là môṭ lƣạ choṇ thích hơp̣ . Chúng ta có thể muốn viết một thƣ 
viêṇ DLL chƣ́a môṭ vùng nhớ nào đó có thể đƣơc̣ chia sẻ bởi nhiều ƣ́n g duṇg, hoăc̣ giƣ̃a các 
instance của cùng môṭ ƣ́ng duṇg. Điều này liên quan tới viê ̣sƣ̉ duṇg bô ̣nhớ chia sẻ , hay chính 
xác là một file ánh xạ bộ nhớ (memory-mapped file). 
Chúng ta sẽ khảo sát một chƣơng trình có tên là strprog (String Program ) và thƣ viện 
đƣơc̣ sƣ̉ duṇg là strlib (string library). Strlib chƣ́a 3 hàm mà strprog có thể gọi tới . Và một 
trong số các hàm của strlib se ̃sƣ̉ duṇg môṭ hàm call-back đƣơc̣ điṇh nghiã trong strprog. 
Strlib là môṭ thƣ viêṇ liên kết đôṇg chƣ́a và làm viêc̣ với môṭ xâu tối đa 256 ký tự. Xâu 
đƣơc̣ chuyển thành daṇg ký tƣ ̣hoa và kiểm soát trong vùng bô ̣nhớ chia sẻ của strlib . Strprog 
có thể sử dụng 3 hàm của thƣ viện Strlib để cộng , xóa và nhâṇ đƣơc̣ tất cả các xâu hiêṇ taị tƣ̀ 
strlib. Chƣơng trình strprog có hai muc̣ menu để lƣạ choṇ là Enter và Delete cho phép ngƣời 
dùng nhập các xâu để thực hiện việc cộng và xóa các xâu . Strprog se ̃in ra giá tri ̣ tất cả cá c 
xâu hiêṇ đang nằm chƣ́a trong thƣ viêṇ. 
Các hàm đƣợc định nghĩa trong thƣ viện Strlib gồm có: 
EXPORT BOOL CALLBACK AddString (pStringIn) 
EXPORT BOOL CALLBACK DeleteString (pStringIn) 
EXPORT int CALLBACK GetStrings (pfnGetStrCallBack, pParam) 
Hàm thứ nhất sẽ chuyển các xâu thành dạng ký tự hoa và thêm vào danh sách các xâu 
của thƣ viện. Giá trị trả về của hàm là TRUE (khác 0) nếu nhƣ thành công và FALSE (0) nếu 
nhƣ xảy ra lỗi : hoăc̣ xâu có đô ̣dài bằng 0 hoăc̣ không cấp phát đƣơc̣ bô ̣nhớ hoăc̣ đa ̃sƣ̉ duṇg 
hết 256 xâu của bô ̣nhớ. 
Hàm thứ hai sẽ thực hiện xóa bỏ một xâu khỏi danh sách các xâu của thƣ viện nếu khớp 
và nếu có nhiều xâu khớp thì chỉ xâu đầu tiên bị xóa . Kết quả trả về của hàm là TRUE nếu 
xóa bỏ thành công và FALSE nếu xâu cần xóa có độ dài bằng 0 hoăc̣ không tìm thấy. 
Hàm thứ ba là hàm sử dụng để liệt kê các xâu đang có trong thƣ viện , hàm này sử dụng 
môṭ tham số là môṭ hàm cal l-back chƣ́a trong chƣơng trình sƣ̉ duṇg hàm . Hàm này phải đƣợc 
điṇh nghiã trong chƣơng trình sƣ̉ duṇg thƣ viêṇ nhƣ sau: 
EXPORT BOOL CALLBACK GetStrCallBack (PSTR pString, PVOID pParam) 
Tham số pfnGetStrCallBack của hàm GetString chỉ tới m ột hàm call-back. GetString có 
thể goị tới hàm GetStrCallBack mỗi lần cho mỗi giá tri ̣ của môṭ xâu cho tới khi hàm này trả 
về FALSE. GetString se ̃trả về số lƣơṇg các xâu đƣơc̣ truyền cho hàm call -back. Biến pParam 
sẽ là một con trỏ far tới dƣ̃ liêụ đƣơc̣ ngƣời dùng điṇh nghiã. 
Bài giảng môn học: Lâp̣ triǹh Windows 
84 
Tất nhiên ở đây chúng ta cũng sƣ̉ duṇg hai phiên bản cho mỗi hàm , ANSI và Unicode 
version. 
7.5. Các vấn đề khác về thƣ viện liên kết động 
Tôi đa ̃tƣ̀ng đề câp̣ trong phần đầu củ a chƣơng này là các thƣ viêṇ liên kết đôṇg không 
nhâṇ các thông điêp̣ . Tuy nhiên môṭ thƣ viêṇ liên kết đôṇg có thể goị tới hàm GetMessage và 
PeekMessage. Các thông điệp mà thƣ viện lấy về từ hàng đợi thông điệp qua các hàm nà y 
thƣc̣ sƣ ̣là các thông điêp̣ của các chƣơng trình goị tới các hàm của thƣ viêṇ . Nói chung thƣ 
viêṇ làm viêc̣ thay măc̣ cho chƣơng trình goị nó – môṭ qui luâṭ chi phối hầu hết các hàm của 
Windows mà môṭ thƣ viêṇ có thể goị tới. 
Môṭ thƣ viêṇ liên kết đôṇg có thể nap̣ các tài nguyên (chẳng haṇ nhƣ các biểu tƣơṇg 
chƣơng trình, các xâu và các ảnh bitmap) tƣ̀ file thƣ viêṇ hoăc̣ tƣ̀ các file của chƣơng trình goị 
tới thƣ viêṇ đó. Các hàm nạp tài nguyên đòi hỏi môṭ handle tới instance . Nếu nhƣ thƣ viêṇ sƣ̉ 
dụng handle tới instance của riêng nó (đƣơc̣ truyền cho thƣ viêṇ qua viêc̣ goị tới hàm DllMain 
để khởi tạo nó ) thì thƣ viện có thể nhận đƣợc các tài nguyên từ file riêng c ủa nó. Để nap̣ các 
tài nguyên từ chƣơng trình gọi tới các hàm của thƣ viện , đòi hỏi handle tới instance của 
chƣơng trình goị hàm. 
Viêc̣ khai báo các lớp cƣ̉a sổ chƣơng trình và taọ ra cƣ̉a sổ chƣơng trình trong môṭ thƣ 
viêṇ đ òi hỏi một số thủ thuật . Cả cấu trúc lớp cửa sổ và hàm CreateWindow hoặc 
CreateWindowEx đều đòi hỏi môṭ handle tới môṭ instance của chƣơng trình . Măc̣ dù chúng ta 
có thể sử dụng hande của thƣ viện trong việc tạo ra các lớ p cƣ̉a sổ và cƣ̉a sổ chƣơng trình , các 
thông điêp̣ cƣ̉a sổ vâñ đi qua hàng đơị thông điêp̣ của chƣơng trình goị tới thƣ viêṇ khi thƣ 
viêṇ taọ ra cƣ̉a sổ chƣơng trình . Nếu nhƣ baṇ cần phải taọ ra các lớp cƣ̉a sổ và các cƣ̉a sổ 
chƣơng trình trong môṭ thƣ viêṇ thì tốt nhất là nên sƣ̉ duṇg handle tới instance của chƣơng 
trình gọi tới hàm thƣ viện. 
Vì các thông điệp cho các hộp thoại modal đƣợc nhận bên ngoài vòng lặp thông điệp 
của chƣơng trình nên chún g ta có thể taọ ra môṭ hôp̣ thoaị modal trong môṭ thƣ viêṇ bằng 
cách gọi tới hàm DialogBox . Handle tới instance có thể là của thƣ viêṇ hoăc̣ tham số 
hwndParent của hàm DialogBox có thể đăṭ bằng NULL . 
Các thƣ viện không có import 
Thay vì để Windows thƣc̣ hiêṇ viêc̣ liên kết đôṇg khi chƣơng trình lần đầu tiên đƣơc̣ 
nạp vào bộ nhớ chúng ta có thể liên kết một chƣơng trình với một thƣ viện khi chƣơng trình 
đang chaỵ. 
Chẳng haṇ chúng ta muốn goị tới hàm Rectangle nhƣ sau: 
Rectangle (hdc, xLeft, yTop, xRight, yBottom) ; 
Điều này se ̃làm cho chƣơng trình đƣơc̣ liên kết tới thƣ viêṇ gdi 32.lib khi biên dic̣h để 
lấy điạ chỉ của hàm Rectangle. Chúng ta có thể gọi tới hàm Rectangle theo một cách khác: 
typedef BOOL (WINAPI * PFNRECT) (HDC, int, int, int, int) ; 
khai báo hai biến: 
HANDLE hLibrary ; 
PFNRECT pfnRectangle ; 
Tiếp đến goị tới các hàm LoadLibrary và GetProcAddress : 
Bài giảng môn học: Lâp̣ triǹh Windows 
85 
hLibrary = LoadLibrary (TEXT ("GDI32.DLL")) 
pfnRectangle = (PFNPRECT) GetProcAddress (hLibrary, TEXT ("Rectangle")) 
Và bây giờ có thể gọi tới hàm Rectangle: 
pfnRectangle (hdc, xLeft, yTop, xRight, yBottom) ; 
FreeLibrary (hLibrary) ; 
Măc̣ dù kỹ thuâṭ sƣ̉ duṇg thƣ viêṇ liên kết đôṇg theo kiểu này kh ông làm tăng hiêụ quả 
sƣ̉ duṇg của hàm Rectangle nhƣng nó laị là môṭ cách hiêụ quả trong trƣờng hơp̣ mà chúng ta 
không biết tên của thƣ viêṇ cho tới khi chƣơng trình chaỵ (chẳng haṇ đối với hàm AlphaBlend 
chẳng haṇ). 
Đoaṇ ma ̃ trên sƣ̉ duṇg hai hàm LoadLibrary và FreeLibrary . Windows kiểm soát các 
biến đếm tham chiếu tới tất cả các module thƣ viêṇ . Hàm LoadLibrary sẽ làm cho biến đếm 
tham chiếu tới các thƣ viêṇ đƣơc̣ nap̣ tăng lên 1. Biến đếm tham chiếu cũng đƣợc tăng lên khi 
Windows nap̣ môṭ chƣơng trình có sƣ̉ duṇg thƣ viêṇ . FreeLibarary se ̃làm cho biến đếm này 
giảm đi 1, trƣờng hơp̣ môṭ instance của môṭ chƣơng trình sƣ̉ duṇg thƣ viêṇ bi ̣ loaị khỏi bô ̣nhớ 
biến đếm tham chiếu cũng giảm đi 1 đơn vi.̣ Khi biến đếm tham chiếu này bằng 0 Windows se ̃
loại bỏ thƣ viện khỏi bộ nhớ vì lúc đó thƣ viện không còn cần thiết nữa. 
Các thƣ viện chỉ chứa tài nguyên 
Bất cƣ́ hàm này trong môṭ thƣ viêṇ liên kết đô ̣ng mà môṭ chƣơng trình trên Windows và 
các thƣ viện khác có thể gọi tới đều phải đƣợc export . Tuy nhiên môṭ thƣ viêṇ liên kết đôṇg 
có thể không nhất thiết phải chứa bất cứ một hàm export nào . Vâỵ các thƣ viêṇ đó chƣ́a gì ? 
Câu trả lời là các tài nguyên. 
Chẳng haṇ chúng ta làm viêc̣ trên môṭ ƣ́ng duṇg Windows cần môṭ số các ảnh bitmap . 
Thông thƣờng chúng ta se ̃liêṭ kê các ảnh này trong file kic̣h bản tài nguyên và nap̣ chúng vào 
bô ̣nhớ với hàm LoadBitmap. Nhƣng có le ̃chúng ta muốn có môṭ số tâp̣ ảnh , mỗi tâp̣ cho môṭ 
đô ̣phân giải của màn hình hình thƣờng đƣơc̣ sƣ̉ duṇg với Windows . Giải pháp khả dĩ nhất là 
chƣ́a các tâp̣ ảnh khác nhau này vào các file khác nhau vì môṭ ngƣời dùng chỉ cần tới môṭ tâp̣ 
các ảnh này trên đĩa cứng. Và các file này đƣợc gọi là các file thƣ viện chỉ chứa tài nguyên . 
Hình 21-5 cho chúng ta thấy cách thƣ́c taọ ra môṭ thƣ viêṇ chỉ chƣ́a tài nguyên đƣơc̣ goị 
là bitlib.dll chƣ́a 9 ảnh bitmap. File bitlib.rc chƣ́a tất cả các ảnh này và gán cho mỗi ảnh môṭ 
số. Để taọ ra file bitlib .dll chúng ta cần có 9 ảnh có tên lần lƣợt là bitmap 1.bmp, 
bitmap2.bmp, , bitmap9.bmp. Chúng ta có thể sử d ụng các ảnh đi kèm với đĩa CD của 
quyển sách để dùng. 
Bài tập: 
Bài tập 1: Viết thƣ viện DLL chứa các hàm xử lý xâu. 
Bài giảng môn học: Lâp̣ triǹh Windows 
86 
Tài liệu tham khảo 
[1] Lê Hƣ̃u Đaṭ. Lâp̣ trình Windows. NXB Giáo duc̣. 
[2] Charles Petzold. Programming Windows, fifth edition. Microsoft Press. 1998. 
[3] Johnson M. Hart. Windows System Programming Third Edition. Addison Wesley 
Professional. 2004. 
Bài giảng môn học: Lâp̣ triǹh Windows 
87 
Đề thi tham khảo 
Đề số 1: 
Bài số 1 
Cho Dialog sau: 
Biết rằng các ID của các control của Dialog trên nhƣ sau : các ID của các Edit Text tƣơng ứng 
với các Static Text Canh a , Canh b , Canh c lần lƣơṭ là : ID_CANHA, ID_CANHB, 
ID_CANHC, ID của Static 1 là ID_KQKT, ID của Static 2 là ID_DTCV, ID của các Button 
Kiem tra và Thoat là ID _KIEMTRA, ID_THOAT. Hãy viết hàm xử lý cho Dialog trên sau 
cho khi nhấn vào nút Kiem tra thì chƣơng trình se ̃kiểm tra xem ba số nguyên đƣơc̣ nhâp̣ và 3 
Edit text tƣơng ƣ́ng có là 3 cạnh của 1 tam giác hay không , kết quả kiểm tra đƣơc̣ thông báo 
qua Static 1. Trong trƣờng hơp̣ là 3 cạnh của 1 tam giác haỹ tính và hiển thi ̣ chu vi , diêṇ tích 
của tam giác qua Static 2 và khi ngƣời dùng nhấn vào nút Thoat sẽ kết thúc Dialog. 
Bài số 2 
a) Hãy trình bày (đƣa ra ) dạng đơn giản nhất của một hàm xử lý thông điệp cửa sổ 
chƣơnh trình (hàm Window Proc). 
b) Giả sử chƣơng trình chỉ có một mục menu Help , trong đó có 2 mục menu con là 
Contents và About , hãy viết hàm xử lý thôn g điêp̣ cƣ̉a sổ chƣơng trình sao cho khi 
ngƣời dùng choṇ các muc̣ trong menu Help chƣơng trình se ̃hiển thi ̣ các thông báo 
(hàm Message Box) tƣơng ƣ́ng và khi ngƣời dùng nhấn chuôṭ trái vào 1 vị trí trên màn 
hình, hãy in ra một thông báo về toạ đô ̣chuôṭ taị vi ̣ trí đó (hàm TextOut). 
Đề số 2: 
Bài số 1 
Viết hàm xƣ̉ lý hôp̣ thoaị sau: 
Bài giảng môn học: Lâp̣ triǹh Windows 
88 
 Các điều khiển XA , YA, XB, YB, XC, YC là toạ đô ̣ 3 đỉnh trên măṭ phẳng toạ đô ̣
(nguyên). Khi nhấn nút “Tinh chu vi” haỹ tính chu vi của tam giác tạo thành bởi 3 đỉnh A, B, 
C và hiển thi ̣ lên IDC _KQ. Nhấn “Thoat” để thóat khỏi hôp̣ thoaị và nhấn “Tinh dien tich” se ̃
tính diện tích và hiển thị nhƣ trong phần tính chu vi 
Bài số 2 
a) Hãy trình bày (đƣa ra) dạng đơn giản nhất của một hàm xử lý thông điệp cửa sổ ch o 
môṭ hôp̣ thoaị. 
b) Hãy viết hàm WndProc cho một chƣơng trình có hệ thống menu gồm 1 mục File , 
trong đó có các muc̣ con với các chƣ́c năng sau : Menu1, Menu2, khi ngƣời dùng nhấn 
vào các mục này chỉ cần đƣa ra thông báo đơn giản , mục Exit để thoát khỏi chƣơng 
trình. 
Đề số 3: 
Bài số 1 
Viết hàm xƣ̉ lý hôp̣ thoaị sau: 
 Các điều khiển XA , YA, XB, YB, XC, YC là toạ đô ̣ 3 đỉnh trên măṭ phẳng tọa độ 
(nguyên). Khi nhấn nút “Tinh chu vi” haỹ tính chu vi của tam giác taọ thành bởi 3 đỉnh A, B, 
C và hiển thi ̣ lên IDC _KQ. Nhấn “Thoat” để thóat khỏi hôp̣ thoaị và nhấn “Tinh dien tich” se ̃
tính diện tích và hiển thị nhƣ trong phần tính chu vi 
Bài giảng môn học: Lâp̣ triǹh Windows 
89 
Bài số 2 
a) Hãy trình bày (đƣa ra) dạng đơn giản nhất của một hàm xử lý thông điệp cửa sổ ch o 
môṭ hôp̣ thoaị. 
b) Hãy viết hàm WndProc cho một chƣơng trình có hệ thống menu gồm 1 mục File , 
trong đó có các mu c̣ con với các chƣ́c năng sau : Menu1, Menu2, khi ngƣời dùng nhấn 
vào các mục này chỉ cần đƣa ra thông báo đơn giản , mục Exit để thoát khỏi chƣơng 
trình. 

File đính kèm:

  • pdfbai_giang_lap_trinh_windows.pdf