TỔNG QUAN LẬP TRÌNH C TRÊN WINDOWS
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.
HỆ ĐIỀU HÀNH MICROSOFT WINDOWS
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
mội trường mạng và giao diện đẹp.
Đặc điểm chung của hệ điều hành Microsoft Windows
Windows là một hệ điều hành sử dụng giao tiếp người dùng đồ họa (GUI),
hay còn gọi là hệ điều hành trực quan (Visual interface). GUI sử dụng đồ
họa dựa trên màn hình ảnh nhị phân (Bitmapped video display). Do đó tận
dụng được tài nguyên thực của màn hình, và cung cấp một môi trường giàu
tính trực quan và sinh động.
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à chọn. Thông thường khi cần lấy thông tin
phần mở rộng là *.DLL hay *.EXE, hầu hết được chứa trong thư mục
\Windows\System, \Windows\system32 của Windows® 98 và các thư mục
\WinNT\System, \WinNT\System32 của Windows® NT®.
Trong các phiên bản sau này, hệ thống liên kết động được tạo ra rất nhiều,
tuy nhiên, hầu hết các hàm được gọi trong thư viện này phân thành 3 đơn vị
sau: Kernel, User, và GDI.
Kernel cung cấp các hàm và thủ tục mà một hạt nhân hệ điều hành truyền
thống quản lý, như quản lý bộ nhớ, xuất nhập tập tin và tác vụ. Thư viện này
được cài đặt trong tập tin KRNL386.EXE 16 bit và KERNEL32.DLL 32
bit.
User quản lý giao diện người dùng, cài đặt tất cả khung cửa sổ ở mức luận
lý. Thư viện User được cài đặt trong tập tin USER.EXE 16 bit và
USER32.DLL 32 bit.
GDI cung cấp toàn bộ giao diện thiết bị đồ hoạ (Graphics Device Interface),
cho phép chương trình ứng dụng hiển thị văn bản và đồ hoạ trên các thiết bị
xuất phần cứng như màn hình và máy in.
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.
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.
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.
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®
đượ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.
• 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
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.
• 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.
Ứng dụng điển hình trên Windows
Hình 1.2 Minh họa một ứng dụng trên Windows
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
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ì