📄 atoolfun.cpp
字号:
//---------------------------------------//
// 工程文件: ARON.PRJ
// 程序: TOOLFUN.CPP
// 功能: 图形处理工具函数集
// 时间: 97,9,24
// 作者: 胡丙龙
//---------------------------------------//
#include <alloc.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <graphics.h>
#include <process.h>
#include <conio.h>
#include <dos.h>
#include "afun.h"
#include "adps.h"
extern char filename[13];
extern DPS *head;
extern FILE *fp16;
//------------------------------//
// 函数: OpenLIB()
// 功能: 打开16点阵汉字库
// 入口参数:
// 出口参数:
//------------------------------//
int OpenLIB(void)
{
if((fp16=fopen("ahzk16","rb"))==NULL) return 0;
return 1;
}
//------------------------------------//
// 函数: PutCC16()
// 功能: 图形方式下显示16点阵汉字
// 入口参数:
// wid:字符间距
// color:字符颜色
// str:英汉字符串
// 出口参数:
//------------------------------------//
void PutCC16(int x,int y,int wid,int color,char *str)
{
unsigned zcode,bcode; //区码,位码
int i,j,k,rec;
long len;
char buf[32],oldcolor,bb[2];
oldcolor=getcolor();
while(*str) //直到字符串显示完
{
if ((*str&0x80)&&(*(str+1)&0x80)) //是汉字
{
zcode=(*str-0xa1)&0x07f; //区码
bcode=(*(str+1)-0xa1)&0x07f; //位码
rec=zcode*94+bcode; //记录号
len=rec*32L; //在字库中的位置
fseek(fp16,len,SEEK_SET);
fread(buf,1,32,fp16); //32字节
for(i=0;i<16;i++) //垂直方向16点
for(j=0;j<2;j++) //水平方向2字节
for(k=0;k<8;k++) //每字节8位
if (buf[i*2+j]>>(7-k)&1) //是1则画点
putpixel(x+j*8+k,y+i,color);
x=x+16+wid;
str+=2;
}
else //是ASCII码
{
setcolor(color);
sprintf(bb,"%c",*str); //输出
settextstyle(DEFAULT_FONT,HORIZ_DIR,1);
outtextxy(x,y+4,bb);
x=x+8+wid;
str++;
}
}
setcolor(oldcolor);
return;
}
//-------------------------------------//
// 函数: Box1()
// 功能: 画立体按钮
// 入口参数:
// x,y:立体按钮左上角的坐标
// len:立体按钮长度
// high:立体按钮高度
// 出口参数:
//-------------------------------------//
void Box1(int x,int y,int len,int high)
{
setfillstyle(1,0);
bar(x,y,x+len,y+high);
setcolor(7);
rectangle(x,y,x+len,y+high);
setcolor(15);
line(x+2,y+2,x+len-3,y+2);
line(x+2,y+2,x+2,y+high-3);
line(x+3,y+3,x+len-4,y+3);
line(x+3,y+3,x+3,y+high-4);
setfillstyle(1,7);
bar(x+4,y+4,x+len-5,y+high-5);
}
//----------------------------------------------//
// 函数: PrsBox1()
// 功能: 动态模拟,立体按钮有被按下的视觉效果
// 入口参数:
// x,y:立体按钮左上角的坐标
// len:立体按钮长度
// high:立体按钮高度
// 出口参数:
//----------------------------------------------//
void PrsBox1(int x,int y,int len,int high)
{
setcolor(0);
line(x+2,y+2,x+len-3,y+2);
line(x+2,y+2,x+2,y+high-3);
line(x+3,y+3,x+len-4,y+3);
line(x+3,y+3,x+3,y+high-4);
setcolor(15);
line(x+len-2,y+high-2,x+len-2,y+3);
line(x+len-2,y+high-2,x+2,y+high-2);
line(x+len-3,y+high-3,x+len-3,y+4);
line(x+len-3,y+high-3,x+3,y+high-3);
setcolor(7);
line(x+len-4,y+high-4,x+len-4,y+4);
line(x+len-4,y+high-4,x+4,y+high-4);
line(x,y,x+len,y);
line(x,y,x,y+high);
}
//----------------------------------------------//
// 函数: PopUp1()
// 功能: 动态模拟,立体按钮有弹起的视觉效果
// 入口参数:
// x,y:立体按钮左上角的坐标
// len:立体按钮长度
// high:立体按钮高度
// 出口参数:
//----------------------------------------------//
void PopUp1(int x,int y,int len,int high)
{
setcolor(15);
line(x+2,y+2,x+len-3,y+2);
line(x+2,y+2,x+2,y+high-3);
line(x+3,y+3,x+len-4,y+3);
line(x+3,y+3,x+3,y+high-4);
setcolor(0);
line(x+len-2,y+high-2,x+len-2,y+3);
line(x+len-2,y+high-2,x+2,y+high-2);
line(x+len-3,y+high-3,x+len-3,y+4);
line(x+len-3,y+high-3,x+3,y+high-3);
}
//----------------------------------------------------//
// 函数: Get1stPoint()
// 功能: 通过鼠标在屏幕上得到一个点,提示符是X型光标
// 入口参数:
// x,y:点坐标(形参)
// 出口参数:
// x,y:点坐标
//----------------------------------------------------//
int Get1stPoint(int *x,int *y)
{
int btn,oldx,oldy;
int x1,y1;
int first=TRUE;
char ver[4],hor[4];
btn=0;
oldx=320;
oldy=240;
setwritemode(XOR_PUT);
SetMouseArea(130,10,630,410);
HideMouse();
setcolor(15);
setlinestyle(0,0,1);
while(btn!=LEFT && btn!=RIGHT) //鼠标左右键均未按下时,循环
{
ReadMouse(&btn,x,y); //读取鼠标移动的数据
if(oldx!=*x||oldy!=*y) //如果有移动
{
if(!first) //如果不是第一次画出X形光标
{
line(oldx-4,oldy-4,oldx+4,oldy+4); //先擦去原先的光标
line(oldx-4,oldy+4,oldx+4,oldy-4);
}
line(*x-4,*y-4,*x+4,*y+4); //新位置画X光标
line(*x-4,*y+4,*x+4,*y-4);
oldx=*x; //保存当前坐标点
oldy=*y;
first=FALSE;
}
};
while(LeftPrsd()||RightPrsd()); //滤掉多余的按键信号
line(*x-4,*y-4,*x+4,*y+4); //擦去X形光标
line(*x-4,*y+4,*x+4,*y-4);
x1=(*x)%10;
y1=(*y)%5;
*x=((x1<5)? (*x-x1):(*x+10-x1)); //返回整定后的画图区坐标
*y=((y1<3)? (*y-y1):(*y+5-y1));
ClearState();
setwritemode(COPY_PUT);
if (btn==LEFT) return(1); //如果按鼠标左键,返回1,继续画
else return(0); //否则返回0,结束画图
}
//----------------------------------------------------//
// 函数: Get2ndPoint()
// 功能: 通过鼠标在屏幕上得到第二个点(用于画连续直线)
// 入口参数:
// fstx,fsty:一个点的坐标
// x,y:另一点的坐标
// 出口参数:
// fstx,fsty:一个点的坐标
// x,y:另一点的坐标
//----------------------------------------------------//
int Get2ndPoint(int fstx,int fsty,int *x,int *y)
{
int btn,oldx,oldy;
int x1,y1;
int first=TRUE;
char ver[4],hor[4];
char oldcolor;
oldcolor=getcolor();
btn=oldx=oldy=0;
setwritemode(XOR_PUT);
HideMouse();
setcolor(15);
setlinestyle(0,0,1);
while(btn!=LEFT && btn!=RIGHT) //如果鼠标左右键均未按下
{
ReadMouse(&btn,x,y); //读取鼠标的移动数据
if(oldx!=*x||oldy!=*y) //如果有移动
{
if(!first) //如果不是第一次画出X形光标
{
line(fstx,fsty,oldx,oldy); //先擦去原先的直线
line(oldx-4,oldy-4,oldx+4,oldy+4);//擦去原先的光标
line(oldx-4,oldy+4,oldx+4,oldy-4);
}
line(fstx,fsty,*x,*y); //新位置画直线
line(*x-4,*y-4,*x+4,*y+4); //新位置画X光标
line(*x-4,*y+4,*x+4,*y-4);
oldx=*x; //保存新位置X形光标坐标
oldy=*y;
first=FALSE;
}
};
while(LeftPrsd()||RightPrsd()); //滤掉多余的按键信号
line(*x-4,*y-4,*x+4,*y+4); //擦去X形光标
line(*x-4,*y+4,*x+4,*y-4);
line(fstx,fsty,*x,*y); //擦去直线
setcolor(oldcolor);
ClearState(); //清除状态显示区内容
setwritemode(COPY_PUT);
x1=(*x)%10;
y1=(*y)%5;
*x=((x1<5)? (*x-x1):(*x+10-x1)); //返回整定后的画图区坐标
*y=((y1<3)? (*y-y1):(*y+5-y1));
if (btn==LEFT) return(1); //如果按鼠标左键,返回1,继续画
else return(0); //否则返回0,结束画图
}
//-------------------------------------//
// 函数: MsInBox()
// 功能: 判断一个点是否在一矩形框内
// 入口参数:
// x1,y1:矩形框左上角的坐标
// x2,y2:矩形框右下角的坐标
// x,y:点的坐标
// 出口参数:
// 1:真
// 0:假
//-------------------------------------//
int MsInBox(int x1,int y1,int x2,int y2,int x,int y)
{
return((x>=x1 && x<=x2 && y>=y1 && y<=y2) ? 1:0);
}
//-------------------------------------//
// 函数: GetData()
// 功能: 图形方式下数据输入
// 入口参数:
// flag:NAME,YN,NUMBER,TXT
// x,y:提示信息的坐标
// msg:提示信息
// str:定义的串指针
// 出口参数:
// str:输入的字串
//-------------------------------------//
void GetData(char flag,int x,int y,char *msg,char *str,int dim)
{
int i=0,j,k,len;
int wid,ii;
char ch=0,s[2],oldcolor;
oldcolor=getcolor();
s[1]='\0';
len=strlen(msg)+1;
wid=dim*8;
setfillstyle(1,1);
setcolor(15);
bar(len*8+x,y,x+wid+len*8,y+16);
setwritemode(XOR_PUT);
for(;;)
{
j=(len+i)*8;
Curs(x+j,y+6);
for(;;)
{
ch=getch();
if (flag==NUMBER) //只接收ESC,ENTER,BACKSPACE,小数点,数字
{
if (ch==ESC||(ch>47&&ch<58)||(ch==ENTER&&i)||(ch==BACKSPACE)||(ch==POINT)) break;
}
if (flag==TEXT) break;
if (flag==NAME) //小写字符,转换成大写
{
if (ch>96&&ch<123) ch=ch-32;
break;
}
if (flag==YN) //只接收Y,N,ENTER,BACKSPACE
{
if (ch>96&&ch<123) ch=ch-32;
if ((ch==ENTER&&i)||ch==89||ch==78||ch==BACKSPACE)
break;
}
}
Curs(x+j,y+6);
if(ch==ESC) { i=0;break;} //ESC键取消
if(ch==ENTER) break; //ENTER键,退出循环
if(ch==BACKSPACE) //BACKSPACE键,光标左移
{
if (--i<0) i=0;
k=(len+i)*8;
bar(x+k,y,x+k+8,y+16);
}
else if (i<dim)
{
str[i]=s[0]=ch;
settextstyle(DEFAULT_FONT,HORIZ_DIR,0);
outtextxy(x+j,y+6,s); //显示输入数据
i++;
}
}
str[i]='\0';
setwritemode(COPY_PUT);
setcolor(oldcolor);
return;
}
//---------------------------------------------------------//
// 函数: Curs()
// 功能: 图形方式下数据输入时的调用函数,可显示一矩形光标
// 入口参数:
// x,y:光标的坐标
// 出口参数:
//---------------------------------------------------------//
void Curs(int x,int y)
{
char oldcolor;
oldcolor=getcolor();
setlinestyle(0,0,3);
setcolor(15);
line(x+2,y-2,x+2,y+7);
line(x+5,y-2,x+5,y+7);
setcolor(oldcolor);
setlinestyle(0,0,1);
}
//---------------------------------------------------------//
// 函数: ErrorMsg()
// 功能: 显示打开文件的出错信息
// 入口参数:
// 出口参数:
//---------------------------------------------------------//
void ErrorMsg()
{
printf("Open File Error!");
getch();
RealQuit();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -