📄 def.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 + -