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

📄 graphfun.c

📁 dos下pos机程序 连接sybase数据库 使用Microsoft c7 编译
💻 C
📖 第 1 页 / 共 3 页
字号:
	 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,&reg,&reg,&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 + -