📄 qtsyba~1.c
字号:
void DrawBar3d(int sx,int sy,int ex,int ey,
unsigned char FC,unsigned char FS,
unsigned char BC,unsigned char BS,int Size,
unsigned char C1,unsigned char C2)
{
if(Size)
{
DrawBar(ex,sy+Size,ex+Size,ey+Size,BC,BS);
DrawBar(sx+Size,ey,ex+Size,ey+Size,BC,BS);
}
RectangleFill(sx,sy,ex,ey,C1,C2,FC,FS);
}
//显示园型
void Circel(int x,int y,int R,unsigned char Co,unsigned char Li,int Att)
{
int Di,Xi,Yi;
Di=3-2*R;
Xi=0,Yi=R;
do{
Di=(Di<0)? Di+(Xi<<2)+6:Di+((Xi-Yi)<<2)+10;
Xi=Xi+1;
Yi=(Di<0)? Yi:Yi-1;
if(Att)
{ Line0(x-Xi,y-Yi,x+Xi,Co,1,COPY_PUT,0xff);
Line0(x-Xi,y+Yi,x+Xi,Co,1,COPY_PUT,0xff); }
else
{ Point(x+Xi,y-Yi,Co);
Point(x-Xi,y-Yi,Co);
Point(x+Xi,y+Yi,Co);
Point(x-Xi,y+Yi,Co);}
}while(Xi<=Yi);
Xi=R,Yi=0;
Di=3-(R<<2);
do{
Di=(Di<0)? Di+(Yi<<2)+6:Di+((Yi-Xi)<<2)+10;
Yi=Yi+1;
Xi=(Di<0)? Xi:Xi-1;
if(Att)
{ Line0(x-Xi,y-Yi,x+Xi,Co,1,COPY_PUT,0xff);
Line0(x-Xi,y+Yi,x+Xi,Co,1,COPY_PUT,0xff); }
else
{ Point(x+Xi,y-Yi,Co);
Point(x-Xi,y-Yi,Co);
Point(x+Xi,y+Yi,Co);
Point(x-Xi,y+Yi,Co);}
}while(Xi>=Yi);
if(Att)
Line0(x-R,y,x+R,Co,1,COPY_PUT,0xff);
else
{
Point(x-R,y,Co);
Point(x+R,y,Co); }
}
/*屏幕图形处理函数 保存,恢复*/
/*定义变量*/
_segment videoseg=0xa000; //可见段
_segment videosegex=0xaa00; //不可见段
int _nCount=0; //计数
int WinWidth[5],WinHeight[5]; //保存的宽和高
unsigned _nOff[5]={0}; //偏移地址
unsigned char _based(videoseg) *seeseg=0;
unsigned char _based(videoseg) *seesegt=0;
unsigned char _based(videosegex) *seesegex=0;
int SaveMark=0;
//
void SetGraph(int Att)
{
if(Att)
{
outp(0x3ce,5);
outp(0x3cf,0x1);
outp(0x3ce,8);
outp(0x3cf,0);
outp(0x3c4,2);
outp(0x3cf,0xf);
}
else
{
_asm{
mov dx,0x3ce // outportb(0x3ce,5);
mov al,0x5
out dx,al
mov dx,0x3cf // outportb(0x3cf,0x1);
mov al,0x1
out dx,al
mov dx,0x3ce // outportb(0x3ce,8);
mov al,0x8
out dx,al
mov dx,0xcf // outportb(0x3cf,0);
mov al,0x0
out dx,al
mov dx,0x3c4 // outportb(0x3c4,2);
mov al,0x2
out dx,al
mov dx,0x3cf // outportb(0x3cf,0xf);
mov al,0xf
out dx,al
}
}
}
void RestoreGraph(int Att)
{
if(Att)
{ outp(0x3ce,5);
outp(0x3cf,0); }
else
{ outp(0x3ce,5);
outp(0x3cf,0); }
}
void GetImage(int x1,int y,int hd1,int vd1)
{
int i,j,x;
unsigned yoff;
x=x1/8;
yoff=0;
yoff=_nOff[_nCount];
// printf("yoff1=%d,_nCount1=%d\n",yoff,_nCount);
// getchar();
WinWidth[_nCount]=(hd1-x1)/8+1;
WinHeight[_nCount]=vd1;
SetGraph(1);
for(j=y;j<=WinHeight[_nCount];j++)
for(i=0;i<WinWidth[_nCount];i++)
{
seeseg=j*80+x+i; //计算地址
seesegex=yoff;
*seesegex=*seeseg;
yoff++;
}
_nCount++;
_nOff[_nCount]=yoff;
RestoreGraph(1);
}
void PutImage(int x1,int y)
{
int j,i,x;
unsigned yoff;
x=x1/8;
_nCount--;
yoff=_nOff[_nCount];
SetGraph(1);
for(j=y;j<=WinHeight[_nCount];j++)
for(i=0;i<WinWidth[_nCount];i++)
{
seeseg=j*80+x+i; //计算地址
seesegex=yoff; //
*seeseg=*seesegex;
yoff++;
}
RestoreGraph(1);
}
//滚屏函数
void MoveScreen(unsigned sx1,unsigned sy1,unsigned sx2,
unsigned sy2,unsigned tx,unsigned ty)
{
unsigned SOff,TOff;
unsigned Hd,Wd;
short Mark;
SOff=sy1*80+sx1/8;
TOff=ty*80+tx/8;
Hd=(sx2-sx1)/8+1;
Wd=sy2-sy1+1;
if(tx==sx1&&ty==sy1) return; //不用滚屏
if(tx<=sx1)
{
if(ty<=sy1) Mark=1; /*左上*/
else Mark=2; /*左下*/
}
else
{
if(ty<=sy1) Mark=3; /*右上*/
else Mark=4; /*右下*/
}
SetGraph(0);
switch(Mark)
{
case 1:_asm{
push ds
push es
mov ax,0xa000
mov ds,ax
mov es,ax
mov bx,0
Next1: mov cx,Hd
mov si,SOff
mov di,TOff
mov al,80
mul bx
add si,ax
add di,ax
cld
rep movsb
mov ax,Hd
inc bx
cmp bx,Wd
jnz Next1
pop es
pop ds
}
break;
case 2:_asm{
push ds
push es
mov ax,0xa000
mov ds,ax
mov es,ax
mov bx,Wd
Next2: mov cx,Hd
mov si,SOff
mov di,TOff
mov al,80
mul bx
sub ax,80
add si,ax
add di,ax
cld
rep movsb
mov ax,Hd
dec bx
cmp bx,0
jnz Next2
pop es
pop ds
}
break;
case 3:break;
case 4:break;
}
RestoreGraph(0);
}
/* 第三部分:显示汉字函数 */
unsigned FontSeg,FontOff; //字模缓冲地址
unsigned char far FONT_BUF[32]; //字模缓冲区
int Cowx,Liney; //列间距和行间距
unsigned char FontColor; //当前字符颜色
int FWriteMode; //当前显示方式
int FontCurX=0,FontCurY=0; //光标位置
unsigned char FontBuffer[2000]; //
unsigned char FontBufferCal[650];
unsigned char CancelBuffer[200];
// 初始化字符显示参数
unsigned StrToInt(char *str)
{
unsigned Result=0,k=1,j;
int i,l;
l=(int)strlen(str);
for(i=l-1;i>=0;i--)
{
switch(str[i])
{
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':j=str[i]-'0';
break;
case 'A':
case 'B':
case 'C':
case 'D':
case 'E':
case 'F':j=(str[i]-'A')+10;
}
Result+=j*k;
k*=16;
}
return Result;
}
void InitFont(void)
{
char value[15],valueex[7];
FILE *fhz16;
fhz16=fopen("digi.dat","r");
fseek(fhz16,0,SEEK_SET);
fread(FontBuffer,1,1692,fhz16); //读取字库
fclose(fhz16);
fhz16=fopen("cal.dat","r");
fseek(fhz16,0,SEEK_SET);
fread(FontBufferCal,1,647,fhz16); //读取字库
fclose(fhz16);
fhz16=fopen("Cancel.dat","r");
fseek(fhz16,0,SEEK_SET);
fread(CancelBuffer,1,200,fhz16); //读取字库
fclose(fhz16);
//取地址,由于FP_SEG,FP_OFF在MC6.0失效,才出了下面叟主意
sprintf(value,"%Fp",FONT_BUF);
uf_strmid(valueex,value,0,4);
FontSeg=StrToInt(valueex);
uf_strmid(valueex,value,5,4);
FontOff=StrToInt(valueex);
FontColor=0xff;
FWriteMode=COPY_PUT;
Cowx=8,Liney=18;
}
void DinitFont(void)
{
}
/* 读取汉字字模 TextFont-汉字或字符 */
int ReadFont(unsigned char *TextFont)
{
/* long addr;
int k=1;
if(!fhz16) return -1;
if(!fasc16) return -2;
if(TextFont[0]>=0xa0) //是汉字
{
k=2;
addr=(long)((TextFont[0]-0xa1)*94+(TextFont[1]-0xa1))*32;
fseek(fhz16,addr,SEEK_SET);
fread(FONT_BUF,1,32,fhz16); //读取字库
}
else //是字符
{
addr=(long)(TextFont[0])*16;
fseek(fasc16,addr,SEEK_SET);
fread(FONT_BUF,1,16,fasc16); //读取字库
}
return k; */
// BC++3.1用
unsigned TempFont,TFont;
int k=1;
if(TextFont[0]>=0xa0) //是汉字
TFont=*(unsigned *)TextFont;
else
TFont=(unsigned)*TextFont;
if(TFont&0xff00) //是汉字
{ k=2;
TempFont=(TFont<<8)&0xff00;
TempFont|=(TFont>>8)&0x00ff;}
else //是字符
TempFont=TFont&0x00ff;
reg.x.dx=TempFont;
int86x(0x7f,®,®,&sreg);
// if(reg.x.cflag)
movedata(reg.x.dx,0,FontSeg,FontOff,k*16);
return k;
}
/*把汉字字模传到显示缓冲区
sx,sy-缓冲区的位置
LineStyle-字模数据的地址
n-字模行数 */
void Put(int sx,int sy,unsigned char *LineStyle,int n)
{
int lsx,lst,j,k;
char c;
unsigned char n1,n2;
lsx=sx%8,lst=sx/8;
k=sy*80+lst;
outp(0x3ce,0);
outp(0x3cf,FontColor);
outp(0x3ce,1);
outp(0x3cf,0xff);
outp(0x3ce,3);
outp(0x3cf,FWriteMode);
outp(0x3c4,2);
outp(0x3c5,0xff);
if(lsx) //不是整字节开始
for(j=0;j<n;j++)
{
n1=(unsigned char)(LineStyle[j]>>lsx),
n2=(unsigned char)(LineStyle[j]<<(8-lsx));
outp(0x3ce,8);
outp(0x3cf,n1);
seeseg=k; //地址
c=*seeseg;
*seeseg=c;
outp(0x3ce,8);
outp(0x3cf,n2);
seeseg=k+1; //地址
c=*seeseg;
*seeseg=c;
k+=80;
}
else
for(j=0;j<n;j++)
{
outp(0x3ce,8);
outp(0x3cf,LineStyle[j]);
seeseg=k; //地址
c=*seeseg;
*seeseg=c;
k+=80;
}
outp(0x3ce,3);
outp(0x3cf,0);
outp(0x3ce,8);
outp(0x3cf,0xff);
}
int ViewOne16Char(int x,int y,unsigned char *TextFont)
{
int i,k;
unsigned char buf1[16],buf2[16];
k=ReadFont(TextFont);
if(k>0)
{
if(k==2) // 汉字
{
for(i=0;i<16;i++)
{
buf1[i]=FONT_BUF[2*i];
buf2[i]=FONT_BUF[2*i+1];}
Put(x,y,buf1,16);
Put(x+8,y,buf2,16);
}
else // 字母
Put(x,y,FONT_BUF,16);
}
return k;
}
//
int ViewOne24Char(int x,int y,unsigned char *TextFont,int Size)
{
unsigned char c;
unsigned j,i,w=0,l,s;
c=*TextFont;
if(Size==48)
{
for(i=1632;i<1692;i+=5)
if(c==FontBuffer[i])
{
//start
s=(unsigned)FontBuffer[i+1];
s=s*256+(unsigned)FontBuffer[i+2];
//
l=(unsigned)FontBuffer[i+3];
l=l*256+(unsigned)FontBuffer[i+4];
w=l/48;
for(j=0;j<w;j++)
{
Put(x+j*8,y,&FontBuffer[s],48);
s+=48;
}
w=w*8;
break;
}
}
else
for(i=0;i<13;i++)
if(c==FontBufferCal[i])
{
s=13+i*48;
w=2;
for(j=0;j<w;j++)
{
Put(x+j*8,y,&FontBufferCal[s],24);
s+=24;
}
w=12;
break;
}
return w;
}
// 显示字符串
void DrawText(int x,int y,char *String,unsigned char Co,int MaxLine)
{
int Tempx,Tempy;
int Mark=0,k,Count=0;
unsigned char TempNum,C[2]={0xff,0xff};
Tempx=x,Tempy=y;
FontColor=Co;
while(*String)
{
TempNum=*String;
switch(TempNum)
{
case 0x9: Tempx+=7*Cowx;
case 0x20:Tempx+=Cowx;
String++;
continue;
case 0x0d:String++;
case 0x0a:Tempx=x;
Tempy+=Liney;
String++;
break;
case '&': Mark=1-Mark;
String++;
break;
default: if(MaxLine<0) //特殊汉字
{
if(MaxLine<=-10)
k=ViewOne24Char(Tempx,Tempy,String,24);
else
k=ViewOne24Char(Tempx,Tempy,String,48);
Tempx+=k;
String++;
}
else
{
k=ViewOne16Char(Tempx,Tempy,String);
if(Mark)
{
Put(Tempx,Tempy+Liney-4,C,2);
if(k==2)
Put(Tempx+Cowx,Tempy+Liney-4,C,2);
Mark=0;
}
Count+=k;
Tempx+=k*Cowx;
String+=k;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -