Tải bản đầy đủ (.doc) (20 trang)

PHỤ CHƯƠNG ÐỒ HỌA TRONG TURBO PASCAL

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (172.5 KB, 20 trang )

PHỤ CHƯƠNG ÐỒ HỌA TRONG TURBO PASCAL

I. KHÁI NIỆM VỀ ĐỒ HỌA.
II. KHỞI ĐỘNG CHẾ ĐỘ ĐỒ HỌA.
III. LỔI ĐỒ HỌA.
IV. MỘT SỐ HÀM VÀ THỦ TỤC CHUẨN TRONG UNIT GRAPH.
1. Màu và mẩu(kiểu).
2. Đ iểm, kiểu đường thẳng, đường thẳng.
3. Các hình không tô.
4. Các hình có tô.
5. Xử lý chuỗi ký tự trên màn hình đồ họa.
6. Cửa sổ trong chế độ đồ họa.
7. Đ óng chế độ đồ họa.
V.
MỘT VÀI VÍ DỤ MINH HỌA.


Phần này chỉ nhằm giới thiệu một số các khái niệm cơ bản về chế độ đồ họa, các
thủ tục và hàm để: khởi động chế độ đồ họa, vẽ các hình cơ bản như đường thẳng, đường
tròn, cung elip, hình quạt, đa giác, chuỗi ký tự, cửa sổ ViewPort,... đã được khai báo sẵn
trong Unit Graph của Turbo Pascal.
I. KHÁI NIỆM VỀ ÐỒ HỌA
Trong Turbo Pascal có hai chế độ thường được sử dụng đó là: chế độ văn bản (text
mode) và chế độ đồ họa (graphics mode). Chế độ văn bản thì màn hình được thiết lập hiển
thị 25 dòng và 80 cột như đã giới thiệu ở phần trước. Còn ở chế độ đồ họa, thì màn hình lại
được thiết lập dựa trên từng điểm ảnh (pixel), mỗi màn hình gồm nhiều điểm ảnh được sắp
xếp trên các đường thẳng nằm ngang và đường thẳng đứng, sự bài trí số pixel trên mỗi loại
màn hình được gọi là độ phân giải (Resolution), độ phân giải càng cao thì số pixel càng
nhiều và hình ảnh càng mịn.
Hệ tọa độ cho mỗi loại màn hình có khác nhau (xem bảng 1), chẳng hạn ở loại màn
hình VGA là 640x480 như hình sau:


Một chương trình đồ họa thường gồm các phần sau:
· Khởi tạo chế độ đồ họa.
· Xác định màu nền, màu và kiểu chữ, màu đường vẽ, màu tô và kiểu tô.
· Vẽ và tô các hình ta cần thực hiện.
· Các thao tác khác như cho hiện dòng chữ, chú thích.
· Ðóng chế độ đồ họa để trở về chế độ văn bản.
II. KHỞI ÐỘNG CHẾ ÐỘ ÐỒ HỌA
Ðể có thể thực hiện chương trình trên chế độ đồ họa, trước tiên ta phải khởi động
chế độ đồ họa. Việc này được thông qua thủ tục sau:
Procedure InitGraph(var GraphDriver:Integer; var GraphMode: Integer; PathToDriver:
string);
Với: GraphDriver, GraphMode là loại màn hình và mốt màn hình (xem bảng 1).
PathToDriver là đường dẫn của thư mục chứa các tập tin điều khiển đồ họa.
Ví dụ: Giả sử ta có loại màn hình VGA, mốt là VGAHi, các tập tin điều khiển đồ họa ở
trong thư mục F:\WINAPPS\BP\BGI, ta có thể viết phần chương trình khởi động đồ họa
như sau:
Uses Graph;
Var mh,mode: integer; {mh: loại màn hình}
Begin
mh:=VGA; mode:=VGAHi; {có thể dùng hằng DETECT cho mh } (1)
Initgraph(mh,mode,’ F:\WINAPPS\BP\BGI’);
...........
End.
Việc nhớ các loại màn hình và mốt màn hình là điều gây dễ nhầm lẫn, do vậy ta có
thể để cho máy tự động dò tìm loại và mốt màn hình. Như vậy ở chương trình trên ta bỏ
dòng (1) thì khi thực hiện máy sẽ tự động dò tìm (DECTECT), đây là điểm rất hay vì nó sẽ
cho khởi động loại màn hình đang sử dụng và mốt đồ họa có độ phân giải cao nhất.
Bảng 1: Các giá trị của Grapdriver, GraphMode và Resolution của một số loại màn
hình thông dụng.
GraphDriver GraphMode Resolution

DETECT (0) Ðộ phân giải cao nhất và loại màn hình sử dụng
CGA (1) CGAC0 (0)
CGAC1 (1)
CGAC2 (2)
CGAC3 (3)
CGACHi (4)
320 x 200
320 x 200
320 x 200
320 x 200
640 x 200
EGA (3) EGALo (0)
EGAHi (1)
640 x 200
640 x3 50
VGA (9) VGALo (0)
VGAMed (1)
VGAHi (2)
640 x 200
640 x 350
640 x 480
Chú ý: Ở bảng này các hằng DETECT có giá trị 0, hằng VGA có giá trị 9, hằng VGAHi
có giá trị 2, ...
Ta có thể xác định Grapdriver, GraphMode và Resolution trên một máy đang hoạt
động bằng chương trình sau:
Uses Graph;
Var mh,mode:integer;
Begin
mh:=Detect; {Có thể bỏ dòng này}
initgraph(mh,mode,'f:\winapps\bp\bgi');

writeln('GraphDriver = ',mh,' Graphmode = ',mode,' Resolution =',GetmaxX,
'x',GetMaxY);
readln;
closegraph;
End.
Với: GetmaxX, và GetMaxY là các hàm trả về giá trị lớn nhất tương ứng cho hàng,
cột của màn hình và mốt hiện hành.
III. LỖI ÐỒ HỌA
Khi khởi động đồ họa, nếu máy không tìm thấy các chương trình điều khiển đồ họa
thì sẽ phát sinh ra lỗi đồ họa và như vậy chương trình không thể thực hiện được hoặc có
thể treo máy.
Trong cả 2 trường hợp có hoặc không có lỗi, ta nên sử dụng hàm GraphResult để
biết có lỗi hay không? Có thể kết hợp với hàm GraphErrorMsg để nhận được thông báo
đúng nhất. Bảng 2 liệt kê một số thông báo lỗi thường gặp:
Bảng 2: Các lỗi đồ họa
Hằng Trị mã lỗi Thông tin lỗi phát hiện
GrOk
GrNoInitgraph
GrNotDetected
GrFileNotFound
GrInvalidDriver
GrNoloadMem
GrNoScanMem
GRNoFloodMem
GrFontNoFound
0
-1
-2
-3
-4

-5
-6
-7
-8
Không có lỗi khởi động đồ họa.
Chưa khởi động dồ họa.
Không có phần cứng đồ họa.
Không tìm thấy trình điều khiển đồ họa.
Trình điều khiển không hợp lệ.
Không đủ bộ nhớ RAM cho đồ họa.
Tràn vùng nhớ trong Scan Fill.
Tràn vùng nhớ trong Flood Fill.
Không tìm thấy tập tin Font.
GrNoFontMem
GrInvalidMode
GrError
GrIOError
GrInvalidFont
GrInvalidFontNum

-9
-10
-11
-12
-13
-14
Không đủ bộ nhớ RAM để nạp Font.
Kiểu đồ họa không hợp lệ cho trình điều khiển.
Lỗi đồ họa tổng quát.
Lỗi đồ họa vào ra.

Tập tin Font không hợp lệ.
Số hiệu đại diện cho Font không hợp lệ.
Ví dụ: Chương trình kiểm tra quá trình khởi động đồ họa và nếu có lỗi sẽ thông
báo lỗi ra màn hình:
Uses Graph;
Var
maloi: Integer;
GrDriver, GrMode: Integer;
Begin
GrDriver := Detect;
InitGraph(GrDriver, GrMode, 'f:\winapps\bp\bgi');
maloi := GraphResult; { Check for errors }
if maloi <> grOk then
begin
Writeln('Lỗi đồ họa là : ', GraphErrorMsg(maloi));
Writeln('Lỗi!, Thoát khỏi chương trình ...');
Halt(1); {Lệnh ngắt ngang và kết thúc chương trình }
end
else { Phần chương trình cần thực hiện khi không có lỗi đồ họa }
End.
IV. MỘT SỐ HÀM VÀ THỦ TỤC CHUẨN TRONG UNIT GRAPH
1. Mầu và mẫu (kiểu)
Ðối với màn hình trắng đen (Hercules Monochrome) ta có 2 giá trị màu 0 và 1, còn
đối với các màn hình màu (VGA, EGA,...) thì có 16 giá trị màu từ 0..15 được liệt kê trong
bảng 3, và kiểu tô màu thì có 11 kiểu đã được định sẵn là từ 0..11 và một kiểu do người lập
trình định nghĩa (User - defined fill) và các kiểu tô được liệt kê trong bảng 4.
a. Thủ tục chọn màu đường vẽ
SetColor(ColorNum:word);
b. Thủ tục đặt màu nền của màn hình
SetBkColor(ColorNum :word);

c. Thủ tục chọn kiểu tô và màu tô
SetFillStyle(Pattern:word; ColorNum:word);
d. Hàm nhận màu trả về do thủ tục SetColor đã đặt màu trước đó
GetColor: word;
e. Hàm nhận màu nền trả về do thủ tục SetBkColor đã đặt trước đó
GetBkColor: word;
f. Hàm trả về giá trị màu lớn nhất
GetMaxColor: word;
Bảng 3: Các giá trị có thể nhận của biến màu ColorNum
Tên hằng Giá trị màu Màu hiển thị
Black
Blue
Green
0
1
2
Ðen
Xanh da trời
Xanh lá cây
Cyan
Red
Magenta
Brown
LightGray
DarkGray
LightBlue
LightGreen
LightCyan
LightRed
LightMagenta

Yellow
White
3
4
5
6
7
8
9
10
11
12
13
14
15

Xanh lơ
Ðỏ
Tím
Nâu
Xám nhạt
Xám sẫm
Xanh da trời nhạt
Xanh lá cây nhạt
Xanh lơ nhạt
Ðỏ nhạt
Tím nhạt
Vàng
Trắng
Bảng 4: Các giá trị có thể nhận của biến kiểu tô Pattern

Tên hằng Giá trị kiểu tô Diễn giải kiểu tô
EmptyFill
SolidFill
LineFill
LtSlashFill
SlashFill
BkSlashFill
LtBkSlashFill
0
1
2
3
4
5
6
Tô bằng màu nền
Tô đặc
Tô bằng gạch ngang
Tô bằng ///
Tô bằng /// in đậm
Tô bằng \\\ in đậm
Tô bằng \\\
HatchFill
XHatchFill
InterleaveFill
WideDotFill
CloseDotFill
UserFill
7
8

9
10
11
12

Tô bằng đường gạch bóng nhạt
Tô bằng đường gạch bóng chữ thập
Tô bằng đường đứt quãng
Tô bằng những dấu chấm thưa
Tô bằng dấu chấm dày
Mẫu tô tự tạo
2. Ðiểm, kiểu đường thẳng, đường thẳng
a. Thủ tục vẽ một điểm tại một tọa độ (x,y)
PutPixel(x,y:integer;ColorNum:word);
b. Thủ tục chọn kiểu đường thẳng
SetLineStype(linestyle:word;pattern:word;thickness:word);
Với tham số LineStyle có các giá trị như bảng 5 sau:
Bảng 5: Tham số LineStyle
Hằng Giá trị Diễn giải
SolidLn
DottedLn
CenterLn
DashedLn
UserBitLn

0
1
2
3
4

Nét đậm
Nét chấm
Nét chấm gạch
Nét gạch
Mẫu tự tạo
Với tham số thickness có các giá trị như bảng 6 sau:
Bảng 6: Tham số Thickness

×