⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 atoolfun.cpp

📁 汽车气门生产自控系统控制算法及源码
💻 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 + -