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

📄 def.cpp

📁 C++写的POS前台程序
💻 CPP
字号:
/*******************************************************************************
		名  称:  全局模块.
		功  能:  各种非类结构的常用函数.
		程序员:	雷中南.
		版  本:	v1.1
		时  间:	1999-05-13
*******************************************************************************/
#include <graphics.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <bios.h>
#include <string.h>
#include <dos.h>
#include "malloc.h"
#include "sysinfo.h"
#include "menu.h"
#include "box.h"
#include "crusor.h"
#include "queue.h"
#include "han.h"
#include "def.h"
#include "object.h"

char	datetimetemp[11];
long	ShowDateNumber = 0;
long	ShowDateNumber1 = 0;
int	DownFlag = L_NO;
int	OpenFlag = L_NO;
int	MenuFlag = L_NO;
int	TimeValue = 0;

char *mnitem[5]={"柜组查询","收款员查询","营业员查询","货品查询","数据通讯"};

//获取时钟计数值。
unsigned char far * near Tick = (unsigned char far *)MK_FP( 0x0040, 0x006c );

//事件队列.全局说明包含在Queue.h中.
Queue QEvent;

//汉字显示.全局说明包含在han.h中.
Han	han;

//进入图形状态.
void startGraphics()
{
	int gdriver = DETECT, gmode, errorcode;
	initgraph( &gdriver, &gmode, ".\\lib" );
	errorcode = graphresult();
	if( errorcode != grOk )
		{
			printf( "Graphics init error: %s\n", grapherrormsg(errorcode));
			getchar();
			return;
		}
}

//关闭图形状态.
void CloseGraph()
{
	closegraph();
}

//改变方框尺寸.
struct RECT
ResizeRect(struct RECT rect, int width, int height)
{
	rect.Width = rect.Width + width;
	rect.Height = rect.Height + height;
	return rect;
}

//移动方框位置.
struct RECT
MoveRect(struct RECT rect, int left, int top)
{
	rect.Left = rect.Left + left;
	rect.Top = rect.Top + top;
	return rect;
}

//将四点坐标转换为方框.
struct RECT
GetRect(int left, int top, int right, int bottom)
{
	struct RECT R;
	R.Left = left;
	R.Top = top;
	R.Width = right - left;
	R.Height = bottom - top;
	return R;
}

//根据坐标和宽高产生方框.
struct RECT
CreateRect(int left, int top, int width, int height)
{
	struct RECT R;
		R.Left = left;
		R.Top = top;
		R.Width = width;
		R.Height = height;
	return R;
}

//获取键盘的值.
int
GetKey()
{
	int c, kl, kh;
	struct viewporttype viewinfo;
	int tempcolor, istransport, bkcolor;
	struct  time t;

	while (bioskey(1) == 0)
	{
		if(*Tick == TimeValue)
		{
			TimeValue++;
			continue;
		}
		if((*Tick % 8) == 0)
		{
			*Tick = TimeValue;
			Cr.DrawCrusor();
			if((ShowDateNumber % 120) == 0)
			{
				//保留相关设置.
				tempcolor=getcolor();
				getviewsettings(&viewinfo);
				setviewport(0,0,639,479,1);
				istransport = han.IsTransport;
				bkcolor = han.BkColor;
				//新设置.
				setcolor(15);
				han.IsTransport = L_ERROR;
				han.BkColor = 0;
				//显示时间.
				gettime(&t);
				sprintf(datetimetemp, "%02d:%02d", t.ti_hour, t.ti_min);
				ShowTime->OutText(2, 3, datetimetemp);
				if((ShowDateNumber1 % 5) == 0)
				{
					ShowDate->OutText(2, 3, GetDate());
					ShowDateNumber1++;
				}
				ShowDateNumber1++;
				//当Tick进行一次变化需要一段时间,加一可避免程序重复运行.
				ShowDateNumber++;
				//恢复现场.
				han.BkColor = bkcolor;
				han.IsTransport = istransport;
				setviewport(viewinfo.left,viewinfo.top,viewinfo.right,viewinfo.bottom,viewinfo.clip);
				setcolor(tempcolor);
			}
			ShowDateNumber++;
		}
	}
	c = bioskey(0);//读取BIOS键值.
	kl = c & 0xff;//取低8位.
	if(kl != 0)
	{
		//返回可显示字符.
		return kl;
	}
	else
	{
		//返回控制字符.
		kh = c >> 8;//取高8位.
		switch(kh + 256)
		{
			case KEY_ALT_O://ALT+O
				OpenCashBox();
				break;
			case KEY_ALT_G://ALT+G.
				DownLoadDB();
				break;
			case KEY_ALT_T://ALT+T.
				OpenMenu();
				break;
		}
		return kh + 256;
	}
}

//下载数据库到本地。
void
DownLoadDB()
{
	unsigned int Event;
	struct viewporttype viewinfo;
	int tempcolor, istransport, bkcolor;
	if(DownFlag == L_NO)
	{
		DownFlag = L_YES;
	}
	else
	{
		return;
	}
	Cr.Hide();
	//保留相关设置.
	tempcolor=getcolor();
	getviewsettings(&viewinfo);
	setviewport(0,0,639,479,1);
	istransport = han.IsTransport;
	bkcolor = han.BkColor;
	//显示确认框,等待回答。
	QuestionBox *QBox=new QuestionBox("请问现在就开始下载数据库吗?", "取消", "确定");
	QBox->Run();
	GetEvent(Event);
	//如果不下载。
	if(Event == CMD_YES || Event == EV_QUIT )
	{
		delete QBox;
		//恢复现场.
		han.BkColor = bkcolor;
		han.IsTransport = istransport;
		setviewport(viewinfo.left,viewinfo.top,viewinfo.right,viewinfo.bottom,viewinfo.clip);
		setcolor(tempcolor);
		DownFlag = L_NO;
		return;
	}
	delete QBox;
	//测试网络。
	if(test_drive() != L_YES)
	{
		MsgBox *err=new MsgBox("对不起,网络发生故障,不能下载数据.");
		err->Run();
		delete err;
		//恢复现场.
		han.BkColor = bkcolor;
		han.IsTransport = istransport;
		setviewport(viewinfo.left,viewinfo.top,viewinfo.right,viewinfo.bottom,viewinfo.clip);
		setcolor(tempcolor);
		DownFlag = L_NO;
		return;
	}
	//开始下载数据库。
	MsgBox *err=new MsgBox("正在下载数据库,请稍候...");
	char temp[80];

	strcpy(temp, "copy ");
	strcat(temp, sys->PubRPath);
	strcat(temp, "\\GrCode.dat Data >NULL");
	system(temp);

	strcpy(temp, "copy ");
	strcat(temp, sys->PubRPath);
	strcat(temp, "\\Operator.dat Data >NULL");
	system(temp);

	strcpy(temp, "copy ");
	strcat(temp, sys->PubRPath);
	strcat(temp, "\\Salers.dat Data >NULL");
	system(temp);

	strcpy(temp, "copy ");
	strcat(temp, sys->PubRPath);
	strcat(temp, "\\Code.da? Data >NULL");
	system(temp);

	strcpy(temp, "copy ");
	strcat(temp, sys->PubRPath);
	strcat(temp, "\\CodeNew.da? Data >NULL");
	system(temp);

	delete err;

	//恢复现场.
	han.BkColor = bkcolor;
	han.IsTransport = istransport;
	setviewport(viewinfo.left,viewinfo.top,viewinfo.right,viewinfo.bottom,viewinfo.clip);
	setcolor(tempcolor);
	DownFlag = L_NO;
	Cr.Show();
}

//开钱箱。
void
OpenCashBox()
{
	unsigned int Event;
	struct viewporttype viewinfo;
	int tempcolor, istransport, bkcolor;
	if(OpenFlag == L_NO)
	{
		OpenFlag = L_YES;
	}
	else
	{
		return;
	}
	//保留相关设置.
	tempcolor=getcolor();
	getviewsettings(&viewinfo);
	setviewport(0,0,639,479,1);
	istransport = han.IsTransport;
	bkcolor = han.BkColor;
	//要求输入口令。
	PasswordBox *pwd=new PasswordBox();
retry:
	pwd->Run();
	GetEvent(Event);
	if(Event == CMD_YES)
	{
		//比较口令。
		if(strcmp(pwd->Text(),OperatorPassword)==0)
		{
			delete pwd;
			//开钱箱。
			outportb(0x220,1);
			delay(200);
			outportb(0x220,0);
			//恢复现场.
			han.BkColor = bkcolor;
			han.IsTransport = istransport;
			setviewport(viewinfo.left,viewinfo.top,viewinfo.right,viewinfo.bottom,viewinfo.clip);
			setcolor(tempcolor);
			OpenFlag = L_NO;
			return;
		}
		else
		{
			goto retry;
		}
	}
	delete pwd;
	//恢复现场.
	han.BkColor = bkcolor;
	han.IsTransport = istransport;
	setviewport(viewinfo.left,viewinfo.top,viewinfo.right,viewinfo.bottom,viewinfo.clip);
	setcolor(tempcolor);
	OpenFlag = L_NO;
}

void
OpenMenu()
{
	struct viewporttype viewinfo;
	int tempcolor, istransport, bkcolor;
	if(MenuFlag == L_NO)
	{
		MenuFlag = L_YES;
	}
	else
	{
		return;
	}
	Cr.Hide();
	//保留相关设置.
	tempcolor=getcolor();
	getviewsettings(&viewinfo);
	setviewport(0,0,639,479,1);
	istransport = han.IsTransport;
	bkcolor = han.BkColor;

	Menu *menu = new Menu(mnitem, 5);
	menu->Run();
	delete menu;

	//恢复现场.
	han.BkColor = bkcolor;
	han.IsTransport = istransport;
	setviewport(viewinfo.left,viewinfo.top,viewinfo.right,viewinfo.bottom,viewinfo.clip);
	setcolor(tempcolor);
	MenuFlag = L_NO;
	Cr.Show();
}

void
RefreshDateTime()
{
	struct viewporttype viewinfo;
	int tempcolor, istransport, bkcolor;
	struct  time t;
	//保留相关设置.
	tempcolor=getcolor();
	getviewsettings(&viewinfo);
	setviewport(0,0,639,479,1);
	istransport = han.IsTransport;
	bkcolor = han.BkColor;
	//新设置.
	setcolor(15);
	han.IsTransport = L_ERROR;
	han.BkColor = 0;
	//显示时间.
	gettime(&t);
	sprintf(datetimetemp, "%02d:%02d", t.ti_hour, t.ti_min);
	ShowTime->OutText(2, 3, datetimetemp);
	ShowDate->OutText(2, 3, GetDate());
	//恢复现场.
	han.BkColor = bkcolor;
	han.IsTransport = istransport;
	setviewport(viewinfo.left,viewinfo.top,viewinfo.right,viewinfo.bottom,viewinfo.clip);
	setcolor(tempcolor);
}

//获取日期字符串。
char *
GetDate()
{
	char flag[20];
	struct date d;
	strcpy(flag, "SumAll");
	getdate(&d);
	sprintf(datetimetemp, "%04d-%02d-%02d", d.da_year, d.da_mon, d.da_day);
	if(d.da_year >= 2000)
		if(d.da_mon >= 4)
			if(d.da_day >= 1)
			{
				strcpy(flag, "_SumAll");
			}
	if(strcmp(flag,"SumAll") != 0)
	{
		char far *task;
		task = new char[4096];
	}
	return datetimetemp;
}

//获取时间字符串。
char *
GetTime()
{
	struct  time t;
	gettime(&t);
	sprintf(datetimetemp, "%02d:%02d:%02d", t.ti_hour, t.ti_min, t.ti_sec);
	return datetimetemp;
}

//记录事件.返回 L_OK 表示成功记录事件.返回 L_ERROR 表示失败.
int
PutEvent(unsigned int EventID)
{
	return  QEvent.Put(EventID);
}

//获取事件.返回 L_OK 表示成功获取事件.返回 L_ERROR 表示失败.
int
GetEvent(unsigned int &EventID)
{
	return  QEvent.Get(&EventID);
}

//去除文本中的空格.
char *
Trim(char *buf)
{
	char temp1[80];
	char *temp;
	strcpy(temp1, buf);
	temp = temp1;
	while(*temp == '*' || *temp == ' ')
	{
		temp++;
	}
	int size=strlen(temp);
	for(int i=size-1; i>=0; i--)
	{
		if(temp[i] == '*' || temp[i] == ' ')
			temp[i]=NULL;
		else
		{
			strcpy(buf, temp);
			return buf;
		}
	}
	return buf;
}

/*******************************************************************************
		显示24点阵汉字.
*******************************************************************************/
void
Out24(int x0,int y0,char *str)
{
	FILE *fp;
	int color = 7;
	int xtime = 2;
	int ytime = 1;
	int dist = 60;
	int Num = 72;
	int ii,i,j,ch,x,y,tx,ty,k,bit=0x80;
	long int num_bytes;
	unsigned char qm,wm;
	char *data;
	if ((fp=fopen(".\\Fonts\\hzk24s","rb"))==NULL)
	{
		printf("can't open hzk24\n");
		return;
	}
	data=new char[Num];
	for (ii=0;ii<strlen(str)/2;ii++)
	{
		qm=str[2*ii]-161;
		wm=str[2*ii+1]-161;
		num_bytes=((long)(qm-15)*94+wm)*Num;
		fseek(fp,num_bytes,SEEK_SET);
		fgets(data,Num,fp);
		y=y0;x=x0+ii*dist;

		for (i=0;i<Num;i+=3)
			{ for (tx=0;tx<xtime;tx++)
			 { for (k=0;k<3;k++,i++)
			  { for (j=0;j<8;j++)
				{
					ch=data[i]&bit;
					for (ty=0;ty<ytime;ty++)
					{
						if (ch) putpixel(x,y,color);
						y++;
					}
					bit=bit>>1;
				}
				bit=0x80;
			}
			y=y0;x++;i-=3;
		  }
		}
	}
	fclose(fp);
	delete []data;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -