Viết văn bản trong màn hình đồ họa Viết văn bản
outtext(s) ;
outtextxy(x, y, s) ;
Câu lệnh trên cho phép viết xâu kí tự tại vị trí con trỏ trên màn hình đồ họa. Câu lệnh tiếp theo cho phép viết s ra tại vị trí (x, y). Vị trí con trỏ sau khi thực hiện outtext(s) sẽ đặt tại vị trí cuối của xâu được in trong khi vị trí con trỏ sau khi thực hiện lệnh outtextxy(x, y, s) là không thay đổi. Ví dụ sau in ra màn hình đồ họa dòng chữ "Đây là chương trình minh họa lệnh outtext(s)" tại vị trí (100, 20):
moveto(100, 20) ; // chuyen con tro den cot 100, dong 20
outtext("Đây là chương trình minh họa lệnh outtext(s)") ; hoặc
outtext("Đây là chương trình ") ;
outtext("minh họa lệnh ") ;
outtext("outtext(s)") ;
hoặc dòng văn bản trên cũng có thể được in bởi lệnh outtextxy(x, y, s);
outtextxy(100, 20, "Đây là chương trình minh họa lệnh outtextxy(x, y, s)");
Điều chỉnh font, hướng và cỡ chữ
settextstyle(Font, Hướng, Cỡ chữ);
Font : Gồm các loại font tương ứng với các hằng sau đây:
DEFAULT_FONT 0
SMALL_FONT 1
TRIPLEX_FONT 2
SANS_SERIF_FONT 3
GOTHIC_FONT 4
Hướng : hướng viết theo kiểu nằm ngang hay thẳng đứng, tương ứng với các hằng:
HOIRIZ_DIR 0
VERT_DIR 1
Cỡ chữ : Gồm các cỡ chữ đánh số tăng dần từ 1. Cỡ chữ ngầm định là 1.
Ví dụ sau lần lượt in tại tâm màn hình tên của các font với các cỡ chữ lớn dần, theo hướng nằm ngang.
#include
#include
#include
#include
void main()
{
char *fname[] = {"ngầm định", "Triplex", "Small", "Sans Serif", "Gothic" };
int gdriver = DETECT, gmode;
int font, midx, midy;
int size = 1;
initgraph(&gdriver, &gmode, "C:\\Borlandc\\BGI");
midx = getmaxx() / 2; midy = getmaxy() / 2;
for (font = DEFAULT_FONT; font <= GOTHIC_FONT; font++)
{
cleardevice();
size = font;
settextstyle(font, HORIZ_DIR, size);
outtextxy(midx, midy, fname[font]);
getch();
}
closegraph();
}
Điều chỉnh cách viết
Theo mỗi hướng (nằm ngang hay thẳng đứng) có 3 cách viết tương ứng với các hằng số sau:
Theo hướng nằm ngang:
LEFT_TEXT = 0 : Viết từ trái sang phải.
CENTER_TEXT = 1 : Viết từ vị trí con trỏ sang hai bên.
RIGHT_TEXE = 2 : Viết từ phải sang trái.
Theo hướng thẳng đứng:
BOTTOM_TEXT = 0 : Viết từ dưới lên.
CENTER_TEXT = 1 : Viết từ vị trí con trỏ lên trên và xuống dưới.
TOP_TEXT = 2. Viết từ trên xuống.
Để chỉ định một trong các cách viết trên ta dùng lệnh
settextjustify(Theo hướng ngang, Theo hướng dọc);
Chuyển động
Nguyên tắc: xóa hình ở vị trí cũ rồi vẽ lại hình đó tại vị trí mới theo hướng chuyển động. Để xoá, ta vẽ lại hình ngay tại vị trí cũ nhưng với mầu vẽ trùng với màu nền (do đó hình vẽ bị chìm vào nền giống như đã bị xóa). Để biết màu nền hiện tại có thể dùng hàm setcolor(getbkcolor()). Tóm lại có thể đưa ra sơ đồ như sau:
- vẽ lại hình với màu nền tại vị trí cũ // xóa hình
- delay // tạm dừng
- vẽ lại hình (với màu của hình) tại vị trí mới // hình chuyển đến vị trí khác
Các bước trên nếu được lặp đi lặp lại ta sẽ thấy hình chuyển động từ vị trí này đến vị trí khác.
Đối với các hình vẽ phức tạp, để xóa nhanh ta có thể vẽ lại hình trong chế độ XOR_PUT như được trình bày trong phần sau.
Chúng ta hãy xem qua một số hàm phức tạp hơn để vẽ hình.
setviewport(x1, y1, x2, y2, clip): Tạo một cửa sổ mới trong chế độ đồ hoạ. Khi đó tọa độ của các điểm sẽ được tính lại theo cửa sổ mới này. Cụ thể điểm (x1, y1) của màn hình bây giờ sẽ lại được tính với tọa độ mới là (0,0). Nếu clip = 0 sẽ cho phép các hình vẽ được mở rộng khỏi khung cửa sổ, nếu clip = 1 các phần của hình vẽ nằm ngoài khung cửa sổ sẽ bị cắt.
getviewsettings(struct viewporttype *vp): Lấy toạ độ cửa sổ hiện tại vào biến con trỏ vp. Kiểu của cuẳ sổ là một cấu trúc như sau:
struct viewporttype {int left, top, right, bottom, clip;};
imagesize(x1, y1, x2, y2): Cho lại kích thước (byte) của một ảnh bitmap trong khung chữ nhật được xác định bởi các tọa độ (x1, y1, x2, y2).
getimage(x1, y1, x2, y2, *pict): Lưu ảnh từ màn hình vào vùng bộ nhớ được trỏ bởi con trỏ pict.
putimage(x1, y1, *pict, op): Ghi ra màn hình ảnh đã được lưu tại vị trí con trỏ pict. op là chế độ qui định việc hiện ảnh lên màn hình, màu của các điểm sẽ được qui định thông qua màu của ảnh được lưu trong pict và màu hiện tại của điểm trên màn hình. Hai màu này sẽ "trộn" theo các phép toán qui định bởi op dưới đây để cho ra màu vẽ của ảnh:
COPY_PUT = 0 Săn cầu thủ
XOR_PUT = 1 Hoặc loại trừ (giống nhau thì bằng 0). Để xóa ảnh ta có thể vẽ lại chúng với chế độ này.
OR_PUT = 2 Hoặc
AND_PUT = 3 Và
NOT_PUT = 4 Not
Ví dụ 8 : Vẽ bánh xe xoay
void bx(int x, int y, int r, float phi, int xoa) // xoá ảnh nếu xoa = 1
{
int i, x1, x2, y1, y2;
if (xoa) setcolor(BLACK); // đặt màu vẽ bằng màu nền
circle(x, y, r); // vẽ vành bánh xe
for (i=0; i<6; i++) {
x1 = x+int(r*cos(phi)); y1 = y-int(r*sin(phi));
x2 = x-int(r*cos(phi)); y2 = y+int(r*sin(phi));
line(x1, y1, x2, y2); // vẽ các nan hoa
phi = phi + pi/3; // lệch nhau 600
}
setcolor(WHITE);
}
void xoay()
{
int i, x, y, r;
static float phi = 0;
x = midx; y = midy; r = 100;
while (!kbhit()) {
bx(x, y, r, phi, 0); // vẽ bánh xe
delay(100); // tạm dừng
bx(x, y, r, phi, 1); // xóa bánh xe
phi = phi-pi/72; // xoay đi một góc phi
}
}
: Vẽ bánh xe lăn trên đường nằm ngang
void lan()
{
int i, x, y, r;
float phi=0;
x = 0; y = maxy-110; r = 60;
setlinestyle(SOLID_LINE, 1, 3);
line(0, maxy-50, maxx, maxy-50);
setlinestyle(SOLID_LINE, 1, 1);
while (x-r<=maxx) {
bx(x, y, r, phi, 0);
delay(20); bx(x, y, r, phi, 1); x += 1; phi = phi-pi/72;
}
}
Chia sẻ với bạn bè của bạn: |