📄 graph.h
字号:
#if !defined graphheadfile
#define graphheadfile
/***************************************************************/
#include <graphics.h>
#include <conio.h>
#include <math.h>
#include <dos.h>/*调用函数:int86()'注:中断'鼠标操作时用*/
union REGS regs;/*鼠标操作时用*/
int color[16]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
void*mimage;
/***************************************************************/
void arrowhead(int x,int y);/*箭头*/
void buttonup(int sx,int sy,int mx,int my);/*绘制按钮(抬起)*/
void buttondn(int sx,int sy,int mx,int my);/*绘制按钮(按下)*/
void clbutton(int sx,int sy,int mx,int my);/*清除在点(sx,sy),(mx,my)之间矩形区域内的按钮*/
void clwinrect(int sx,int sy,int mx,int my);/*清除在点(sx,sy),(mx,my)之间矩形区域内的windows框*/
void initm(int xmi,int ymi,int xma,int yma);/*初始化设定鼠标移动范围*/
void loadmimage(int x,int y);
void menupad(int sx,int sy,int mx,int my,int type);/*绘制菜单面板type 0:无标题栏;type 1:有标题栏*/
int messagebox(int x0,int y0,int x1,int y1,char*message);/*消息提示框*/
void movem(int x,int y);/*手动移动鼠标*/
void opbar(int x0,int y0,int x1,int y1);/*反色方条*/
void oppixel(int x,int y);/*在(x,y)处绘制反色点*/
void opline(int x0,int y0,int x1,int y1);/*绘制反色线(包含oppixel)*/
void oprect(int x0,int y0,int x1,int y1);/*反色矩形*/
void putmimage(int x,int y);
void putnumxy(int x,int y,float num,int type);/*在屏幕上打印数字*/
void readm(int*x,int*y,int*button);/*读取鼠标状态*/
void winrect(int sx,int sy,int mx,int my);/*在点(sx,sy),(mx,my)之间的矩形区域,添加一个模拟Windows的框*/
/***************************************************************/
/* 格式:s e t c o l o r < >< 红> < 绿> < 蓝> */
#include<dos.h>
#include<stdlib.h>
#include<stdio.h>
void setregscolor(int colornum,int read0,int green0,int blue0)
{
union REGS r;
int num[]={0,1,2,3,4,5,20,7,56,57,58,59,60,61,62,63};
outportb(0x3c8,num[colornum%16]) ;
outportb(0x3c9,read0) ;
outportb(0x3c9,green0) ;
outportb(0x3c9,blue0) ;
}
void oparrowhead(int x,int y)/*反色箭头*/
{
opline(x,y,x+10,y+10);
opline(x+10,y+10,x+5,y+10);
opline(x+6,y+11,x+9,y+18);
opline(x+6,y+17,x+3,y+11);
opline(x+3,y+12,x,y+15);
opline(x,y+15,x,y);
oppixel(x+7,y+18);
}
void arrowhead(int x,int y)/*箭头*/
{
int n;
setcolor(15);
setlinestyle(0,0,1);
for(n=1;n<10;n++)
line(x+n,y+n,x+n,y+9);
for(n=12;n>9;n--)
line(x+13-n,y+n,x+13-n,y+9);
line(x+7,y+16,x+4,y+10);
line(x+6,y+16,x+3,y+10);
setcolor(0);
line(x,y,x+10,y+10);
line(x+10,y+10,x+5,y+10);
line(x+8,y+16,x+5,y+10);
line(x+6,y+17,x+3,y+11);
line(x+3,y+11,x,y+14);
line(x,y+14,x,y);
line(x+7,y+17,x+8,y+17);
}
/*-------------------------------------------------------------*/
void buttonup(int sx,int sy,int mx,int my)/*在点(sx,sy),(mx,my)之间的矩形区域内,添加一个突起的按钮*/
{
if(my<sy+17)my=sy+17;
if(mx<sx+30)mx=sx+30;
/* setfillstyle(1,7);
bar(sx,sy,mx,my);*/
/*以下模拟Windows按钮*/
setcolor(15);
rectangle(sx,sy,mx,my);
setcolor(7);
rectangle(sx+1,sy+1,mx-1,my-1);
setcolor(0);
line(sx,my,mx,my);
line(mx,sy,mx,my);
setcolor(8);
line(sx+1,my-1,mx-1,my-1);
line(mx-1,sy+1,mx-1,my-1);
}
/*-------------------------------------------------------------*/
void buttondn(int sx,int sy,int mx,int my)/*在点(sx,sy),(mx,my)之间的矩形区域内,添加一个按下的按钮*/
{
if(my<sy+17)my=sy+17; /*保证纵坐标最大数比最小数大17*/
if(mx<sx+30)mx=sx+30; /*保证横坐标最大数比最小数大30(即:按钮的最小尺寸为30X17)*/
/* setfillstyle(1,7);
bar(sx,sy,mx,my);*/ /*如果去掉注释号按钮将以覆盖的模式出现,本程序按钮均为非覆盖模式,不覆盖原有的图形*/
/*以下模拟Windows按钮*/
setcolor(0); /*设定当前绘图颜色(背景色:黑)*/
rectangle(sx,sy,mx,my); /*在点(sx,sy),(mx,my)之间的矩形区域画方形边框*/
setcolor(15); /*设定当前绘图颜色(白)*/
line(sx,my,mx,my); /*在点(sx,my),(mx,my)之间画线*/
line(mx,sy,mx,my); /*在点(mx,sy),(mx,my)之间画线*/
setcolor(7); /*设定当前绘图颜色(浅灰)*/
line(sx+1,my-1,mx-1,my-1); /*在点(sx+1,my-1),(mx-1,my-1)之间画线*/
line(mx-1,sy+1,mx-1,my-1); /*在点(mx-1,sy+1),(mx-1,my-1)之间画线*/
setcolor(8); /*设定当前绘图颜色(深灰)*/
line(sx+1,sy+1,mx-2,sy+1); /*在点(sx+1,sy+1),(mx-2,sy+1)之间画线*/
line(sx+1,sy+1,sx+1,my-2); /*在点(sx+1,sy+1),(sx+1,my-2)之间画线*/
}
/*-------------------------------------------------------------*/
void clbutton(int sx,int sy,int mx,int my)/*清除在点(sx,sy),(mx,my)之间矩形区域内的按钮*/
{
if(my<sy+17)my=sy+17;
if(mx<sx+30)mx=sx+30;
setlinestyle(0,0,1); /*设定线型*/
rectangle(sx,sy,mx,my);
rectangle(sx+1,sy+1,mx-1,my-1);
}
/*-------------------------------------------------------------*/
void clwinrect(int sx,int sy,int mx,int my)
{
rectangle(sx,sy,mx,my);
rectangle(sx+1,sy+1,mx-1,my-1);
}
/*-------------------------------------------------------------*/
void initm(int xmi,int ymi,int xma,int yma)/*初始化设定鼠标移动范围*/
{
regs.x.ax=7;
regs.x.cx=xmi;
regs.x.dx=xma;
int86(51,®s,®s);
regs.x.ax=8;
regs.x.cx=ymi;
regs.x.dx=yma;
int86(51,®s,®s);
mimage=malloc(imagesize(0,0,18,10));
}
/*-------------------------------------------------------------*/
void loadmimage(int x,int y)
{
getimage(x,y,x+10,y+18,mimage);
}
/*-------------------------------------------------------------*/
void menupad(int sx,int sy,int mx,int my,int type)/*在点(sx,sy),(mx,my)之间的矩形区域内,画一个菜单面板,type 偶:无标题栏;type 奇:有标题栏;type>1:有忖底*/
{
if(type<0)type=-type;/*防止错误输入*/
if(my<sy+25)my=sy+25;/*设定菜单盘的最小范围*/
if(mx<sx+30)mx=sx+30;
if(type>1)
{
setfillstyle(1,7);/*设定填充模式*/
bar(sx,sy,mx,my);/*显示菜单盘*/
}
setcolor(0);
line(sx,my,mx,my);
line(mx,sy,mx,my);
setcolor(8);
line(sx+1,my-1,mx-1,my-1);
line(mx-1,sy+1,mx-1,my-1);
setcolor(15);
line(sx+1,sy+1,sx+1,my-2);
line(sx+1,sy+1,mx-2,sy+1);
if(type%2)/*如果有标题栏,则显示蓝框*/
{
setfillstyle(1,1);
bar(sx+4,sy+4,mx-4,sy+17);
}
}
/*-------------------------------------------------------------*/
int messagebox(int x0,int y0,int x1,int y1,char*message)/*消息提示框*/
{
void *buffer;
int re;
float size;
if(x0>x1)x0=x0+x1,x1=x0-x1,x0=x0-x1;
if(y0>y1)y0=y0+y1,y1=y0-y1,y0=y0-y1;
size=((float)(x1-x0))*((float)(y1-y0));
if(size>60000)
{
x1=x0+300;
y1=y0+200;
}
else if(size<3200)
{
x1=x0+80;
y1=y0+40;
}
buffer=malloc(imagesize(x0,y0,x1,y1));
getimage(x0,y0,x1,y1,buffer);
menupad(x0,y0,x1,y1,3);
setcolor(15);
outtextxy(x0+8,y0+8,"Message!");
setcolor(color[0]);
outtextxy(x0+20,(y0+y1)/2,message);
re=getch();
putimage(x0,y0,buffer,COPY_PUT);
free(buffer);
buffer=0;
return re;
}
/*-------------------------------------------------------------*/
void movem(int x,int y)/*手动移动鼠标*/
{
regs.x.ax=4;
regs.x.cx=x;
regs.x.dx=y;
int86(51,®s,®s);
}
/*-------------------------------------------------------------*/
void opbar(int x0,int y0,int x1,int y1)/*反色方条*/
{
int x,y;
if(x0>x1)
{
x0+=x1;
x1=x0-x1;
x0-=x1;
}
if(y0>y1)
{
y0+=y1;
y1=y0-y1;
y0-=y1;
}
for(x=x0;x<=x1;x++)
for(y=y0;y<=y1;y++)
oppixel(x,y);
}
/*-------------------------------------------------------------*/
void oppixel(int x,int y)/*在(x,y)处绘制反色点*/
{
int color,xmax=640,ymax=480;
if(x<=xmax&&x>=0&&y<=ymax&&y>=0)
putpixel(x,y,15-getpixel(x,y));
}
/*-------------------------------------------------------------*/
void opline(int x0,int y0,int x1,int y1)/*绘制反色线*/
{
int x,y;
int dy,dx;
if(y1==y0&&x1!=x0)
{
dx=(x1-x0)/abs(x1-x0);
for(x=x0;x!=x1;x+=dx)
oppixel(x,y0);
/*oppixel(x1,y1);*/
return;
}
else if(x1==x0&&y1!=y0)
{
dy=(y1-y0)/abs(y1-y0);
for(y=y0;y!=y1;y+=dy)
oppixel(x0,y);
/*oppixel(x1,y1);*/
return;
}
else if(y1!=y0&&abs(y1-y0)>=abs(x1-x0))
{
int xt=x0;
dy=(y1-y0)/abs(y1-y0);
for(y=y0;y!=y1;y+=dy)
{
xt=(int)((float)(y-y0)*(float)(x1-x0)/(float)(y1-y0))+x0;
oppixel(xt,y);
}
/*if(x1!=x0||y1!=y0)
oppixel(x1,y1);*/
return;
}
else if(x1!=x0&&abs(y1-y0)<abs(x1-x0))
{
int yt=y0;
dx=(x1-x0)/abs(x1-x0);
for(x=x0;x!=x1;x+=dx)
{
yt=(int)((float)(x-x0)*(float)(y1-y0)/(float)(x1-x0))+y0;
oppixel(x,yt);
}
/*if(x1!=x0||y1!=y0)
oppixel(x1,y1);*/
return;
}
}
/*-------------------------------------------------------------*/
void oprect(int x0,int y0,int x1,int y1)/*反色矩形*/
{
opline(x0,y0,x1,y0);
opline(x1,y0,x1,y1);
opline(x1,y1,x0,y1);
opline(x0,y1,x0,y0);
}
/*-------------------------------------------------------------*/
void putmimage(int x,int y)
{
putimage(x,y,mimage,COPY_PUT);
}
/*-------------------------------------------------------------*/
void putnumxy(int x,int y,float num,int type)/*在屏幕上打印数字*/
{
char s[30];/*开辟一个字符串*/
if(type<0)type=-type;/*防止错误输入*/
type=type%2;
if(type)sprintf(s,"%f",num);/*如果type==1浮点输出*/
else if(!type)sprintf(s,"%0.0f",num);/*如果type!=1整数输出*/
outtextxy(x,y,s);
}
/*-------------------------------------------------------------*/
void readm(int *mx,int *my,int *mbutt)/*读取鼠标状态*/
{
int xnew,ynew,bnew/*,x0=*mx,y0=*my,b0=*mbutt*/;
regs.x.ax=3;
/* do*/
{
int86(51,®s,®s);
xnew=regs.x.cx;
ynew=regs.x.dx;
bnew=regs.x.bx;
}
/* while(xnew==x0&&ynew==y0&&bnew==b0);*/
*mbutt=bnew;
*mx=xnew;
*my=ynew;
}
/*-------------------------------------------------------------*/
void winrect(int sx,int sy,int mx,int my)/*在点(sx,sy),(mx,my)之间的矩形区域,添加一个模拟Windows的框*/
{
if(mx<sx+36)mx=sx+36;/*设定最小范围*/
if(my<sy+23)my=sy+23;
setcolor(15);
rectangle(sx+1,sy+1,mx,my);
putpixel(mx,sy,15);
putpixel(sx,my,15);
setcolor(8);
rectangle(sx,sy,mx-1,my-1);
}
/***************************************************************/
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -