Website: http://www.docs.vn Email :
[email protected] Tel : 0918.775.368
Lời giới thiệu
Đồ họa trong lập trình luôn là một trong những chủ đề được yêu thích nhất
của các lập trình viên bởi trong cơ chế đồ họa các lập trình viên có thể thỏa mãn
năng khiếu họa sĩ cũng như khả năng lập trình của bản thân. Khi thiết kế 1 chương
trình đồ họa các lập trình viên có thể thỏa sức tưởng tượng và nghiên cứu tìm tòi
để chương trình thực hiện theo sự tưởng tượng đó. Ngoài ra với các ứng dụng rộng
rãi trong đời sống (ngành game, truyền thông đa phương tiện, ngành quảng cáo…)
thì đồ họa còn là 1 trong những nghề “hái ra tiền” của công nghệ thông tin.
Đề tài của em là lập trình 1 chương trình tương tự Microsoft Paint của
Windows là một trong những chương trình đồ họa đơn giản và quen thuộc nhất của
hệ điều hành Windows. Với những giới hạn của ngôn ngữ lập trình C/C++ và khả
năng bản thân, em đã cố gắng thiết kế 1 chương trình có được giao diện và cơ chế
làm việc gần giống MS Paint .
Em xin chân thành cảm ơn Thầy hướng dẫn Đinh Tuấn Long đã hướng dẫn
em thực hiện bài tập lớn tốt nghiệp này.
X©y dùng ch¬ng tr×nh vÏ h×nh gièng microsoft paint
Phần I : Đặt vấn đề
1. Mô tả bài toán :
1
Website: http://www.docs.vn Email :
[email protected] Tel : 0918.775.368
Sử dụng chế độ đồ họa của C/C++ và một số thuật toán cần thiết để
lập trình xây dựng chương trình vẽ hình giống Microsoft Paint :
Chương trình có giao diện gần giống MS Paint và các thao tác sử
dụng tương tự gồm có:
- 1 bảng chứa các chức năng vẽ.
- 1 bảng chứa danh sách các màu vẽ (gồm 16 màu cơ bản).
- Phần màn hình dùng để vẽ hình.
- Sử dụng chuột để chọn màu vẽ và chức năng vẽ và vẽ ra màn hình
đồ họa.
- Các chức năng tạo mới, save, load, trợ giúp, thoát.
2. Yêu cầu chương trình :
Thiết kế được giao diện tương tự MS Paint với các phần như trên.
Làm việc được với 16 màu cơ bản.
Sử dụng chuột để vẽ .
Có các công cụ : bút vẽ, vẽ đường thẳng, vẽ hình chữ nhật, vẽ hình
vuông, vẽ hình đa giác, vẽ hình ellip, vẽ hình tròn, vẽ các hình đặc,
xóa và tô màu miền kín được thiết kế trong 1 bảng chứa các chức
năng vẽ dưới dạng các ô công cụ để lựa chọn bằng chuột.
- Có chức năng ghi ảnh đang vẽ và có thể mở file ảnh đó ra để thực
hiện việc vẽ tiếp.
- Có các chức năng tạo mới, trợ giúp, thoát để điều khiển chương
trình .
- Tất cả các điều khiển đều sử dụng chuột ( Khởi tạo và điều khiển
chuột sử dụng ngắt chuột (0x33) ).
-
Phần II : Giải quyết vấn đề
1. Ngôn ngữ thực hiện : C/C++.
2
Website: http://www.docs.vn Email :
[email protected] Tel : 0918.775.368
2. Các vấn đề và phương án giải quyết :
a) Khởi tạo và điều khiển chuột :
Bằng cách tác động vào các thanh ghi _AX,_BX,_CX,_DX của ngắt
chuột geninterrupt(0x33) để khởi tạo và điều khiển thao tác chuột:
- Khởi tạo :
int kt_mouse()
{
_AX = 0;
geninterrupt(0x33);
if (_AX == 0) return _AX; else return _BX;
}
- Ẩn ,hiện chuột :
void hien_mouse()
{
_AX = 1;
geninterrupt(0x33);
}
void an_mouse()
{
_AX = 2;
geninterrupt(0x33);
}
- Khai báo biến con trỏ để lấy vị trí chuột :
void mouse_getXY(int *mouseX, int *mouseY)
{
_AX = 3;
geninterrupt(0x33);
*mouseX = _CX;
*mouseY = _DX;
}
- Kiểm soát việc kích chuột và nhả chuột :
int kich_mouse_trai()
{
_AX = 3;
3
Website: http://www.docs.vn Email :
[email protected] Tel : 0918.775.368
geninterrupt(0x33);
return (_BX>>0)&1;
}
int kich_mouse_phai()
{
_AX = 3;
geninterrupt(0x33);
return (_BX>>1)&1;
}
int nha_mouse_trai()
{
int fx, fy, lx, ly;
_BX = 0;
_AX = 6;
geninterrupt(0x33);
if (_BX == 1)
{
fx = _CX; fy = _DX;
mouse_getXY(&lx, &ly);
if ((fx == lx)&(fy == ly)) return 1; else
return 0;
} else return 0;
}
int nha_mouse_phai()
{
int fx, fy, lx, ly;
_BX = 1;
_AX = 6;
geninterrupt(0x33);
if (_BX == 1)
{
fx = _CX; fy = _DX;
mouse_getXY(&lx, &ly);
4
Website: http://www.docs.vn Email :
[email protected] Tel : 0918.775.368
if ((fx == lx)&(fy == ly)) return 1; else
return 0;
} else return 0;
}
- Kiểm soát việc di chuyển chuột:
void mouse_move(int mouseX, int mouseY)
{
_AX = 4;
_CX = mouseX;
_DX = mouseY;
geninterrupt(0x33);
}
void mouse_setX(int start, int end)
{
_AX = 7;
_CX = start;
_DX = end;
geninterrupt(0x33);
}
void mouse_setY(int start, int end)
{
_AX = 8;
_CX = start;
_DX = end;
geninterrupt(0x33);
}
b) Trong chế độ đồ họa của MS Paint các đường thẳng, hình chữ nhật và
đường ellip được vẽ theo cách dùng chuột xác định 2 điểm :
- Đối với đường thẳng là 2 điểm : điểm đầu và điểm cuối.
- Đối với hình chữ nhật là 2 điểm xác định đường chéo.
- Đối với hình ellip là 2 điểm xác định đường chéo của hình chữ
nhật ngoại tiếp hình ellip.
5
Website: http://www.docs.vn Email :
[email protected] Tel : 0918.775.368
Trong chương trình mô phỏng MS Paint này em cũng xác định 2 điểm như trên
để lập trình vẽ đường thẳng, hình chữ nhật và hình ellip (dựa theo việc thay đổi 2
trục x, y ta có thể vẽ hình vuông và hình tròn từ hình chữ nhật và hình ellip).
Để lập trình chương trình tương tự MS Paint (khi xác định điểm cuối bằng cách
di chuột thì hình vẽ sẽ biến đổi theo vị trí chuột ) em xây dựng thêm các hàm
lineMY ,rectMY ,ellipMY để vẽ hình bằng putpixel() từng điểm trên màn hình đồ
họa (riêng hàm ellipMY được hỗ trợ bởi hàm doixung() để vẽ đối xứng cung tròn)
void lineMY(int sx, int sy, int ex, int ey, int c, int
style )
{
int t, d;
int xe = 0, ye = 0, dx, dy;
int ix,iy;
dx = ex - sx;
dy = ey - sy;
if (dx > 0) ix = 1;
else if (dx == 0) ix = 0; else ix = -1;
if (dy > 0) iy = 1;
else if (dy == 0) iy = 0; else iy = -1;
dx = abs(dx);
dy = abs(dy);
d = (dx > dy) ? dx : dy;
for (t = 0; t <= d; t++)
{
if (style == 1) putpixel(sx, sy,
c^getpixel(sx, sy)); else putpixel(sx, sy, c);
xe = xe + dx;
ye = ye + dy;
if (xe > d)
{
xe = xe - d;
sx = sx + ix;
}
6
Website: http://www.docs.vn Email :
[email protected] Tel : 0918.775.368
if (ye > d)
{
ye = ye - d;
sy = sy + iy;
}
}
}
void rectMY(int sx, int sy, int ex, int ey, int c, int
style)
{
lineMY(sx, sy, ex, sy, c, style);
lineMY(sx, sy, sx, ey, c, style);
lineMY(ex, sy, ex, ey, c, style);
lineMY(sx, ey, ex, ey, c, style);
if (style == 1) putpixel(ex, ey, c^getpixel(ex,
ey)); else putpixel(ex, ey, c);
}
void doixung(int xc, int yc, int
style)
{
if (style == 1)
{
putpixel(xc + xp, yc xp, yc - yp));
putpixel(xc + xp, yc +
xp, yc + yp));
putpixel(xc - xp, yc +
xp, yc + yp));
putpixel(xc - xp, yc xp, yc - yp));
} else
{
xp, int yp, int c, int
yp, c^getpixel(xc +
yp, c^getpixel(xc +
yp, c^getpixel(xc yp, c^getpixel(xc -
7
Website: http://www.docs.vn Email :
[email protected] Tel : 0918.775.368
putpixel(xc
putpixel(xc
putpixel(xc
putpixel(xc
+
+
-
xp,
xp,
xp,
xp,
yc
yc
yc
yc
+
+
-
yp,
yp,
yp,
yp,
c);
c);
c);
c);
}
}
void ellipMY(long xc, long yc, long a, long b, long c,
int style)
{
long xp, yp, vung = 1;
double d = b*b - a*a*b + ((float)a*a/4);
xp = 0; yp = b;
while (yp >= 0)
{
doixung(xc, yc, xp, yp, c, style);
if ((vung ==1) & (a*a*(yp - 0.5) <= b*b*(xp +
1) ))
{
vung = 2;
d = b*b*xp*xp+b*b*xp + ((float)b*b/4) +
a*a*(yp-1)*(yp -1) - a*a*b*b;
}
if (vung ==1)
{
if (d < 0)
{
d = d + b*b*(2*xp + 3);
xp = xp + 1;
} else
{
d = d + b*b*(2*xp + 3) + a*a*(2-2*yp);
xp = xp + 1; yp = yp -1;
}
8
Website: http://www.docs.vn Email :
[email protected] Tel : 0918.775.368
}
if (vung == 2)
{
if (d < 0)
{
d = d + b*b*(2*xp+2)+a*a*(3-2*yp);
xp = xp + 1; yp = yp -1;
} else
{
d = d + a*a*(3-2*yp);
yp = yp -1;
}
}
}
}
c) Đối với các hàm bút vẽ (draw_pen(int d)), hàm tẩy xóa(erase(int d)) có
khai báo biến d để xác định độ dày nét vẽ.
Khai báo cấu trúc line_def để lưu lại kiểu đường mặc định :
struct line_def
{
int linestyle;
unsigned int upattern;
int thickness;
};
line_def(norm_line);
Thiết lập kiểu mới:
setlinestyle(SOLID_LINE,0,d);
Phục hồi kiểu cũ:
setlinestyle(norm_line.linestyle,norm_line.upattern
,norm_line.thickness);
d) Hàm vẽ các chấm điểm ngẫu nhiên trong vùng bán kính r (draw_air(int
r)) có thể dùng để tô màu dạng airbrush:
for (i = 0; i<= 5; ++i)
{
x = random(r + 1);
if (random(2)) x = -x;
y = random(int(sqrt(r * r - x * x)));
9
Website: http://www.docs.vn Email :
[email protected] Tel : 0918.775.368
if (random(2)) y = -y;
an_mouse();
if
((nowX+x>frameX)&(nowX+x
fra
meY)&(nowY+y=bclick.x)&(nowX<=bclick.x+bclick.w)
& (nowY>=bclick.y)&(nowY<=bclick.y+bclick.h));
}
h) Một loạt các hàm update như (update_pcolor(), update_ bline(),
update_bpen(), update_brect(), update_brectf(), update_bellip(),
update_bellipf(), update_bpoly(), update_bair(), update_bera(),
update_bfill(), update_nut()) được sử dụng để vẽ hình mô tả nút điều
khiển .
i) Hàm kt_bangmau() khởi tạo và vẽ ra màn hình 1 bảng 16 mầu cơ bản
chia làm 2 dòng :
{
int i;
pcolor[0].b = 2; pcolor[0].h = 12;pcolor[0].stats
= 1;
pcolor[0].w = 36; pcolor[0].cap = "";
pcolor[0].x = 90; pcolor[0].y = 435;
show_nut(pcolor[0]); setfillstyle(1, 0);
11
Website: http://www.docs.vn Email : [email protected] Tel : 0918.775.368
bar(pcolor[0].x,pcolor[0].y,pcolor[0].x +
pcolor[0].w, pcolor[0].y + pcolor[0].h);
for (i = 1; i<= 7; i++)
{
pcolor[i].b = 2; pcolor[i].h =
12;pcolor[i].stats = 1;
pcolor[i].w = 36;pcolor[i].cap = "";
pcolor[i].x = pcolor[i-1].x + 40;pcolor[i].y =
435;
if (i == ncolor) pcolor[i].stats = 0;
show_nut(pcolor[i]); setfillstyle(1, i);
bar(pcolor[i].x,pcolor[i].y,pcolor[i].x +
pcolor[i].w, pcolor[i].y + pcolor[i].h);
}
pcolor[8].b = 2; pcolor[8].h = 12;pcolor[8].stats
= 1;
pcolor[8].w = 36; pcolor[8].cap = "";
pcolor[8].x = 90; pcolor[8].y = 435+20;
show_nut(pcolor[8]); setfillstyle(1, 8);
bar(pcolor[8].x,pcolor[8].y,pcolor[8].x +
pcolor[8].w, pcolor[8].y + pcolor[8].h);
for (i = 9; i<= 15; i++)
{
pcolor[i].b = 2; pcolor[i].h =
12;pcolor[i].stats = 1;
pcolor[i].w = 36; pcolor[i].cap = "";
pcolor[i].x = pcolor[i-1].x + 40;pcolor[i].y =
435+20;
if (i == ncolor) pcolor[i].stats = 0;
show_nut(pcolor[i]); setfillstyle(1, i);
bar(pcolor[i].x,pcolor[i].y,pcolor[i].x +
pcolor[i].w, pcolor[i].y + pcolor[i].h);
12
Website: http://www.docs.vn Email : [email protected] Tel : 0918.775.368
}
}
j) Hàm hien_color() có khai báo biến s để lưu giá trịmàu hiện thời và hiện
ra ô cstyle[s]
{
cstyle[s].b = 2; cstyle[s].h = 34;
cstyle[s].w = 34; cstyle[s].cap = "";
cstyle[s].x = 35; cstyle[s].y = 435;
show_nut(cstyle[s]);
setfillstyle(1, s);
bar(cstyle[s].x,cstyle[s].y,cstyle[s].x +
cstyle[s].w, cstyle[s].y + cstyle[s].h);
}
k) Hàm kt_bangve vẽ lên màn hình bảng chứa các nút chức năng vẽ và nút
điều khiển chương trình:
{
panel.x = 10; panel.y = 50;
panel.h = 130; panel.w = 55;
panel.stats = 1; panel.cap = ""; panel.b = 1;
pstyle.x = 15; pstyle.y = 190;
pstyle.h = 30; pstyle.w = 45;
pstyle.stats = 1; pstyle.cap = ""; pstyle.b = 1;
bline.x = 15; bline.y = 55;
bline.h = 20; bline.w = 20;
bline.stats = 1; bline.cap = ""; bline.b = 1;
bpen.x = 40; bpen.y = 55;
bpen.h = 20; bpen.w = 20;
bpen.stats = 1; bpen.cap = ""; bpen.b = 1;
bellip.x = 15; bellip.y = 80;
bellip.h = 20; bellip.w = 20;
13
Website: http://www.docs.vn Email : [email protected] Tel : 0918.775.368
bellip.stats = 1; bellip.cap = ""; bellip.b = 1;
brect.x = 40; brect.y = 80;
brect.h = 20; brect.w = 20;
brect.stats = 1; brect.cap = ""; brect.b = 1;
bellipf.x = 15; bellipf.y = 105;
bellipf.h = 20; bellipf.w = 20;
bellipf.stats = 1; bellipf.cap = ""; bellipf.b =
1;
brectf.x = 40; brectf.y = 105;
brectf.h = 20; brectf.w = 20;
brectf.stats = 1; brectf.cap = ""; brectf.b = 1;
bpoly.x = 15; bpoly.y = 130;
bpoly.h = 20; bpoly.w = 20;
bpoly.stats = 1; bpoly.cap = ""; bpoly.b = 1;
bair.x = 40; bair.y = 130;
bair.h = 20; bair.w = 20;
bair.stats = 1; bair.cap = ""; bair.b = 1;
bera.x = 15; bera.y = 155;
bera.h = 20; bera.w = 20;
bera.stats = 1; bera.cap = ""; bera.b = 1;
bfill.x = 40; bfill.y = 155;
bfill.h = 20; bfill.w = 20;
bfill.stats = 1; bfill.cap = ""; bfill.b = 1;
bnew.x = 15; bnew.y = 240;
bnew.h = 20; bnew.w = 50;
bnew.cap = "New"; bnew.stats = 1; bnew.b = 1;
14
Website: http://www.docs.vn Email : [email protected] Tel : 0918.775.368
bsave.x = 15; bsave.y = 270;
bsave.h = 20; bsave.w = 50;
bsave.cap = "Save"; bsave.stats = 1; bsave.b = 1;
bload.x = 15; bload.y = 300;
bload.h = 20; bload.w = 50;
bload.cap = "Load"; bload.stats = 1; bload.b = 1;
bhelp.x = 15; bhelp.y = 330;
bhelp.h = 20; bhelp.w = 50;
bhelp.cap = "Help"; bhelp.stats = 1; bhelp.b = 1;
bexit.x = 15; bexit.y = 360;
bexit.h = 20; bexit.w = 50;
bexit.cap = "Exit"; bexit.stats = 1; bexit.b = 1;
show_nut(panel);
show_nut(pstyle);
update_bline();
update_bpen();
update_brect();
update_bellip();
update_bellipf();
update_brectf();
update_bair();
update_bpoly();
update_bera();
update_bfill();
update_nut(bnew);
update_nut(bsave);
update_nut(bload);
update_nut(bhelp);
update_nut(bexit);
15
Website: http://www.docs.vn Email : [email protected] Tel : 0918.775.368
}
l) Hàm update_bstyle(int style) được khai báo biến style với các giá trị từ
1-10 dùng để mô tả công cụ vẽ hiện thời:
switch (style)
{
case 1:{
moveto(pstyle.x + 24, pstyle.y + 3);
lineto(pstyle.x + 13, pstyle. y + 14);
lineto(pstyle.x + 13, pstyle.y + 17);
lineto(pstyle.x + 16, pstyle.y + 17);
lineto(pstyle.x + 27, pstyle. y + 6);
lineto(pstyle.x + 24, pstyle.y + 3);
line(pstyle.x + 22, pstyle.y + 5, pstyle.x
+ 25, pstyle.y + 8);
line(pstyle.x + 13, pstyle.y + 14,
pstyle.x + 16, pstyle.y + 17);
line(pstyle.x + 8,pstyle.y + 20,pstyle.x +
37,pstyle.y + 20);
break;}
case 2:{
moveto(pstyle.x + 24, pstyle.y + 3);
lineto(pstyle.x + 13, pstyle. y + 14);
lineto(pstyle.x + 13, pstyle.y + 17);
lineto(pstyle.x + 16, pstyle.y + 17);
lineto(pstyle.x + 27, pstyle. y + 6);
lineto(pstyle.x + 24, pstyle.y + 3);
line(pstyle.x + 22, pstyle.y + 5, pstyle.x
+ 25, pstyle.y + 8);
line(pstyle.x + 13, pstyle.y + 14,
pstyle.x + 16, pstyle.y + 17);
moveto(pstyle.x + 13, pstyle.y + 20);
lineto(pstyle.x + 18, pstyle.y +
22);lineto(pstyle.x + 22, pstyle.y + 20);
16
Website: http://www.docs.vn Email : [email protected] Tel : 0918.775.368
lineto(pstyle.x + 26, pstyle.y +
16);lineto(pstyle.x + 37, pstyle.y + 18);
break;}
case 3:{
ellipse(pstyle.x + 24,pstyle.y +
14,0,360,15,6);
break;}
case 4:{
rectangle(pstyle.x + 12,pstyle.y +
5,pstyle.x + 33,pstyle.y + 20);
break;}
case 5:{
for (int j = 1;j<=30;j++)
{ellipse(pstyle.x + 24,pstyle.y +
14,0,360,j/2,6);}
line(pstyle.x + 24 ,pstyle.y + 8 ,pstyle.x
+ 24 ,pstyle.y + 20);
break;}
case 6:{
for (int i = 1;i<=16;i++)
{line(pstyle.x + 12,pstyle.y + 4 +
i,pstyle.x + 33,pstyle.y + 4 + i);}
break;}
case 7:{
moveto(pstyle.x + 24, pstyle.y + 3);
lineto(pstyle.x + 13, pstyle. y + 14);
lineto(pstyle.x + 13, pstyle.y + 17);
lineto(pstyle.x + 16, pstyle.y + 17);
lineto(pstyle.x + 27, pstyle. y + 6);
lineto(pstyle.x + 24, pstyle.y + 3);
line(pstyle.x + 22, pstyle.y + 5, pstyle.x
+ 25, pstyle.y + 8);
line(pstyle.x + 13, pstyle.y + 14,
pstyle.x + 16, pstyle.y + 17);
17
Website: http://www.docs.vn Email : [email protected] Tel : 0918.775.368
line(pstyle.x + 13, pstyle.y + 20,
pstyle.x + 13, pstyle.y + 25);
line(pstyle.x + 13, pstyle.y + 25,
pstyle.x + 33, pstyle.y + 25);
line(pstyle.x + 33, pstyle.y + 25,
pstyle.x + 39, pstyle.y + 8);
line(pstyle.x + 39, pstyle.y + 8 ,
pstyle.x + 13, pstyle.y + 20);
break;}
case 8:{
int i, r = 9 ,x, y;
for (i = 0; i<= 25; i++)
{
x = random(r + 1);
if (random(2)) x = -x;
y = random(int(sqrt(r*r - x * x)));
if (random(2)) y = -y;
an_mouse();
putpixel(pstyle.x + x + 22, pstyle.y + y +
15, 1);
hien_mouse();
}
break;}
case 9:{
bar3d(pstyle.x + 12, pstyle.y + 15, pstyle.x +
20, pstyle.y + 20, 10, 5);
break;}
case 10:{
rectangle(pstyle.x + 20, pstyle.y + 1, pstyle.x
+ 24, pstyle.y + 6);
line(pstyle.x + 24, pstyle.y + 6, pstyle.x +
28, pstyle.y + 10);
18
Website: http://www.docs.vn Email : [email protected] Tel : 0918.775.368
line(pstyle.x + 20, pstyle.y + 6, pstyle.x +
16, pstyle.y + 10);
rectangle(pstyle.x + 12, pstyle.y + 10,
pstyle.x + 32, pstyle.y + 22);
int i;
for (i = 1;i<=5;i++)
{ line(pstyle.x + 12 + 2/i, pstyle.y + 12,
pstyle.x + 14 + 18/i, pstyle.y + 22);}
break;}
}
3. Mô tả các chức năng chính :
Hàm main() khởi tạo mọi thứ :
void main()
{
kt_dohoa();
kt_mouse();
kt_bangve();
kt_mhve();
kt_bangmau();
hien_color(15);
hien_mouse();
run_run_run();
closegraph();
}
Sau khi khởi tạo xong thì chương trình chính sẽ gọi đến hàm run_run_run()
để bắt đầu chạy chương trình.
Hàm run_run_run() sẽ chạy liên tục khi finish = 0 và chỉ kết thúc khi nút
Exit được kích hoạt và finish =1.
Kiểm tra chuột:
- Nếu kich_mouse_trai() thì chương trình sẽ lấy vị trí kích mouse
(mouse_getXY(&nowX, &nowY);) và so sánh nếu đúng với vị trí nút nào
19
Website: http://www.docs.vn Email : [email protected] Tel : 0918.775.368
trên màn hình thì sẽ thay đổi stats của nút đó(để nút đó thành “ẩn”) đồng
thời hiện loại nút vẽ lên bstyle .
- Khi nha_mouse_trai() thì chương trình sẽ xác định nếu click mouse ở ô màu
vẽ thì chuyển màu đó thành màu hiện thời còn nếu click mouse ở ô chức
năng vẽ thì gọi các hàm tương ứng thực hiện chức năng vẽ .
- Các ô chức năng New, Save, Load, Help được thực hiện giống như các ô
chức năng vẽ .
Khi nút Exit được kích hoạt, finish = 1 thì chế độ đồ họa sẽ kết thúc và chương
trình chính sẽ gọi hàm closegraph() để đóng chế độ đồ họa trở về mode văn bản.
4. Giao diện và cách sử dụng :
Màn hình đồ họa của chương trình gồm 4 phần chính :
- Bảng chứa các ô chức năng vẽ.
- Bảng chứa các ô màu vẽ (16 màu).
- Các nút New, Save, Load, Help, Exit.
- Màn hình vẽ.
Sau khi khởi tạo chương trình người dùng sẽ sử dụng chuột để thao tác điều
khiển trên màn hình chương trình.
Đầu tiên khởi tạo màn hình vẽ sẽ có màu đen và ô màu vẽ mặc định là màu
trắng, người dùng sẽ chọn màu vẽ rồi chọn công cụ vẽ trong bảng ô chức năng.
Chọn xong, chương trình sẽ đưa con chuột đến trung tâm màn hình vẽ để
người dùng đồ họa và con trỏ chuột chỉ có thể di chuyển trong khung của màn hình
vẽ mà thôi. Để thoát khỏi chế độ vẽ hiện thời để chọn màu vẽ khác hoặc công cụ
vẽ khác thì người dùng phải click chuột phải.
Quá trình sẽ luôn tiếp diễn cho tới khi người dùng chọn nút Exit thì sẽ thoát
khỏi chương trình.
20