Thứ Hai, 20 tháng 1, 2014

Lập trình C trên Windows

NGÔN NGỮ LẬP TRÌNH LẬP TRÌNH C TRÊN WINDOWS
Trang 5
Trong Windows 98, thư viện liên kết ñộng chứa khoảng vài ngàn hàm, mỗi hàm có tên
ñặc tả, ví dụ CreateWindow, hàm này dùng ñể tạo một cửa sổ cho ứng dụng. Khi sử dụng các
hàm mà Windows cung cấp cho thì các ứng dụng phải khai báo trong các tập tin tiêu ñề .h hay
.hpp (header file).
Trong một chương trình Windows, có sự khác biệt khi ta gọi một hàm của thư viện C và
một hàm của Windows hay thư viện liên kết ñộng cung cấp. ðó là khi biên dịch mã máy, các
hàm thư viện C sẽ ñược liên kết thành mã chương trình. Trong khi các hàm Windows sẽ ñược
gọi khi chương trình cần dùng ñến chứ không liên kết vào chương trình. ðể thực hiện ñược các
lời gọi này thì một chương trình Windows *.EXE luôn chứa một tham chiếu ñến thư viện liên kết
ñộng khác mà nó cần dùng. Khi ñó, một chương trình Windows ñược nạp vào bộ nhớ sẽ tạo con
trỏ tham chiếu ñến những hàm thư viện DLL mà chương trình dùng, nếu thư viện này chưa ñược
nạp vào bộ nhớ trước ñó thì bây giờ sẽ ñược nạp.
1.3. LẬP TRÌNH TRÊN MICROSOFT WINDOWS
1.3.1. ðặc ñiểm chung
Windows là hệ ñiều hành ñồ họa trực quan, do dó các tài nguyên của hệ thống cung cấp
rất ña dạng ñòi hỏi người lập trình phải nghiên cứu rất nhiều ñể phát hay hết sức mạnh của hệ
ñiều hành.
Theo như những mục ñích tiếp cận của các nhà lập trình thì các ứng dụng trên Windows
phải hết sức thân thiện với người dùng thông qua giao diện ñồ họa sẵn có của Windows. Về lý
thuyết thì một người dùng làm việc ñược với một ứng dụng của Windows thì có thể làm việc
ñược với những ứng dụng khác. Nhưng trong thực tế ñể sử dụng một ứng dụng cho ñạt hiệu quả
cao trong Windows thì cần phải có một số huấn luyện trợ giúp hay tối thiểu thì phải cho biết
chương trình ứng dụng làm việc như thế nào.
ða số các ứng dụng trong Windows ñều có chung một giao diện tương tác với người
dùng giống nhau. Ví dụ như các ứng dụng trong Windows ña số ñều có thanh thực ñơn chứa các
mục như : File, Edit, Tool, Help… Và trong hộp thoại thì thường chứa các phần tử ñiều khiển
chung như : Edit Control, Button Control, Checkbox….
1.3.2. Sự khác biệt với lập trình trên MS-DOS
Khi mới bước vào lập trình trên Windows ña số người học rất lạ lẫm, nhất là những
người ñã từng làm việc với MS-DOS. Do MS-DOS là hệ ñiều hành ñơn nhiệm và giao tiếp qua
giao diện console. Nên khi viết chương trình không phức tạp.
Còn ñối với Windows người lập trình sẽ làm việc với bộ công cụ lập trình ñồ họa ña dạng
cùng với cách xử lý ña nhiệm, ña luồng của Windows. Vì vậy việc lập trình trên Windows sẽ
giúp cho người lập trình ñỡ nhàm chán với giao diện console của MS-DOS. Việc cố gắng phát
huy các sức mạnh tài nguyên của Windows sẽ làm cho những ứng dụng càng mạnh mẽ, ña dạng,
thân thiện, và dễ sử dụng.
1.3.3. Một số yêu cầu ñối với người lập trình
Tech24.vn
NGÔN NGỮ LẬP TRÌNH LẬP TRÌNH C TRÊN WINDOWS
Trang 6
ðiều trước tiên của người học lập trình C trên Windows là phải biết lập trình C, sách này
không có tham vọng hướng dẫn người học có thể thông thạo lập trình C trên Windows mà chưa
qua một lớp huấn luyện C nào. Tuy nhiên, không nhất thiết phải hoàn toàn thông thạo C mới học
ñược lập trình Windows.
ðể có thể lập trình trên nền Windows ngoài yêu cầu về việc sử dụng công cụ lập trình,
người học còn cần phải có căn bản về Windows, tối thiểu thì cũng ñã dùng qua một số ứng dụng
trong Windows. Thật sự yêu cầu này không quá khó khăn ñối với người học vì hiện tại hầu như
Windows quá quen thuộc với mọi người, những người mà ñã sử dụng máy tính.
Ngoài những yêu cầu trên, ñôi khi người lập trình trên Windows cũng cần có khiếu thẩm
mỹ, vì cách trình bày các hình ảnh, các ñiều khiển trên các hộp thoại tốt thì sẽ làm cho ứng dụng
càng tiện lợi, rõ ràng, và thân thiện với người dùng.
1.3.4. Bộ công cụ giao diện lập trình ứng dụng API
Hệ ñiều hành Windows cung cấp hàng trăm hàm ñể cho những ứng dụng có thể sử dụng
truy cập các tài nguyên trong hệ thống. Những hàm này ñược gọi là giao diện lập trình ứng dụng
API (Application Programming Interface). Những hàm trên ñược chứa trong các thư viện liên
kết ñộng DLL của hệ thống. Nhờ có cấu trúc ñộng này mọi ứng dụng ñều có thể truy cập ñến các
hàm ñó. Khi biên dịch chương trình, ñến ñoạn mã gọi hàm API thì chương trình dịch không thêm
mã hàm này vào mã thực thi mà chỉ thêm tên DLL chứa hàm và tên của chính hàm ñó. Do ñó mã
các hàm API thực tế không ñược sử dụng khi xây dựng chương trình, và nó chỉ ñược thêm vào
khi chương trình ñược nạp vào bộ nhớ ñể thực thi.
Trong API có một số hàm có chức năng duy trì sự ñộc lập thiết bị ñồ họa, và các hàm này
gọi là giao diện thiết bị ñồ họa GDI (Graphics Device Interface). Do sự ñộc lập thiết bị nên các
hàm GDI cho phép các ứng dụng có thể làm việc tốt với nhiều kiểu thiết bị ñồ họa khác nhau.
1.3.5. Cơ chế thông ñiệp
Không giống như các ứng dụng chạy trên MS-DOS, các ứng dụng Win32® thì xử lý theo
các sự kiện (event - driven), theo cơ chế này các ứng dụng khi ñược viết sẽ liên tục chờ cho hệ
ñiều hành truyền các dữ liệu nhập vào. Hệ thống sẽ ñảm nhiệm việc truyền tất cả các dữ liệu
nhập của ứng dụng vào các cửa sổ khác nhau của ứng dụng ñó. Mỗi một cửa sổ sẽ có riêng một
hàm gọi là hàm xử lý cửa sổ thường ñược ñặt tên là WndProc, hệ thống sẽ gọi hàm này khi có
bất cứ dữ liệu nhập nào ñược truyền ñến cửa sổ, hàm này sẽ xử lý các dữ liệu nhập ñó và trả
quyền ñiều khiển về cho hệ thống.
Hệ thống truyền các dữ liệu nhập vào thủ tục xử lý của cửa sổ thông qua một hình thức
gọi là thông ñiệp (message). Thông ñiệp này ñược phát sinh từ ứng dụng và hệ thống. Hệ thống
sẽ phát sinh một thông ñiệp khi có một sự kiện nhập vào (input even), ví dụ như khi người dùng
nhấn một phím, di chuyển thiết bị chuột, hay kích vào các ñiều khiển (control) như thanh
cuộn,… Ngoài ra hệ thống cũng phát sinh ra thông ñiệp ñể phản ứng lại một sự thay ñổi của hệ
thống do một ứng dụng mang ñến, ñiều này xảy ra khi ứng dụng làm cạn kiệt tài nguyên hay ứng
dụng tự thay ñổi kích thước của cửa sổ.
Tech24.vn
NGÔN NGỮ LẬP TRÌNH LẬP TRÌNH C TRÊN WINDOWS
Trang 7
Một ứng dụng có thể phát sinh ra thông ñiệp khi cần yêu cầu các cửa sổ của nó thực hiện
một nhiệm vụ nào ñó hay dùng ñể thông tin giữa các cửa sổ.
Hệ thống gởi thông ñiệp vào thủ tục xử lý cửa sổ với bốn tham số: ñịnh danh của cửa sổ,
ñịnh danh của thông ñiệp, và hai tham số còn lại ñược gọi là tham số của thông ñiệp (message
parameters). ðịnh danh của cửa sổ xác ñịnh cửa sổ mà thông ñiệp ñược chỉ ñịnh. Hệ thống sẽ
dùng ñịnh danh này ñể xác ñịnh cần phải gởi thông ñiệp ñến thủ tục xử lý của cửa sổ.
ðịnh danh thông ñiệp là một hằng số thể hiện mục ñích của thông ñiệp. Khi thủ tục xử lý
cửa sổ nhận thông ñiệp thì nó sẽ dùng ñịnh danh này ñể biết hình thức cần thực hiện. Ví dụ, khi
một thông ñiệp ñược truyền ñến thủ tục cửa sổ có ñịnh danh là WM_PAINT thì có ý nghĩa rằng
cửa sổ vùng làm việc thay ñổi và cần phải vẽ lại vùng này.
Tham số thông ñiệp lưu giá trị hay vị trí của dữ liệu, ñược dùng bởi thủ tục cửa sổ khi xử
lý thông ñiệp. Tham số này phụ thuộc vào loại thông ñiệp ñược truyền ñến, nó có thể là số
nguyên, một tập các bit dùng làm cờ hiệu, hay một con trỏ ñến một cấu trúc dữ liệu nào ñó,…
Khi một thông ñiệp không cần dùng ñến tham số thì hệ thống sẽ thiết lập các tham số này
có giá trị NULL. Một thủ tục cửa sổ phải kiểm tra xem với loại thông ñiệp nào cần dùng tham số
ñể quyết ñịnh cách sử dụng các tham số này.
Có hai loại thông ñiệp :
Thông ñiệp ñược ñịnh nghĩa bởi hệ thống (system-defined messages) :
Dạng thông ñiệp này ñược hệ thống ñịnh nghĩa cho các cửa sổ, các ñiều khiển, và các tài
nguyên khác trong hệ thống. Thường ñược bắt ñầu với các tiền tố sau : WM_xxx, LB_xxx,
CB_xxx,…
Thông ñiệp ñược ñịnh nghĩa bởi ứng dụng (application-defined message) :
Một ứng dụng có thể tạo riêng các thông ñiệp ñể sử dụng bởi những cửa sổ của nó hay
truyền thông tin giữa các cửa sổ trong ứng dụng.
Nếu một ứng dụng ñịnh nghĩa các thông ñiệp riêng thì thủ tục cửa sổ nhận ñược thông
ñiệp này phải cung cấp các hàm xử lý tương ứng.
ðối với thông ñiệp hệ thống, thì ñược cung cấp giá trị ñịnh danh từ 0x0000 ñến 0x03FF,
những ứng dụng không ñược ñịnh nghĩa thông ñiệp có giá trị trong khoảng này.
Thông ñiệp ñược ứng dụng ñịnh nghĩa có giá trị ñịnh danh từ 0x0400 ñến 0x7FFF.
Lộ trình của thông ñiệp từ lúc gởi ñi ñến lúc xử lý có hai dạng sau:
Thông ñiệp ñược gởi vào hàng ñợi thông ñiệp ñể chờ xử lý (queue message): bao gồm
các kiểu thông ñiệp ñược phát sinh từ bàn phím, chuột như thông ñiệp : WM_MOUSEMOVE,
WM_LBUTTONDOWN, WM_KEYDOWN, và WM_CHAR.
Tech24.vn
NGÔN NGỮ LẬP TRÌNH LẬP TRÌNH C TRÊN WINDOWS
Trang 8
Thông ñiệp ñược gởi trực tiếp ñến thủ tục xử lý không qua hàng ñợi (nonqueue message),
bao gồm các thông ñiệp thời gian, thông ñiệp vẽ, và thông ñiệp thoát như WM_TIMER,
WM_PAINT, và WM_QUIT.
Xử lý thông ñiệp : Một ứng dụng phải xóa và xử lý những thông ñiệp ñược gởi tới hàng
ñợi của ứng dụng ñó. ðối với một ứng dụng ñơn tiểu trình thì sử dụng một vòng lặp thông ñiệp
(message loop) trong hàm WinMain ñể nhận thông ñiệp từ hàng ñợi và gởi tới thủ tục xử lý cửa
sổ tương ứng. Với những ứng dụng nhiều tiểu trình thì mỗi một tiểu trình có tạo cửa sổ thì sẽ có
một vòng lặp thông ñiệp ñể xử lý thông ñiệp của những cửa sổ trong tiểu trình ñó.
1.4. CÁCH VIẾT MỘT ỨNG DỤNG TRÊN MICROSOFT WINDOWS
1.4.1. Các thành phần cơ bản tạo nên một ứng dụng
1.4.1.1. Cửa sổ
Trong một ứng dụng ñồ họa 32-bit, cửa sổ (window) là một vùng hình chữ nhật trên màn
hình, nơi mà ứng dụng có thể hiển thị thông tin ra và nhận thông tin vào từ người sử dụng. Do
vậy, nhiệm vụ ñầu tiên của một ứng dụng ñồ họa 32-bit là tạo một cửa sổ.
Một cửa sổ sẽ chia sẻ màn hình với các cửa sổ khác trong cùng một ứng dụng hay các
ứng dụng khác. Chỉ một cửa sổ trong một thời ñiểm nhận ñược thông tin nhập từ người dùng.
Người sử dụng có thể dùng bàn phím, thiết bị chuột hay các thiết bị nhập liệu khác ñể tương tác
với cửa sổ và ứng dụng.
Tất cả các cửa sổ ñều ñược tạo từ một cấu trúc ñược cung cấp sẵn gọi là lớp cửa sổ
(window class). Cấu trúc này là một tập mô tả các thuộc tính mà hệ thống dùng như khuôn mẫu
ñể tạo nên các cửa sổ. Mỗi một cửa sổ phải là thành viên của một lớp cửa sổ. Tất cả các lớp cửa
sổ này ñều ñược xử lý riêng biệt.
1.4.1.2. Hộp thoại và các ñiều khiển
Hộp thoại (Dialog) dùng ñể tương tác với người dùng trong một chương trình ứng dụng.
Một hộp thoại thường chứa nhiều các ñều khiển như ô nhập văn bản (edit text), nút bấm (button),
ghi chú (static control), hộp danh sách (list box)…
 Nút bấm (button): gồm có Push Button dùng kích hoạt một thao tác, Check Box
