1. Trang chủ
  2. » Luận Văn - Báo Cáo

Xây dựng chương trình vẽ hình giống microsoft paint

23 1,6K 15
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 23
Dung lượng 79,5 KB

Nội dung

Xây dựng chương trình vẽ hình giống microsoft paint

Trang 1

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ấtcủ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ãnnă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ươngtrì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ộngrã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ủaWindows 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 :

Trang 2

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ó:

- 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ìnhvuô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++.

Trang 3

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:

- Khai báo biến con trỏ để lấy vị trí chuột :

void mouse_getXY(int *mouseX, int *mouseY)

Trang 5

} else return 0;

}

- Kiểm soát việc di chuyển chuột:

void mouse_move(int mouseX, int mouseY)

- Đố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

Trang 6

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 )

if (style == 1) putpixel(sx, sy,

c^getpixel(sx, sy)); else putpixel(sx, sy, c);

Trang 7

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);

Trang 8

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;

Trang 9

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)

putpixel(nowX + x, nowY + y, ncolor);

hien_mouse();

e) Hàm lưu lại hình đang vẽ vào bộ nhớ và load hình ra vẽ tiếp:

Trang 10

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àmgetimage( 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

f) 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

line(nbut.x - i, nbut.y +i + nbut.h, nbut.x +

nbut.w + i, nbut.y +i + nbut.h);

}

Trang 11

- Thiết lập màu chữ và hiện ra caption của nút:

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 :

pcolor[0].w, pcolor[0].y + pcolor[0].h);

for (i = 1; i<= 7; i++)

Trang 12

pcolor[8].w, pcolor[8].y + pcolor[8].h);

for (i = 9; i<= 15; i++)

Trang 16

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++)

Trang 17

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);

Trang 18

{ line(pstyle.x + 12 + 2/i, pstyle.y + 12,

pstyle.x + 14 + 18/i, pstyle.y + 22);}

Trang 19

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

Trang 20

- Các nút New, Save, Load, Help, Exit.

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

Trang 21

Chương trình trên của em đã mô phỏng được gần giống giao diện và phươngthức làm việc của phần mềm MS Paint trên Windows : màn hình đồ họa chia thànhnhiề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

Trang 22

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.

Trang 23

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ời kết 21

Tài liệu tham khảo 22

Mục lục 23

Ngày đăng: 17/08/2012, 07:05

HÌNH ẢNH LIÊN QUAN

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 : - Xây dựng chương trình vẽ hình giống microsoft paint
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 : (Trang 5)
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: - Xây dựng chương trình vẽ hình giống microsoft paint
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: (Trang 13)

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w