C – Tìm hiểu về các hàm và thủ tục trong đồ họa

Chương này sẽ giới thiệu các hàm và thủ tục để khởi động hệ đồ hoạ, vẽ các đường và hình cơ bản như hình tròn, cung elip, hình quạt, đường gãy khúc, đa giác, đường thẳng, hình chữ nhật, hình hộp chữ nhật….
Các hàm và thủ tục đồ hoạ được khai báo trong file graphics.h.

1. Khởi động đồ hoạ :
Mục đích của việc khởi động hệ thống đồ hoạ là xác định thiết bị đồ hoạ (màn hình) và mode đồ hoạ sẽ sử dụng trong chương trình. Để làm công việc này, ta có hàm sau :
void initgraph(int *graphdriver,int graphmode,char *driverpath);
Trong đó :
– driverpath là xâu ký tự chỉ đường dẫn đến thư mục chứa các tập tin điều khiển đồ hoạ.
– graphdriver cho biết màn hình đồ hoạ sử dụng trong chương trình.
– graphmode cho biết mode đồ hoạ sử dụng trong chương trình.
Bảng dưới đây cho các giá trị khả dĩ của graphdriver và graphmode :

graphdriver
detect (0)

graphmodeĐộ phân giải
CGA (1)CGAC0 (0)
CGAC1 (1)
CGAC2 (2)
CGAC3 (3)
CGAHi (4)
320×200
320×200
320×200
320×200
640×200
MCGA (2)MCGA0 (0)
MCGA1 (1)
MCGA2 (2)
MCGA3 (3)
MCGAMed (4)
MCGAHi (5)
320×200
320×200
320×200
320×200
640×200
640×480
EGA (3)EGAL0 (0)
EGAHi (1)
640×200
640×350
EGA64 (4)EGA64LO (0)
EGA64Hi (1)
640×200
640×350
EGAMONO (5)EGAMONOHi (0)640×350
VGA (9)VGALO (0)
VGAMED (1)
VGAHI (2)
640×200
640×350
640×480
HERCMONO (7)HERCMONOHI720×348
ATT400 (8)ATT400C0 (0)
ATT400C1 (1)
ATT400C2 (2)
ATT400C3 (3)
ATT400MED (4)
ATT400HI (5)
320×200
320×200
320×200
320×200
640×400
640×400
PC3270 (10)PC3270HI (0)720×350
IBM8514 (6)PC3270LO (0)
PC3270HI (1)
640×480 256 màu
1024×768 256 màu

Chú ý :Bảng trên cho ta các hằng và giá trị của chúng mà các biến graphdtriver và graphmode có thể nhận. Chẳng hạn hằng DETECT có giá trị 0, hằng VGA có giá trị 9, hằng VGALO có giá trị 0 vv…
Khi lập trình ta có thể thay thế vào vị trí tương ứng của chúng trong hàm tên hằng hoặc giá trị của hằng đó.

Ví dụ :
Giả sử máy tính có màn hình VGA, các tập tin đồ hoạ chứa trong thư mục C:\TC \BGI, khi đó ta khởi động hệ thống đồ hoạ như sau :

#include "graphics.h"
  main()
  {
  int mh=VGA,mode=VGAHI; /*Hoặc mh=9,mode=2*/
  initgraph(&mh,&mode,"C:\\TC\\BGI"); 
  /* Vì kí tự \ trong C là kí tự đặc biệt nên ta phải gấp đôi nó */
  }

– Bảng trên còn cho thấy độ phân giải còn phụ thuộc cả vào màn hình và mode. Ví dụ như trong màn hình EGA nếu dùng EGALo thì độ phân giải là 640×200 ( Hàm getmaxx() cho giá trị cực đại của số điểm theo chiều ngang của màn hình. Với màn hình EGA trên : 639, Hàm getmaxy() cho giá trị cực đại của số điểm theo chiều dọc của màn hình. Với màn hình EGA trên : 199 ).
– Nếu không biết chính xác kiểu màn hình đang sử dụng thì ta gán cho biến graphdriver bằng DETECT hay giá trị 0. Khi đó, kết quả của initgraph sẽ là :
Kiểu màn hình đang sử dụng được phát hiện, giá trị của nó được gán cho biến graphdriver.
Mode đồ hoạ ở độ phân giải cao nhất ứng với màn hành đang sử dụng cũng được phát hiện và trị số của nó được gán cho biến graphmode.
Như vậy dùng hằng số DETECT chẳng những có thể khởi động được hệ thống đồ hoạ với màn hình hiện có theo mode có độ phân giải cao nhất mà còn giúp ta xác định kiểu màn hình đang sử dụng.
Ví dụ :
Chương trình dưới đây xác định kiểu màn hình đang sử dụng :

#include "graphics.h"
  #include "stdio.h"
  main()
  {
  int mh=0, mode;
  initgraph(&mh,&mode,"C:\\TC\\BGI");
  printf("\n Gia tri so cua man hinh la : %d",mh);
  printf("\n Gia tri so mode do hoa la : %d",mode);
  closegraph();
  }

Nếu chuỗi dùng để xác định driverpath là chuỗi rỗng thì chương trình dịch sẽ tìm kiếm các file điều khiển đồ hoạ trên thư mục chủ ( Thư mục hiện thời ).