📄 graphfun.c
字号:
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 WinWidth,WinHeight; //保存的宽和高
unsigned char _based(videoseg) *seeseg=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;
if(SaveMark) return;
SaveMark=1;
x=x1/8;
WinWidth=(hd1-x1)/8+1;
WinHeight=2*(vd1-y+1); //计算字节数
SetGraph(1);
for(j=0;j<WinHeight;j++)
for(i=0;i<WinWidth;i++)
{
seeseg=j*80+x+i; //计算地址
seesegex=j*WinWidth+i;
*seesegex=*seeseg;
}
RestoreGraph(1);
}
void PutImage(int x1,int y)
{
int j,i,x;
if(!SaveMark) return;
x=x1/8;
SaveMark=0;
SetGraph(1);
for(j=0;j<WinHeight;j++)
for(i=0;i<WinWidth;i++)
{
seeseg=j*80+x+i; //计算地址
seesegex=j*WinWidth+i;
*seeseg=*seesegex;
}
RestoreGraph(1);
}
/* 第三部分:显示汉字函数 */
unsigned FontSeg,FontOff; //字模缓冲地址
unsigned char FONT_BUF[32]; //字模缓冲区
int Cowx,Liney; //列间距和行间距
unsigned char FontColor; //当前字符颜色
int FWriteMode; //当前显示方式
int FontCurX,FontCurY; //光标位置
// 初始化字符显示参数
void InitFont(void)
{
FontSeg=FP_SEG(FONT_BUF);
FontOff=FP_OFF(FONT_BUF);
FontColor=0xff;
FWriteMode=COPY_PUT;
Cowx=8,Liney=18;
}
void DinitFont(void)
{
}
/* 读取汉字字模 TextFont-汉字或字符 */
int ReadFont(unsigned char *TextFont)
{
FILE *fhz16,*fasc16; //字库文件句柄
long addr;
int k=1;
fhz16=fopen("hzk16","r");
fasc16=fopen("asc16","r");
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); //读取字库
}
if(fhz16) fclose(fhz16);
if(fasc16) fclose(fasc16);
return k;
/*BC++3.1用
unsigned TempFont;
int k=1;
if(TextFont&0xff00) //是汉字
{ k=2;
TempFont=(TextFont<<8)&0xff00;
TempFont|=(TextFont>>8)&0x00ff;}
else //是字符
TempFont=TextFont&0x00ff;
reg.x.dx=TempFont;
int86x(0x7f,®,®,&sreg);
if(!reg.x.cflag) printf("读取字模错误:%d\n",_doserrno);
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==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;
}
// 显示字符串
void DrawText(int x,int y,char far *String,unsigned char Co,int MaxLine)
{
int Tempx,Tempy;
int LineCon=1,Mark=0,k;
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;
LineCon++;
String++;
break;
case '&': Mark=1-Mark;
String++;
break;
default: 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;
}
Tempx+=k*Cowx;
String+=k;
break;
}
if(LineCon>MaxLine) break;
}
CurX=Tempx,CurY=Tempy;
}
/* DrawTextEx
显示字符串,字符串的宽度被限制在RW的宽度之内
x,y-显示开始的位置
String-字符串
RW-字符串显示的宽度
Co-字符的颜色
AligMent-对齐方式 0-Left,1-Center,2-Right
*/
void DrawTextEx(int x,int y,char far *String,int RW,
unsigned char Co,int AlignMent)
{
int w;
w=_fstrlen(String)*8; //求字符串的长度
switch(AlignMent)
{
case 0:break;
case 1:x=x+(RW-w)/2;
break;
case 2:if(RW>w)
x=x+RW-w;
}
DrawText(x,y,String,Co,1);
}
/* 第四部分:控件 */
/* 本部分包含仿Windows界面的一部份控件,由于MC6.0不是面向对象的,
因此,每一个控件的数据成员使用一个结构来表示,其方法使用函数来实现.*/
//TPanel控件
//显示TPanel空件
void ShowPanel(TPanel *Panel)
{
int Off=0,sx,sy,ex,ey;
sx=Panel->Left;
sy=Panel->Top;
ex=sx+Panel->Width-1;
ey=sy+Panel->Height-1;
//画表面
DrawBar(sx,sy,ex,ey,Panel->Color,0xff); //实线填充
if(Panel->BorderStyle) //存在边界
{
Rectangle(sx,sy,ex,ey,clBlack,clBlack);
Off++;
}
if(Panel->BevelOuter) //外边界
{
Rectangle(sx+Off,sy+Off,ex-Off,ey-Off,clBlack,clWhite);
Off++;
}
if(Panel->BevelInner) //内边界
Rectangle(sx+Off,sy+Off,ex-Off,ey-Off,clWhite,clBlack);
}
//TLabel控件
void ShowLabel(TLabel *Label,char *Caption)
{
int sx,sy,ex,ey;
sx=Label->Left;
sy=Label->Top;
ex=sx+Label->Width-1;
ey=sy+Label->Height-1;
if(Caption) //如果新的内容不为NULL,更新内容
strcpy(Label->Caption,Caption);
DrawBar(sx,sy,ex,sy,Label->Color,0xff); //显示背景
if(Label->Ctrl3D) //3D效果
DrawTextEx(sx+1,sy+1,Label->Caption,ex-sx+1, //显示阴影
Label->FontBColor,Label->AlignMent);
DrawTextEx(sx,sy,Label->Caption,ex-sx+1, //显示字符
Label->FontColor,Label->AlignMent);
}
//TEdit控件
void InsertChar(char *s,char c,int Locate) //在字符串指
{ //定的位置插入
int Len,i;
if(Locate<0) return; //无效的输入
Len=strlen(s);
for(i=Len;i>=Locate;i--)
s[i+1]=s[i];
s[Locate]=c;
}
void OverWriteChar(char *s,char c,int Locate) //改写字符串
{ //中的一个字符
int Len;
Len=strlen(s);
if(Locate>=Len&&Locate<0) return; //无效的输入
s[Locate]=c;
}
void DeleteChar(char *s,int Locate) //删除字符串
{ //的某一字符
int Len,i;
if(Locate<0) return; //无效的输入
Len=strlen(s);
for(i=Locate;i<Len;i++)
s[i]=s[i+1];
}
//显示光标
void OpenCurSor(TEdit *Edit)
{
if(!Edit->CurMark) //光标尚未显示
{
Edit->CurMark=1;
Line0(4+Edit->Left+Edit->CurX*8,Edit->Top+16,
12+Edit->Left+Edit->CurX*8,Edit->Color,
2,XOR_PUT,0xff);
}
}
//关闭光标
void CloseCurSor(TEdit *Edit)
{
if(Edit->CurMark) //光标尚未显示
{
Edit->CurMark=0;
Line0(4+Edit->Left+Edit->CurX*8,Edit->Top+16,
12+Edit->Left+Edit->CurX*8,Edit->Color,
2,XOR_PUT,0xff);
}
}
//EditAtt为非零时,只显示而不进入编辑状态
int TextEdit(TEdit *Edit,int Total,int EditAtt)
{
int Tsx,Tsy,bLoop=1,sx,sy,ex,ey,Width;
int Result=0;
Msg *Buffer; //定义消息缓冲指针
char Text[81];
//计算边界
sx=Edit->Left;
sy=Edit->Top;
ex=sx+Edit->Width-1;
ey=sy+Edit->Height-1;
Width=Edit->Width-4;
//复制到编辑缓冲区
strcpy(Text,Edit->Text);
//字符显示的位置
Tsx=sx+4,Tsy=sy+2;
//产生消息
InBuffer(-4,WM_PAINT,0,0);
if(!EditAtt)InBuffer(-4,WM_EXIT,0,0);
//进行消息循环
while(bLoop)
{
OpenCurSor(Edit);
Buffer=Getkey(); //接收输入
CloseCurSor(Edit);
switch(Buffer->type) //检查键的类型
{
case -4:switch(Buffer->h.RetKey) //是消息
{
case WM_PAINT: //显示控件
RectangleFill(sx,sy,ex,ey,clFuchsia,clWhite,
Edit->Color,0xff);
Rectangle(sx+1,sy+1,ex-1,ey-1,clBlack,clSilver);
DrawTextEx(Tsx,Tsy,Text,Width,Edit->FontColor,0);
break;
case WM_UPDATE: //更新式显示
//清除背景
if(Edit->CurX)
DrawBar(Tsx+Edit->CurX*8-8,Tsy,ex-2,ey-2,Edit->Color,0xff);
else
DrawBar(Tsx+Edit->CurX*8,Tsy,ex-2,ey-2,Edit->Color,0xff);
DrawTextEx(Tsx,Tsy,Text,Width,Edit->FontColor,0);
break;
case WM_EXIT: //结速编辑
bLoop=0;
break;
}
break;
case -1:switch(Buffer->h.RetKey) //是控制键
{
case ESCKEY: //ESC键
case TABKEY: //TAB键
case CRKEY: //回车键
strcpy(Edit->Text,Text);
InBuffer(-4,WM_PAINT,0,0);
InBuffer(-4,WM_EXIT,0,0);
Result=Buffer->h.RetKey; //函数返回
break;
case BSKEY: //退格键
if(Edit->CurX>0) //光标不在0位
{
Edit->CurX--;
Edit->CountX--;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -