Đề tài Xây dựng chơng trình vẽ hình giống microsoft paint

Đồ 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.

doc23 trang | Chia sẻ: vietpd | Lượt xem: 1481 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Đề tài Xây dựng chơng trình vẽ hình giống microsoft paint, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
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 đề Mụ tả bài toỏn : 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. 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 đề Ngụn ngữ thực hiện : C/C++. Cỏc vấn đề và phương ỏn giải quyết : 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; 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); 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); } 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. 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; } 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 xp, int yp, int c, int style) { if (style == 1) { putpixel(xc + xp, yc - yp, c^getpixel(xc + xp, yc - yp)); putpixel(xc + xp, yc + yp, c^getpixel(xc + xp, yc + yp)); putpixel(xc - xp, yc + yp, c^getpixel(xc - xp, yc + yp)); putpixel(xc - xp, yc - yp, c^getpixel(xc - xp, yc - yp)); } else { putpixel(xc + xp, yc - yp, c); putpixel(xc + xp, yc + yp, c); putpixel(xc - xp, yc + yp, c); putpixel(xc - xp, yc - yp, 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; } } 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; } } } } Đố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); 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))); if (random(2)) y = -y; an_mouse(); if ((nowX+x>frameX)&(nowX+xframeY)&(nowY+y<frameY+frameH)) putpixel(nowX + x, nowY + y, ncolor); hien_mouse(); Hàm lưu lại hỡnh đang vẽ vào bộ nhớ và load hỡnh ra vẽ tiếp: Hàm size = imagesize( frameX , frameY , frameX + frameW , frameY + frameH/4 ) được khai bỏo dạng unsigned trả về số byte để lưu ảnh ẳ màn hỡnh. p[k]=(long*)malloc(size); p[k] trỏ tới vựng nhớ size byte mới được cấp phỏt ở trờn. Hàm getimage( frameX , frameY + (k-1)*(frameH/4) , frameX + frameW , frameY + k*(frameH/4) , p[k] ) được sử dụng để lưu lại cỏc điểm ảnh vào vựng nhớ do p[k] trỏ tới cú độ lớn bằng size. Hàm putimage(frameX ,frameY + (k-1)*(frameH/4), p[k] , COPY_PUT) dựng để sao ảnh lưu trong vựng nhớ ra màn hỡnh tại vị trớ (frameX ,frameY + (k-1)*(frameH/4)) theo kiểu sao chộp COPY_PUT. Hàm show_nut() được sử dụng để hiện ra màn hỡnh nỳt điều khiển được khai bỏo theo struct nut - Nếu stats của nỳt đk == 1 thỡ nỳt sẽ hiện ra dạng “nổi” cũn ngược lại nú sẽ hiện ra dạng “chỡm”: if (nbut.stats == 1) setcolor(15); else setcolor(8); for (i = 1; i <= nbut.b; i++) { line(nbut.x - i, nbut.y - i, nbut.x - i, nbut.y + nbut.h + i); line(nbut.x - i, nbut.y - i, nbut.x + nbut.w + i, nbut.y - i); } if (nbut.stats == 1) setcolor(8); else setcolor(15); for (i = 1; i <= nbut.b; i++) { line(nbut.x + i + nbut.w, nbut.y - i, nbut.x + i + nbut.w, nbut.y + nbut.h + i); line(nbut.x - i, nbut.y +i + nbut.h, nbut.x + nbut.w + i, nbut.y +i + nbut.h); } - Thiết lập màu chữ và hiện ra caption của nỳt: setcolor(0); outtextxy(nbut.x + 10, nbut.y + nbut.h / 2-3, nbut.cap); Hàm in_nut() trả về giỏ trị xỏc định vị trớ chuột khi click chuột cú thuộc vựng một nỳt đk nào: int in_nut(int nowX, int nowY, struct nut bclick) { return ((nowX>=bclick.x)&(nowX=bclick.y)&(nowY<=bclick.y+bclick.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 . 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); 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); } } 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); } 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; 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; 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); } 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); 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); 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); 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;} } 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 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. 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. Lời kết Chương trỡnh trờn của em đó mụ phỏng được gần giống giao diện và phương thức làm việc của phần mềm MS Paint trờn Windows : màn hỡnh đồ họa chia thành nhiều phần , cú giao diện điều khiển dựng chuột và khả năng vẽ cỏc hỡnh cơ bản… Nhưng những thiếu sút của chương trỡnh cũng cũn rất nhiều : cơ chế tụ màu cũn quỏ sơ sài, cơ chế save ảnh và load ảnh khụng hoàn thiện…Một phần do thời gian cấp bỏch (1 thỏng chuẩn bị) cựng với khả năng của bản thõn em cú giới hạn nờn chương trỡnh vẫn cũn nhiều sai sút. Vỡ vậy em mong nhận được nhiều ý kiến đúng gúp của cỏc Thầy và ý kiến phản hồi của cỏc bạn để em cú thể rỳt kinh nghiệm hoàn thành chương trỡnh. Một lần nữa em xin chõn thành cảm ơn. Tài liệu tham khảo 1. Giỏo trỡnh ngụn ngữ lập trỡnh . Khoa cụng nghệ tin học Viện Đại học Mở Hà nội 2. C++ & Lập trỡnh hướng đối tượng. GS.TS Phạm Văn Ất . Nhà xuất bản khoa học và kĩ thuật – 2006 3. Cỏc giỏo trỡnh sỏch điện tử trờn mạng Internet. Mục lục Lời giới thiệu 1 Phần 1 : Đặt vấn đề 2 1. Mụ tả bài toỏn 2 2.Yờu cầu chương trỡnh 2 Phần 2 : Giải quyết vấn đề 3 1. Ngụn ngữ thực hiện 3 2. Cỏc vấn đề và phương ỏn giải quyết 3 3. Mụ tả cỏc chức năng chớnh 19 4. Giao diện và cỏch sử dụng 20 L