Растровый графический редактор


Приложение 1. Исходные тексты программы

#include <winbgim. h>

#include <alloc. h>

#include <stdio. h>

Using namespace std;

Int COL=15, //основной цвет

FCOL=0, //цвет заливки

ACTION=0; //номер действия

Int dx=48,dy=1;

void position(int, int); //высвечивает координаты мыши

void position(int x, int y){

char cx[3],cy[3];

for(int i=2;i>=0;i--){

cy[i]=char(y%10+int('0'));

y=y/10;

cx[i]=char(x%10+int('0'));

x=x/10;

}

setfillstyle(1,0);

setcolor(1);

bar(0,522,550,550);

outtextxy(200,523,cx);

outtextxy(227,523,":");

outtextxy(237,523,cy);

bar(264,522,360,550);

}

//базовый класс для всех объектов

Class base{

protected:

int x, y; //координаты базовой точки

int size; //размеры

public:

base(int x, int y, int size): x(x), y(y), size(size) {}

bool check(int xx, int yy); //попадает ли курсор?

virtual void draw()=0; //рисует объект

virtual void LeftB()=0; //обработка нажатия левой кнопки

virtual void RightB(){}; //обработка нажатия правой кнопки

};

Bool base::check(int xx, int yy){

if(xx>=x &;&; xx<=x+size &;&; yy>=y &;&; yy<=y+size) return true;

return false;

}

//класс палитра

Class Pallet:public base{

int c; //номер цвета

public:

Pallet(int x=0,int y=0,int size=17,int c=0):base(x, y,size),c(c){};

void LeftB();

void RightB();

void draw();

void set(int xx, int yy, int cc){x=xx; y=yy; c=cc;}

};

Void Pallet::LeftB(){

COL=c;

}

Void Pallet::RightB(){

FCOL=c;

}

Void Pallet::draw(){

setfillstyle(1,c);

setcolor(BLACK);

rectangle(x-1,y-1,x+size, y+size);

setcolor(WHITE);

rectangle(x, y,x+size+1,y+size+1);

bar(x, y,x+size, y+size);

}

//кнопки

Class Button:public base{

int act; //номер действия соответствующего кнопке

public:

Button(int x=0,int y=0,int size=17,int act=0):base(x, y,size),act(act) {}

void draw();

void LeftB();

void set(int xx, int yy, int aact){x=xx; y=yy; act=aact;}

void select(); //выделяет кнопку при попадании на нее курсором

};

Void Button::LeftB(){

setcolor(3);

rectangle(x-1,y-1,x+19,y+19);

while(mousebuttons()==1){

}

ACTION=act;

setcolor(1);

rectangle(x-1,y-1,x+19,y+19);

}

Void Button::select(){

int xx=mousex();

int yy=mousey();

while(check(xx, yy) &;&; mousebuttons()==0){

xx=mousex();

yy=mousey();

setcolor(9);

rectangle(x-1,y-1,x+19,y+19);

}

setcolor(1);

rectangle(x-1,y-1,x+19,y+19);

}

Void Button::draw(){

void *ptr;

if(act==0){

ptr=loadBMP("pen. bmp");

}

if(act==1){

ptr=loadBMP("line. bmp");

}

if(act==2){

ptr=loadBMP("ec. bmp");

}

if(act==3){

ptr=loadBMP("frec. bmp");

}

putimage(x, y,ptr, AND_PUT);

}

//кнопки для работы с файлами

Class File:public base{

int f; //номер действия 1-сохранение, 0-вставка

public:

File(int x=0,int y=0,int size=17,int f=0): base(x, y,size), f(f) {}

void set(int xx, int yy, int ff){x=xx; y=yy; f=ff;}

void draw();

void LeftB();

void select();

};

Void File::draw(){

void *ptr;

if(f==0){

ptr=loadBMP("load. bmp");

}

if(f==1){

ptr=loadBMP("save. bmp");

}

putimage(x, y,ptr, AND_PUT);

}

void File::LeftB(){

char c[200];

void *ptr;

if(f==0){

printf("Введите адрес файла, который хотите загрузить");

scanf("%s",c);

ptr=loadBMP(c);

putimage(dx, dy, ptr, COPY_PUT);

free(ptr);

}

if(f==1){

size=imagesize(dx, dy,550+dx,520+dy);

ptr=malloc(size);

printf("Введите адрес, куда нужно сохранить файл");

scanf("%s",c);

getimage(dx, dy, 550+dx, 520+dy, ptr);

saveBMP(c, ptr, 24);

free(ptr);

}

}

void File::select(){

int xx=mousex();

int yy=mousey();

while(check(xx, yy) &;&; mousebuttons()==0){

xx=mousex();

yy=mousey();

setcolor(9);

rectangle(x-1,y-1,x+19,y+19);

}

setcolor(1);

rectangle(x-1,y-1,x+19,y+19);

}

//поле

Class Field:public base{

public:

Field(int x, int y, int size): base(x, y,size){}

void draw();

void LeftB();

void RightB();

};

Void Field::draw(){

setfillstyle(1,WHITE);

bar(x, y,x+size, y+size);

}

Void Field::LeftB(){

int x1, y1,xx, yy;

void *ptr;

unsigned int size;

setcolor(COL);

setfillstyle(1,FCOL);

xx=mousex()-dx;

yy=mousey()-dy;

if(ACTION==0){ //свободное рисование

moveto(xx, yy);

while(mousebuttons()==1){

x1=mousex()-dx;

y1=mousey()-dy;

setcolor(COL);

lineto(x1,y1);

if(check(x1+dx, y1+dy)) position(x1,y1);

}

xx=x1;

yy=y1;

}

else{

xx=mousex()-dx;

yy=mousey()-dy;

moveto(xx, yy);

size=imagesize(0,0,550,521);

ptr=malloc(size);

getimage(0, 0, 550, 521, ptr);

while(mousebuttons()==1){

if(x1!=mousex()-dx || y1!=mousey()-dy){

putimage(0,0, ptr, COPY_PUT);

free(ptr);

x1=mousex()-dx;

y1=mousey()-dy;

size=imagesize(0,0,550,521);

ptr=malloc(size);

getimage(0, 0, 550, 521, ptr);

setcolor(COL);

setfillstyle(1,FCOL);

if(ACTION==1){ //рисование линий

line(xx, yy, x1,y1);

}

if(ACTION==2){ //рисование незакрашенных прямоугольников

rectangle(xx, yy, x1,y1);

}

if(ACTION==3){ //рисование закрашенных прямоугольников

bar(xx, yy, x1,y1);

rectangle(xx, yy, x1,y1);

}

delay(40);

if(check(x1+dx, y1+dy)) position(x1,y1);

}

}

}

};

Void Field::RightB(){

int x1, y1,xx, yy;

void *ptr;

unsigned int size;

setcolor(FCOL);

setfillstyle(1,COL);

xx=mousex()-dx;

yy=mousey()-dy;

if(ACTION==0){

moveto(xx, yy);

while(mousebuttons()==2){

x1=mousex()-dx;

y1=mousey()-dy;

setcolor(FCOL);

lineto(x1,y1);

if(check(x1+dx, y1+dy)) position(x1,y1);

}

xx=x1;

yy=y1;

}

else{

xx=mousex()-dx;

yy=mousey()-dy;

moveto(xx, yy);

size=imagesize(0,0,550,521);

ptr=malloc(size);

getimage(0, 0, 550, 521, ptr);

while(mousebuttons()==2){

if(x1!=mousex()-dx || y1!=mousey()-dy){

putimage(0,0, ptr, COPY_PUT);

free(ptr);

x1=mousex()-dx;

y1=mousey()-dy;

size=imagesize(0,0,550,521);

ptr=malloc(size);

getimage(0, 0, 550, 521, ptr);

setcolor(FCOL);

setfillstyle(1,COL);

if(ACTION==1){

line(xx, yy, x1,y1);

}

if(ACTION==2){

rectangle(xx, yy, x1,y1);

}

if(ACTION==3){

bar(xx, yy, x1,y1);

rectangle(xx, yy, x1,y1);

}

delay(40);

if(check(x1+dx, y1+dy)) position(x1,y1);

}

}

}

};

