Новичок
Профиль
Группа: Участник
Сообщений: 1
Регистрация: 10.1.2015
Репутация: нет Всего: нет
|
Приветствую! Понадобилось срочная реализация небольшой задачи, а для реализации знаний нет и на разбор времени нету. Задача:При запуске программы появляется окно с текстом в рамке "программирования видеоадаптеров (текстовый и графический режим)", при нажатии клавиш " правый Alt+Q" осуществляется переход к окну для ввода цвета восьмиугольника и цвета фона (реализовать возможность выбора цвета из определенного диапазона), далее при нажатии той же комбинации клавиш осуществляется переход к экрану для рисования восьмиугольника. Рисование осуществляется мышью (левой клавишей). Необходимо реализовать возможность выделять мышкой графический примитив, перемещать его с помощью комбинации кнопок " правый Ctrl+клавиши стрелки". Язык программирования: С, Assembler. Для программирования видеоадаптера в текстовом и графическом режиме использовать функции BIOS через прерывание int 10h, для программирования мыши – функции BIOS через прерывание int 33h, для программирования клавиатуры – функции BIOS через прерывание int 16h. Для программирования на языке Assembler предлагается использовать Turbo Assembler Version 3.0, а для программирования на языке Си – Turbo C++ 3.0. Есть очень похожий пример: тут рисуется скругленный четырехугольник и используются другие клавиши: "Левый Alt+T" и "правый Ctrl+клавиши стрелки" Код | int isrctrl() { int r; asm{ mov ah,2h int 16h and ax,4h mov r,ax } return !!r; }
void setvideomode(char mode) { asm{ mov ah,0 mov al,mode int 10h } }
int shiftstatus(void) { int r; asm{ mov ah,12h int 16h mov r,ax } return r; }
void setpixel(int x,int y,int c) { asm{ mov ah,0ch mov al,byte ptr c mov bh,0 mov cx,x mov dx,y int 10h } }
void setcurpos(int x,int y) { asm{ mov ah,2 mov bh,0 mov dh,byte ptr y mov dl,byte ptr x int 10h } }
void putchar(char c,int col) { asm{ mov ah,0eh mov al,c mov bl,byte ptr col int 10h } }
void textout(char *txt,int col) { for(;*txt;txt++) putchar(*txt,col); }
waitkey(void) { int r; asm{ mov ah,10h int 16h mov r,ax } return r; } void showmouse(void) { asm{ mov ax,1 int 33h } } void hidemouse(void) { asm{ mov ax,2 int 33h } } int ismousepressed() { int r; asm{ mov ax,3 int 33h and bx,1 mov r,bx } return r; }
int getmousex() { int r; asm{ mov ax,3 int 33h mov r,cx } return r; }
int getmousey() { int r; asm{ mov ax,3 int 33h mov r,dx } return r; }
int state=0; char about[]=" ЙННННННННННННННННННННННННННННННННННННННННННННННННН»\r\n" " є " є є\r\n" " є є\r\n" " є є\r\n" " є є\r\n" " є программирования видеоадаптеров (текстовый и графический режим) є\r\n" " є є\r\n" " є є\r\n" " є є\r\n" " ИНННННННННННННННННННННННННННННННННННННННННННННННННј"; char ramka[]=" ЙННННННННННННННННННННННННННННННННННННННННННННННННН»\r\n" " є є\r\n" " є є\r\n" " є є\r\n" " є є\r\n" " є є\r\n" " є є\r\n" " є є\r\n" " є є\r\n" " є є\r\n" " є є\r\n" " є є\r\n" " ИНННННННННННННННННННННННННННННННННННННННННННННННННј";
int min(int a,int b) { return a<b?a:b; } int max(int a,int b) { return a>b?a:b; } void rect(int x1, int y1,int x2,int y2, int c) { int t,r; int x,y,d; if(x1>x2) { t=x1; x1=x2; x2=t; } if(y1>y2) { t=y1; y1=y2; y2=t; } r=min(y2-y1,x2-x1)/2; if(r>10) r=10; d=3-2*r; x=0; y=r; while(x <= y) { //right-lower setpixel(x+x2-r,y+y2-r,c); setpixel(y+x2-r,x+y2-r,c);
//right-upper setpixel(x+x2-r,-y+y1+r,c); setpixel(y+x2-r,-x+y1+r,c);
//left-upper setpixel(-x+x1+r,-y+y1+r,c); setpixel(-y+x1+r,-x+y1+r,c); //left-lower setpixel(-x+x1+r,y+y2-r,c); setpixel(-y+x1+r,x+y2-r,c); if(d<0) d=d+4*x+6; else { d=d+4*(x-y)+10; y--; } x++; } for(x=x1+r;x<=x2-r;x++) { setpixel(x,y1,c); setpixel(x,y2,c); } for(y=y1+r;y<=y2-r;y++) { setpixel(x1,y,c); setpixel(x2,y,c); } }
int kbhit() { int r; asm{ mov ah,11h int 16h jz nokeys mov r,1 jmp kbex } nokeys: r=0; kbex: return r; }
int main() { int k,i,j,c,x,y,x2,y2; int figc,bg; char buf[8]; setvideomode(0x12); textout(about,14); do { k=waitkey(); } while(k!=0x1400); setvideomode(0x12); c=0; x=22; y=10; setcurpos(0,y-2); textout(ramka,15); for(i=0;i<4;i++) { for(j=0;j<4;j++) { setcurpos(j*10+x+2,i*2+y-1); putchar(c<10?c+'0':c+'7',15); setcurpos(j*10+x,i*2+y); for(k=0;k<5;k++) putchar(0xdb,c); c++; } } setcurpos(x,y+8); textout("Figure color (0-F): ",15); do { k=waitkey(); k&=0xff; } while(!((k>='0'&&k<='9')||(k>='A'&&k<='F')||(k>='a'&&k<='f'))); if(k>='a'&&k<='f') k-=0x20; putchar(k,15); if(k>'9') k-=7; figc=k-'0';
setcurpos(x,y+9); textout("Background color (0-F): ",15); do { k=waitkey(); k&=0xff; } while(!((k>='0'&&k<='9')||(k>='A'&&k<='F')||(k>='a'&&k<='f'))); if(k>='a'&&k<='f') k-=0x20; putchar(k,15); if(k>'9') k-=7; bg=k-'0'; do { k=waitkey(); } while(k!=0x1400); setvideomode(0x12); asm{ mov ax,1007h mov bl,byte ptr bg int 10h mov ax,1000h mov bl,0 int 10h } showmouse(); x=y=x2=y2=0; while(1) { if(ismousepressed()) { x2=x=getmousex(); y2=y=getmousey();
while(ismousepressed()) { hidemouse(); rect(x,y,x2,y2,0); x2=getmousex(); y2=getmousey(); rect(x,y,x2,y2,figc); showmouse(); } } if(kbhit()) { k=waitkey(); if(k==0x1400) break; if(isrctrl()) { switch(k) { case 0x8de0: //up if(min(y,y2)) { rect(x,y,x2,y2,0); y2--; y--; rect(x,y,x2,y2,figc);
} break; case 0x73e0: //left if(min(x,x2)) { rect(x,y,x2,y2,0); x2--; x--; rect(x,y,x2,y2,figc); } break; case 0x91e0: //down if(max(y,y2)!=479) { rect(x,y,x2,y2,0); y2++; y++; rect(x,y,x2,y2,figc);
} break; case 0x74e0: //right if(max(x,x2)!=639) { rect(x,y,x2,y2,0); x2++; x++; rect(x,y,x2,y2,figc);
} break; } } } }
setvideomode(3); return 0; }
|
Это сообщение отредактировал(а) i2save - 10.1.2015, 20:54
|