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...
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:
- bai_giang_lap_trinh_windows.pdf