NGÔN NGỮ LẬP TRÌNH LẬP TRÌNH C TRÊN WINDOWS
Trang 2
Chương 1
TỔNG QUAN LẬP TRÌNH C TRÊN WINDOWS
1.1. MỞ ðẦU
ðể lập trình trên Microsoft Windows®, chúng ta cần nắm ñược các ñặc ñiểm cơ bản nhất
của hệ ñiều hành này. Chương này sẽ giới thiệu khái quát các ñặc ñiểm hệ ñiều hành Microsoft
Windows, các vấn ñề liên quan ñến lập trình bằng ngôn ngữ C, ñồng thời ñưa ra một chương
trình mẫu làm sườn cho các chương trình ñược viết sau này.
Trong phần ñầu, chúng ta tìm hiểu sơ lược lịch sử phát triển của hệ ñiều hành Microsoft
Windows® và những ñặc ñiểm nền tảng của Windows.
Phần tiếp theo sẽ trình bày những khái niệm và yêu cầu căn bản của việc lập trình C trên
Windows. Ngoài ra, phần này cũng giới thiệu các cơ chế và các công cụ mà hệ ñiều hành cung
cấp cho người lập trình hay người phát triển các ứng dụng trên Windows.
Cuối chương là phần xây dựng một chương trình ñơn giản nhất trên Windows. Chương
trình này ñược xem như là khuôn mẫu của một chương trình ứng dụng ñiển hình, và hầu hết các
ñoạn chương trình ñược viết minh họa trong sách ñều lấy chương trình này làm khung sườn ñể
phát triển cho phù hợp với từng yêu cầu. Thêm vào ñó, một số kiểu dữ liệu mới ñược ñịnh nghĩa
trên Windows và những qui ước về cách ñặt tên biến cũng ñược giới thiệu trong phần này.
Phần chi tiết và chuyên sâu hơn của việc lập trình bằng ngôn ngữ C trên môi trường
Windows sẽ ñược trình bày trong các chương tiếp theo.
1.2. HỆ ðIỀU HÀNH MICROSOFT WINDOWS
1.2.1. Giới thiệu
Giữa thập niên 80, công ty phần mềm máy tính Microsoft công bố phiên bản ñầu tiên của
dòng hệ ñiều hành Windows là Microsoft Windows® 1.0. ðây là hệ ñiều hành dùng giao diện
ñồ họa khác với giao diện ký tự (text hay console) của MS-DOS. Tuy nhiên phải ñến phiên bản
thứ hai (Windows 2.0 - tháng 11 năm 1987) thì mới có bước cải tiến ñáng kể, ñó là sự mở rộng
giao tiếp giữa bàn phím và thiết bị chuột và giao diện ñồ họa (GUI-Graphic User Interface) như
trình ñơn (menu) và hộp thoại (dialog). Trong phiên bản này Windows chỉ yêu cầu bộ vi xử lý
Intel 8086 hay 8088 chạy ở real-mode ñể truy xuất 1 megabyte bộ nhớ.
Tháng 5 năm 1990, Microsoft công bố phiên bản tiếp theo là Windows 3.0. Sự thay ñổi
Windows không ñơn ñiệu như MS-DOS (hay một số hệ ñiều hành giao diện console) mà
màn hình ñược sử dụng chỉ ñể thể hiện chuỗi ký tự, do người dùng gõ từ bàn phím (keyboard)
hay ñể xuất thông tin dạng văn bản. Trong giao diện người dùng ñồ họa, màn hình giao tiếp với
người sử dụng ña dạng hơn, người dùng có thể nhập dữ liệu thông qua chuột bằng cách nhấn vào
các nút nhấn (button) các hôp chọn (combo box)…thiết bị bây giờ ñược nhập, có thể là bàn phím
và thiết bị chuột (mouse device). Thiết bị chuột là một thiết bị ñịnh vị trên màn hình, sử dụng
thiết bị chuột người dùng có thể nhập dữ liệu một cách trực quan bằng cách kích hoạt một nút
lệnh, hay làm việc với các ñối tượng ñồ họa liên quan ñến tọa ñộ trên màn hình.
ðể giao tiếp trong môi trường ñồ họa, Windows ñưa ra một số các thành phần gọi là các
ñiều khiển chung (common control), các ñiều khiển chung là các ñối tượng ñược ñưa vào trong
hộp thoại ñể giao tiếp với người dùng. Bao gồm : hộp văn bản (text box), nút nhấn (button), nút
chọn (check box), hộp danh sách (list box), hộp chọn (combo box)…
Thật ra một ứng dụng trên Windows không phải là quá phức tạp vì chúng có hình thức
chung. Chương trình ứng dụng thuờng chiếm một phạm vi hình chữ nhật trên màn hình gọi là
một cửa sổ. Trên cùng của mỗi cửa sổ là thanh tiêu ñề (title bar). Các chức năng của chương
trình thì ñược liệt kê trong thực ñơn lựa chọn của chương trình (menu) , hay xuất hiện dưới dạng
trực quan hơn là các thanh công cụ (toolbar). Các thanh công cụ này chứa các chức năng ñược
sử dụng thường xuyên trong thực ñơn ñể giảm thời gian cho người dùng phải mở thực ñơn và
Tech24.vn
NGÔN NGỮ LẬP TRÌNH LẬP TRÌNH C TRÊN WINDOWS
Trang 4
chọn. Thông thường khi cần lấy thông tin hay cung cấp thông tin cho người dùng thì một ứng
dụng sẽ ñưa ra một hộp thoại, trong hộp thoại này sẽ chứa các ñiều khiển chung ñể giao tiếp với
người dùng. Windows cũng ra tạo một số các hộp thoại chuẩn như Open Files, và một số hộp
thoại tương tự như nhau.
Windows là một hệ ñiều hành ña nhiệm, tùy thuộc vào bộ nhớ mà ta có thể chạy nhiều
ứng dụng cùng một lúc, và cũng có thể ñồng thời chuyển qua lại giữa các ứng dụng và thực thi
chúng. Trong các phiên bản của Windows® 98 và NT® trở về sau, các chương trình ứng dụng tự
bản thân chúng chia thành nhiều tiểu trình (thread) ñể xử lý và với tốc ñộ xử lý nhanh tạo cảm
giác những chương trình ứng dụng này chạy ñồng thời với nhau.
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
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ý
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.
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.