dùng ñể chọn một trong hai trạng thái (TRUE hay FALSE), Radio Button cũng giống như
Check Box nhưng một nhóm các Radio Button phải ñược chọn loại trừ nhau.
 Chú thích (static): dùng ñể chứa các ghi chú trong hộp thoại, ngoài ra nội dung
có thể thay ñổi trong quá trình sử dụng hộp thoại.
 Hộp liệt kê (list box): Chọn một hay nhiều dữ liệu ñược liệt kê trong danh sách,
nếu hộp chứa nhiều dòng và hộp không hiển thị hết các mẫu thông tin thì phải kèm theo một
thanh cuộn (scroll bar).
 Ô nhập văn bản (edit text): Dùng nhập văn bản, nếu ô có nhiều dòng thì thường
kèm theo thanh cuộn.
Tech24.vn
NGÔN NGỮ LẬP TRÌNH LẬP TRÌNH C TRÊN WINDOWS
Trang 9
 Thanh cuộn (scroll bar): ngoài việc dùng kèm với list box hay edit box thì thanh
cuộn còn có thể sử dụng ñộc lập nhằm tạo các thước ño…
 Thực ñơn (menu): là một danh sách chứa các thao tác với một ñịnh danh mà
người dùng có thể chọn. Hầu hết các ứng dụng có cửa sổ thì không thể thiếu thực ñơn.
 Thanh công cụ (toolbar): ñây là một dạng menu nhưng chỉ chứa các thao tác cần
thiết dưới dạng các biểu tượng ñặc trưng.
Ngoài ra còn rất nhiều các ñiều khiển mà các công cụ lập trình cung cấp cho người lập
trình hay tự họ tạo ra dựa trên những thành phần ñược cung cấp sẵn.
1.4.1.3. Ứng dụng ñiển hình trên Windows
1.4.1.4. Các kiểu tập tin ñể xây dựng một ứng dụng trên Windows
Chương trình nguồn
Tương tự như các chương trình C chuẩn, bao gồm các tập tin tiêu ñề (header) chứa trong
tập tin *.h, *.hpp. Còn mã nguồn (source code) chứa trong tập tin *.c hay *.cpp.
Tập tin ñịnh nghĩa
Tập tin này có phần mở rộng là *.def, dùng ñịnh nghĩa các ñiều khiển do chương trình
tạo ra khi viết ứng dụng tạo DLL, ngoài ra còn dùng ñể khai báo vùng nhớ heap khi chạy chương
trình. Lúc trước do vấn ñề tương thích với Windows 3.1 nên tập tin này thường ñược dùng, còn
ngày nay chúng ít ñược dùng ñến.
Các file chứa tài nguyên của ứng dụng
• Các file *.ico là các biểu tượng (icon) ñược dùng trong chương trình. Thông
thường các công cụ lập trình trên Windows ñều có các tool ñể tạo các ảnh này.
• Con trỏ chuột của ứng dụng có thể ñược vẽ lại dưới dạng các biểu tượng và lưu
trên ñĩa với dạng file *.cur.
• Các file dạng ảnh bitmap dùng ñể minh họa ñược lưu dạng file *.bmp.
• Tập tin tài nguyên *.rc là phần khai báo các tài nguyên như thực ñơn, hộp thoại,
và các ñịnh danh chỉ ñến các tập tin dạng *.ico, *.cur, *.bmp,
1.4.1.5. Các kiểu dữ liệu mới
Các kiểu dữ liệu trên Windows thường ñược ñịnh nghĩa nhờ toán tử typedef trong tập tin
windows.h hay các tập tin khác. Thông thường các tập tin ñịnh nghĩa này do Microsoft viết ra
hoặc các công ty viết trình biên dịch C tạo ra, nhất thiết nó phải tương thích với hệ ñiều hành
Windows 98, hay NT dựa trên kiến trúc 32-bit.
Một vài kiểu dữ liệu mới có tên viết tắt rất dễ hiểu như UINT là một dữ liệu thường ñược
dùng mà ñơn giản là kiểu unsigned int, trong Windows 9x kiểu này có kích thước là 32-bit. ðối
với kiểu chuỗi thì có kiểu PSTR kiểu này là một con trỏ ñến một chuỗi tương tự như char*.
Tech24.vn
NGÔN NGỮ LẬP TRÌNH LẬP TRÌNH C TRÊN WINDOWS
Trang 10
Tuy nhiên, cũng có một số kiểu ñược khái báo tên thiếu rõ ràng như WPARAM và
LPARAM. Tên này ñược ñặt vì có nguồn ngốc lịch sử sâu xa. Khi còn hệ ñiều hành Windows
16-bit thì tham số thứ 3 của hàm WndProc ñược khai báo là kiểu WORD, với kích thước 16-bit
, còn tham số thứ 4 có kiểu LONG là 32-bit. ðây là lý do người ta thêm tiến tố "W", "L" vào từ
"PARAM". Tuy nhiên, trong phiên bản Windows 32-bit, thì WPARAM ñược ñịnh nghĩa như là
UINT và LPARAM thì ñược ñịnh nghĩa như một kiểu LONG, do ñó cả hai tham số này ñều có
giá trị là 32-bit. ðiều này là một sự nhầm lẫn vì WORD vẫn là giá trị 16-bit trong Window 98.
Trong thủ tục xử lý cửa sổ WndProc giá trị trả về là kiểu LRESULT. Kiểu này ñơn giản
ñược ñịnh nghĩa như là kiểu LONG.
Ngoài ra, có một kiểu thường xuyên dùng là kiểu HANDLE là một số nguyên 32-bit
ñược sử dụng như một kiểu ñịnh danh. Có nhiều kiểu ñịnh danh nhưng nhất thiết tất cả phải có
cùng kích thước với HANDLE.
Bảng sau mô tả một số kiểu dữ liệu mới:
Kiểu Ý nghĩa
HANDLE Số nguyên 32-bit, ñịnh danh.
HWND Số nguyên 32-bit, ñịnh danh.
BYTE Giá trị 8-bit không dấu.
WORD Số nguyên 16-bit không dấu.
DWORD Số nguyên 32-bit không dấu.
UINT Số nguyên không dấu 32-bit.
LONG long 32-bit.
BOOL Bool.
LPSTR Con trỏ chuỗi.
LPCSTR Hằng con trỏ chuỗi.
WPARAM 32-bit.
LPARAM 32-bit.
BSTR Giá trị 32-bit trỏ ñến kí tự.
LPVOID Con trỏ 32-bit ñến một kiểu không xác ñịnh.
LPTSTR Giống như LPSTR nhưng có thể chuyển sang dạng Unicode
và DBCS.
Tech24.vn
NGÔN NGỮ LẬP TRÌNH LẬP TRÌNH C TRÊN WINDOWS
Trang 11
LPCTSTR Giống như LPCTSTR nhưng có thể chuyển sang dạng
Unicode và DBCS.
Bảng 1.1 Mô tả các kiểu dữ liệu mới
1.4.2. Khuôn mẫu chung tạo một ứng dụng
Một ứng dụng ñơn giản nhất của Windows bao gồm có hai hàm là WinMain và xử lý
cửa sổ WinProc. Do ñó hai hàm này là quan trọng và không thể thiếu trong các ứng dụng
Windows.
Hàm WinMain thực hiện các chức năng sau :
• ðịnh nghĩa lớp cửa sổ ứng dụng.
• ðăng ký lớp cửa sổ vừa ñịnh nghĩa.
• Tạo ra thể hiện cửa sổ của lớp ñã cho.
• Hiển thị cửa sổ.
• Khởi ñộng chu trình xử lý thông ñiệp.
Hàm xử lý WinProc có chức năng xử lý tất cả các thông ñiệp có liên quan ñến cửa sổ.

1.4.3. Hàm WinMain
Hàm chính của một ứng dụng chạy trên Windows là hàm WinMain, ñược khai báo như
sau:
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR
szCmdLine, int iCmdShow);
Chúng ta sẽ tìm hiểu một hàm WinMain mẫu sau ñây.
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR
szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT("HelloWin"); // tên ứng dụng
HWND hwnd;
MSG msg;
WNDCLASS wndclass; // biến ñể ñịnh nghĩa một cửa sổ
Tech24.vn
NGÔN NGỮ LẬP TRÌNH LẬP TRÌNH C TRÊN WINDOWS
Trang 12
/* ðịnh nghĩa kiểu cửa sổ */
wndclass.style = SC_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = WndProc; // Hàm thủ tục cửa sổ
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance; // ðịnh danh ứng dụng
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wndclass.hCursor = LoadCusor (NULL, IDC_ARROW);
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName = NULL; // Không có menu
wndclass.lpszClassName = szAppName; // tên ứng dụng
/* ðăng ký lớp cửa sổ */
if (!RegisterClass(&wndclass)) return 0;
/* Tạo lập cửa sổ */
hwnd = CreateWindow (szAppName, // Tên cửa sổ
"Hello Program", // Tiêu ñề
WS_OVERLAPPEDWINDOW, // Kiểu cửa sổ
CW_USEDEFAULT, // Tọa ñộ x
CW_USEDEFAULT, // Tọa ñộ y
CW_USEDEFAULT, // Chiều rộng
CW_USEDEFAULT, // Chiều dài
NULL, // Cửa sổ cha
NULL, // Không có menu
hInstacne, // ðịnh danh ứng dụng
Tech24.vn
NGÔN NGỮ LẬP TRÌNH LẬP TRÌNH C TRÊN WINDOWS
Trang 13
NULL); // Tham số bổ sung
/* Hiển thị cửa sổ */
ShowWindow (hwnd, iCmdShow);
UpdateWindow (hwnd);
/* Chu trình xử lý các thông ñiệp*/
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg);
DispatchMessage (&msg);
}
return msg.wParam;
}
ðịnh nghĩa một lớp cửa sổ :
ðầu tiên của viêc xây dựng một ứng dụng Windows là phải ñịnh nghĩa một lớp cửa sổ
cho ứng dụng. Windows cung cấp một cấu trúc WNDCLASS gọi là lớp cửa sổ, lớp này chứa
những thuộc tính tạo thành một cửa sổ.
typedef struct _WNDCLASS
{
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
HINSTANCE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
Tech24.vn
NGÔN NGỮ LẬP TRÌNH LẬP TRÌNH C TRÊN WINDOWS
Trang 14
LPCSTR lpszMenuName;
LPCSTR lpszClassName;
} WNDCLASS, *PWNDCLASS;
Ý nghĩa thuộc tính của cấu trúc WNDCLASS ñược mô tả trong bảng sau :
Thuộc tính Ý nghĩa ghi chú
style Kiểu lớp Kết hợp nhiều kiểu giá trị khác nhau
bằng toán tử OR.
lpfnWndProc Con trỏ ñến thủ tục window
cbClsExtra Số byte ñược cấp phát thêm sau
cấu trúc window-class
Mặc ñịnh
cbWndExtra Số byte ñược cấp phát thêm sau
một instance của window
Mặc ñịnh
hInstance ðịnh danh chứa thủ tục cửa sổ
của lớp window

hIcon ðịnh danh của biểu tượng Dùng hàm LoadIcon
hCursor ðịnh danh của con trỏ chuột Dùng hàm LoadCursor
hbrBackground ðịnh danh của chổi tô nền Dùng hàm GetStockObject
lpszMenuName Tên thực ñơn Tên thực ñơn gắn với cửa sổ, thực dơn
này ñược khai báo trong tập tin tài
nguyên.
lpszClassName Tên lớp
Bảng 1.2 Mô tả thuộc tính của lớp cửa sổ
ðăng ký lớp cửa sổ :
Sau khi ñịnh nghĩa một lớp cửa sổ, phải ñăng ký lớp cửa sổ ñó bằng hàm RegisterClass :
ATOM RegisterClass( CONST WNDCLASS * lpWndClass );
Tạo cửa sổ :
Tech24.vn

Không có nhận xét nào:

Đăng nhận xét