Phần 2 Giáo trình Lập trình C trên Windows tiếp tục giới thiệu đến bạn đọc nội dung từ bài 4 đến bài 6 về các vấn đề như: Giao tiếp thiết bị đồ họa, bàn phím, thiết bị chuột và bộ định thời gian, cơ bản về lập trình với MFC. Giáo trình cung cấp cho bạn đọc những kiến thức tổng quan cũng như về kỹ thuật lâp trình C trên Windows. Hi vọng giáo trình là tài liệu tham khảo thiết thực và bổ ích cho bạn đọc trong việc nghiên cứu lập trình.
Nội dung trích xuất từ tài liệu:
Giáo trình Lập trình C trên Windows: Phần 2 - Nguyễn Đình Quyên, Mai Xuân Hùng (đồng biên soạn)
Bài 4
GIAO TIẾP THIẾT BỊ ðỒ HỌA
Phần hệ thống của Microsoft Windows liên quan tới việc thể hiện ñồ họa trên thiết bị giao tiếp
màn hình, máy in ñược gọi là phần Giao tiếp Thiết bị ðồ họa (GDI – Graphics Device
Interface). ðây chính là cơ chế mà thông qua ñó các lập trình viên thao tác thể hiện các thông
tin, dữ liệu một cách trực quan trên các ứng dụng. Trong bài học này, chúng ta sẽ tìm hiểu cách
xuất văn bản, vẽ ñường thẳng, tô màu,… thông qua các hàm API về GDI tương ứng mà
Windows cung cấp.
4.1. TỔNG QUAN VỀ GDI
Chúng ta cần biết rằng các khái niệm, kỹ thuật về GDI của Microsoft Windows là rất nhiều. Vì
rằng ñây không chỉ là cơ chế ñể lập trình viên thao tác văn bản, hình ảnh, mà ngay từ ñầu ñây
cũng chính là cơ chế mà Windows phải thực hiện ñể thể hiện giao diện chung của mình: cách
trình bày menu, icon, cursor,… Tuy vậy, trong phạm vi của môn học, chúng ta không phân tích
tại sao Windows tổ chức các ñối tượng ñồ họa, mà chỉ tìm hiểu những hàm, cấu trúc dữ liệu cơ
bản nhất về ñồ họa là gì, cũng như cách thức ñể thể hiện chúng trên các ứng dụng Windows-
based là thế nào….
4.1.1. GDI và Thiết bị Ngữ cảnh
Xét dưới góc ñộ lập trình, GDI là tập hợp hàng trăm hàm (function) cũng như các kiểu dữ liệu,
macro, và cấu trúc mà Microsoft ñịnh nghĩa ñể xây dựng giao diện hệ ñiều hành Windows.
Cơ chế ñồ họa trên Windows 98 và Microsoft Windows NT ñược quản lý thông qua các hàm
liên kết từ thư viện GDI32.DLL. Trên Windows 98, thư viện GDI32.DLL sử dụng các hàm từ
thư viện GDI.EXE 16-bit ñể thực hiện các thao tác cài ñặt thật sự của các hàm. Trên Windows
NT, thư viện GDI.EXE chỉ dùng cho các chương trình dạng 16-bit.
ðiểm cần chú ý ở ñây là việc Windows sử dụng các thư viện này ñể thể hiện dữ liệu ñồ họa
lên các thiết vị vật lý cụ thể (video display, printer) như thế nào. Câu trả lời thể hiện qua mô hình
ở hình 4.1 sau:
Hình 4.1 Mô hình hoạt ñộng của GDI
Như thể hiện trên mô hình, các ứng dụng trên Windows không thật sự thao tác ñến thiết bị
xuất vật lý, mà chỉ thao tác ñến một ñối tượng logic, gọi là Thiết bị Ngữ cảnh (DC - Device
Context). Và như vậy, ở mức lập trình, chúng ta chỉ cần biết làm thế nào ñể gọi các hàm GDI lên
ñối tượng DC mà thôi – chúng ta sẽ tìm hiểu các dạng hàm GDI và cách gọi các hàm thao tác các
ñối tượng ñồ họa ở hai phần tiếp theo.
74
Cũng từ trên mô hình, bây giờ chúng ta ñã có thể hiểu tại làm sao mà ứng với mỗi thiết bị vật
lý như card màn hình, máy in,… chúng ta cần phài cài ñặt trình ñiều khiển thiết bị (driver) tương
ứng khi sử dụng trên Windows. Các driver này có nhiệm vụ chuyển các lệnh GDI thành các mã
lệnh hoặc cách truy cập mà thiết bị phần cứng tương ứng có thể hiểu và thực hiện ñúng theo yêu
cầu của ứng dụng. Và như vậy, chúng ta lập trình mà không quan tâm tới việc thiết bị máy in hay
video display ñược sử dụng là gì. Vì vậy, GDI còn ñược gọi là cơ chế ñồ họa ñộc lập thiết bị
(device-independent graphics).
Ở trên, chúng ta có nói ñến Thiết bị Ngữ cảnh, vậy Thiết bị Ngữ cảnh là gì, và cách thức
chúng ta lập trình thao tác Thiết bị Ngữ cảnh là thế nào? Ta có thể ñịnh nghĩa như sau, Thiết bị
Ngữ cảnh bao gồm tập hợp các “thuộc tính” xác ñịnh cách thức các hàm GDI thao tác trên thiết
bị. Tập thuộc tính này tương ứng các cấu trúc của các ñối tượng gọi là ñối tượng ñồ họa (xem
phần 4.1.3). Khi ta gọi các hàm GDI ñể thực hiện một thao tác ñồ họa nào ñó, ví dụ dùng hàm
LineTo ñể vẽ một ñường thẳng ñến một vị trí nào ñó trên DC, thì Windows dùng các thông tin về
bút vẽ (pen) như màu sắc, ñộ dày nét vẽ,… sẵn có trong ñối tượng ñồ họa này ñể vẽ. Trong
trường hợp chúng ta muốn vẽ với một màu sắc, kiểu vẽ,… khác, ta chỉ việc thay ñổi thông số của
ñối tượng này trước khi thực hiện thao tác vẽ. Chúng ta sẽ tìm hiểu cách thao tác một số ñối
tượng ñồ họa cơ bản là bút vẽ (pen), chổi tô (brush) và ảnh bitmap trong các phần tiếp sau.
4.1.2. Các dạng hàm GDI
Dựa vào mục ñích sử dụng, tập hợp các hàm GDI có thể ñược phân thành một số loại sau:
1 Các hàm nhận (hoặc tạo) và giải phóng (hoặc hủy) ñối tượng DC Như ñã thấy trong ví dụ
ñầu tiên, ñể xuất dòng chữ trong biến szHello ra màn hình, ta dùng hàm DrawText ñể vẽ lên
ñối tượng hdc. ðối tượng này nhận ñược qua hàm BeginPaint và giải phóng bằng hàm
EndPaint bên trong thông ñiệp WM_PAINT. Chúng ta sẽ nói rõ thêm về các hàm này trong
phần 4.1.4.
2 Các hàm lấy thông tin về DC Trong một số ứng dụng, chúng ta cần xác ñịnh một số thông tin
về DC như kích thước DC tính theo pixel và tính theo milimet, số lượng bút vẽ, chổi tô,…
trong DC thì ta dùng những hàm này. Tuy nhiên, với phạm vi môn học chúng ta sẽ không tìm
hiểu về các hàm lấy thông tin DC này.
3 Các hàm thực hiện thao tác vẽ ðể xuất một văn bản, vẽ một ñường thẳng, tô một hình
tròn,… GDI cung cấp cho chúng ta một số hàm tương ứng như TextOut, LineTo, Ellipse
Trong các phần tiếp theo chúng ta sẽ tìm hiểu về một số hàm thông qua các ví dụ tương ứng.
4 Các hàm thiết lập hoặc lấy các thuộc tính của DC Một “thuộc tính” trên DC xác ñịnh các ñặc
tính liên quan ñến dạng thức thực hiện thao tác vẽ. Thông qua một số hàm có liên quan, ta có
thể thiết lập hoặc lấy xem các thuộc tính nào ñó, chẳng hạn ta dùng hàm SetTextColor ñể
thay ñổi màu sắc của văn bản sẽ ñược vẽ trên màn hình bằng hàm DrawText.
5 Các hàm thao tác các “ñối tượng” GDI Trong phần tiếp theo, chúng ta sẽ tìm hiểu kỹ hơn
các “ñối tượng” mà thông qua chúng, chúng ta có thể thay ñổi cách thể hiện các thông tin ñồ
75
họa khác nhau lên DC. Mặc ñịnh thì trên DC luôn “có” các ñối tượng GDI với các “thông số”
nào ñó, và chúng ta có thể thay ñổi các “thông số” của chúng khi muốn thay ñổi kết quả thể
hiện thao tác vẽ. Chẳng hạn, ...