Int main(){

int i, x,y;

bool Exit=true;

initwindow(600,550);

setfillstyle(1,1);

bar(1,1,45,540);

Pallet a[16]; //палитра

Field b(48,1,550); //поле рисования

File d[2]; //кнопки работы с файлами

Button c[4]; //кнопки рисования

for(i=0;i<2;i++){ //рисует кнопки

c[i].set(4,20+i*21,i);

c[i].draw();

c[i+2].set(4+21,20+i*21,i+2);

c[i+2].draw();

}

for(i=0;i<8;i++){ //рисует палитру

a[i].set(4,182+i*21,i);

a[i].draw();

a[i+8].set(4+21,182+i*21,i+8);

a[i+8].draw();

}

//рисует кнопки чтения/записи

d[0].set(4,62,0);

d[0].draw();

d[1].set(25,62,1);

d[1].draw();

//рисует кнопку выхода

Setcolor(0);

outtextxy(6,3,"EXIT");

//рисует цвет фона и заливки

setcolor(COL);

rectangle(7,111,39,128);

rectangle(8,112,38,127);

rectangle(9,113,37,126);

setfillstyle(1,FCOL);

bar(10,114,36,125);

while(Exit){

x=mousex(); //считывает координаты курсора

y=mousey();

if(x>6 &;&; x<45 &;&; y>2 &;&; y<20){ //обработка действий с кнопкой выхода

if(mousebuttons()==1) {Exit=false;}

else{

setcolor(9);

rectangle(3,2,44,18);

while(x>6 &;&; x<45 &;&; y>2 &;&; y<20 &;&; mousebuttons()==0){

x=mousex();

y=mousey();

}

setcolor(1);

rectangle(3,2,44,18);

}

}

for(i=0;i<16;i++){ //обработчик нажатия на кнопки палитры

if(a[i].check(x, y) &;&; mousebuttons()==1){

a[i].LeftB();

setcolor(COL);

rectangle(7,111,39,128);

rectangle(8,112,38,127);

rectangle(9,113,37,126);

}

if(a[i].check(x, y) &;&; mousebuttons()==2){

a[i].RightB();

setfillstyle(1,FCOL);

bar(10,114,36,125);

}

}

for(i=0;i<4;i++){ //обработчик нажатия на кнопки рисования

if(c[i].check(x, y)){

c[i].select();

if(mousebuttons()==1) c[i].LeftB();

}

}

for(i=0;i<2;i++){ //обработчик нажатия на кнопки работы с файлами

if(d[i].check(x, y)){

d[i].select();

if(mousebuttons()==1) d[i].LeftB();

}

}

if(b. check(x, y)){ //обработчик действий в поле рисования

if(mousebuttons()==1){

setviewport(dx, dy, 550+dx+1, 550+dy+1, 1);

b. LeftB();

setviewport(0,0,551,551,1);

}

if(mousebuttons()==2){

setviewport(dx, dy, 550+dx+1, 550+dy+1, 1);

b. RightB();

setviewport(0,0,551,551,1);

}

setviewport(dx, dy, 550+dx+1, 550+dy+1, 1);

position(x-dx, y-dy); //вывод координат мыши

setviewport(0,0,551,551,1);

}

delay(40);

}

closegraph();

return 0;

}

Похожие статьи




Растровый графический редактор

Предыдущая | Следующая