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

📄 hwin.c

📁 1. 书中所有源程序, 在CPP子目录下, CPP.EXE是压缩可自释放的文件, 在DOS 下运行该文件即可释放 2. 书中程序的部分演示程序(源程序的编译), 在DEMO子目录下, 运行压缩
💻 C
字号:
/*
   HWIN.C 高级窗口设计
*/
#include "graphics.h"
#include "alloc.h"
#include "conio.h"
#include "process.h"

#define   MAX 10         /* 定义窗口的最大数         */

typedef struct Win{      /* 定义窗口的数据类型       */
   int  x1, y1, x2, y2;  /* 窗口的左上角及右下角坐标 */
   int  Cx, Cy;          /* 窗口内当前光标的位置     */
   char *WdBuf;          /* 存储窗口内容             */
   int  Color;           /* 窗口前景色               */
} WIND;

typedef struct Scr{
   int x0;
   int Buf;
   int Lst[MAX];
} SWIND;

int  SavWd();
int  PopWd(int, int, int, int, int, int, int ,int);
int  DelTopWd();
void DelAllWd();
void InitGra(void);
void Quit();
void InitWd();
int  DelWd(int Wnd);
int  WdPos(int Wnd);
int  PopCentWd(int, int, int, int, int, int);
int  WdPopTop(int);
int  WdRedraw(int);
void WdRedrawAll();
int  SavTopWd();
void WdUp(int, int);
void WdDown(int, int);
void WdRight(int, int);
void WdLeft(int, int);

SWIND CWd;
WIND  *SWd[MAX];

int main()
{
   int Wd1, Wd2, Wd3, Wd4, Wd5;
   InitWd();
   InitGra();                                      /* 初始化屏幕为图形方式 */
   Wd1 = PopWd(15, 12, 50, 50, 0, BLUE, 1, RED);   /*弹出窗口1, 红色,绿边框*/
   Wd2 = PopWd(25, 22, 63, 61, 0, BLUE, 1, YELLOW);/*弹出窗口2, 黄色,绿边框*/
   Wd3 = PopWd(115,112,150,150,0, WHITE,1, BLUE);  /*弹出窗口3, 蓝色,白边框*/
   Wd4 = PopWd(125,222,263,261,0, WHITE,1, GREEN); /*弹出窗口4, 绿色,白边框*/
   Wd5 = PopCentWd(50, 50, 0, RED, 1, WHITE);      /*弹出窗口5, 白色,红边框*/
   getch();
   WdPopTop(Wd1);           /* 窗口1弹到当前窗口 */
   getch();
   WdUp(Wd4, 100);          /* 窗口4上移100      */
   getch();
   WdDown(Wd2, 200);        /* 窗口2下移200      */
   getch();
   WdLeft(Wd5, 100);        /* 窗口5左移100      */
   getch();
   WdRight(Wd1,100);        /* 窗口1右移100      */
   getch();
   DelTopWd();              /* 删除最当前窗口    */
   getch();
   DelWd(Wd2);              /* 删除窗口2         */
   getch();
   DelAllWd();              /* 删除所有窗口      */
   getch();
   Quit();
   return 0;
}

int SavWd()       /* 将窗口内容存入指针 */
{
   struct viewporttype OldV;
   int x1, y1, x2, y2;
   getviewsettings(&OldV);
   if (! CWd.x0)
   {
      x1 = 0;
      y1 = 0;
      x2 = 1;
      y2 = 1;
   }
   else
   {
      x1 = OldV.left;
      y1 = OldV.top;
      x2 = OldV.right;
      y2 = OldV.bottom;
   }
   SWd[CWd.x0]->WdBuf = (char *)(malloc(imagesize(x1, y1, x2, y2)));
   if (SWd[CWd.x0]->WdBuf == NULL) return 0;
   setviewport(0, 0, 639, 479, 1);
   getimage(x1, y1, x2, y2, SWd[CWd.x0] -> WdBuf);
   return 1;
}

/* 弹出一个窗口 */
int PopWd(int x1,int y1,int x2,int y2,int BdTp,int BdCl,int BkFil,int FilCl)
{
   struct viewporttype OldV;
   int Oldx, Oldy, SavCl;
   if (CWd.Buf >= MAX) return 0;
   if ((SWd[CWd.x0] = (WIND *)malloc(sizeof(WIND))) == NULL) return 0;
   getviewsettings(&OldV);
   Oldx = getx();   Oldy = gety();
   if (! SavWd())
   {
      setviewport(OldV.left, OldV.top, OldV.right, OldV.bottom, 1);
      moveto(Oldx, Oldy);
      free(SWd[CWd.x0]);
      return 0;
   }
   setviewport(0, 0, 639, 479,1);
   SavCl = getcolor();
   setcolor(BdCl);
   setlinestyle(BdTp, 0, NORM_WIDTH);
   setfillstyle(BkFil, FilCl);
   bar3d(x1, y1, x2, y2, 0, 0);
   setviewport(x1, y1, x2, y2, 1);
   SWd[CWd.x0]->x1 = OldV.left;             /* 保存新弹出的窗口信息 */
   SWd[CWd.x0]->y1 = OldV.top;
   SWd[CWd.x0]->x2 = OldV.right;
   SWd[CWd.x0]->y2 = OldV.bottom;
   SWd[CWd.x0]->Cx = Oldx;
   SWd[CWd.x0]->Cy = Oldy;
   SWd[CWd.x0]->Color = SavCl;
   CWd.Buf++;
   CWd.x0 = CWd.Lst[CWd.Buf];
   setcolor(SavCl);
   return (CWd.x0);
}

int DelTopWd()    /* 删除当前窗口 */
{
   CWd.Buf--;
   CWd.x0 = CWd.Lst[CWd.Buf];
   if (CWd.Buf <= 0) return 0;
   setviewport(SWd[CWd.x0]->x1, SWd[CWd.x0]->y1,\
    SWd[CWd.x0]->x2, SWd[CWd.x0]->y2, 1);
   setcolor(SWd[CWd.x0]->Color);
   free(SWd[CWd.x0]);
   WdRedrawAll();
   return 1;
}

void DelAllWd()   /* 删除所有的窗口 */
{
   while (DelTopWd()) ;
   cleardevice();
   return;
}

void InitGra(void)  /* 初始化屏幕为图形方式 */
{
   int  GraphDrive = DETECT, GraphMode;
   registerbgidriver(EGAVGA_driver);
   initgraph(&GraphDrive, &GraphMode, "");
}

void Quit()
{
   closegraph();
   exit (0);
}

void InitWd()    /* 参数初始化 */
{
   int i;
   CWd.x0 = 0;
   CWd.Buf = 0;
   for (i = 0; i < MAX; i++) CWd.Lst[i] = i;
}

int DelWd(int Wnd)   /* 删除指定窗口 */
{
   int Loc, i;
   if (! Wnd) return 0;
   if (Wnd == CWd.x0)
   {
      DelTopWd();
      return 0;
   }
   Loc = WdPos(Wnd);
   if (Loc == -1) return 0;
   for (i = Loc; i < CWd.Buf+1; i++) CWd.Lst[i] = CWd.Lst[i+1];
   CWd.Lst[CWd.Buf] = Wnd;
   CWd.Buf--;
   CWd.x0 = CWd.Lst[CWd.Buf];
   WdRedrawAll();
   if (SWd[Wnd] != NULL)
   {
      free(SWd[Wnd]);
      SWd[Wnd] = NULL;
   }
   return 0;
}

int WdPos(int Wnd)    /* 搜索窗口在队列中的位置 */
{
   int i, Loc = -1;
   for (i = 0; i < CWd.Buf+1; i++)
   {
      if (CWd.Lst[i] == Wnd)
      {
	 Loc = i;
	 break;
      }
   }
   return (Loc);
}

/* 在屏幕中间弹出一个窗口 */
int PopCentWd(int Wid, int Hit, int BdTp, int BdCl, int BkFl, int FlCl)
{
   int x, y;
   x = (639-Wid)/2;
   y = (479-Hit)/2;
   return(PopWd(x, y, x+Wid, y+Hit, BdTp, BdCl, BkFl, FlCl));
}

int WdPopTop(int Wnd)      /* 将指定窗口弹到当前位置 */
{
   int oldx, oldy, savcolor;
   int Loc, i;
   if (! Wnd) return 0;
   if (Wnd == CWd.x0) return 0;
   Loc = WdPos(Wnd);
   if (Loc == -1) return 0;
   if (! SavTopWd()) return 0;
   for (i = Loc; i < CWd.Buf; i++) CWd.Lst[i] = CWd.Lst[i+1];
   CWd.Lst[CWd.Buf] = Wnd;
   WdRedraw(Wnd);
   CWd.x0 = CWd.Lst[CWd.Buf];
   setviewport(SWd[CWd.x0]->x1, SWd[CWd.x0]->y1, SWd[CWd.x0]->x2,\
       SWd[CWd.x0]->y2, 1);
   if (SWd[CWd.x0] != NULL) free(SWd[CWd.x0]);
   return 0;
}

int WdRedraw(int Wnd)    /* 重画指定的窗口 */
{
   if (SWd[Wnd]->WdBuf == NULL) return 0;
   if (WdPos(Wnd) == -1) return 0;
   putimage(SWd[Wnd]->x1, SWd[Wnd]->y1, SWd[Wnd]->WdBuf, COPY_PUT);
   return 0;
}

void WdRedrawAll()   /* 重画所有窗口 */
{
   int i;
   void *Buf;
   struct viewporttype OldV;
   int x1, y1, x2, y2;
   getviewsettings(&OldV);
   x1 = OldV.left;
   y1 = OldV.top;
   x2 = OldV.right;
   y2 = OldV.bottom;
   Buf = (char *) malloc(imagesize(x1, y1, x2, y2));
   if (! Buf) return;
   setviewport(0, 0, 639, 479, 1);
   getimage(x1, y1, x2, y2, Buf);
   cleardevice();
   for (i = 0; i < CWd.Buf; i++) WdRedraw(CWd.Lst[i]);
   putimage(x1, y1, Buf, COPY_PUT);
   setviewport(x1, y1, x2, y2, 1);
   return;
}

int SavTopWd()      /* 把当前窗口和内容存入栈中 */
{
   struct viewporttype OldV;
   int Oldx, Oldy, SavCl;
   if (CWd.Buf >= MAX) return 0;
   if ((SWd[CWd.x0] = (WIND *)malloc(sizeof(WIND))) == NULL) return 0;
   getviewsettings(&OldV);
   Oldx = getx();
   Oldy = gety();
   if (! SavWd())
   {
      setviewport(OldV.left, OldV.top, OldV.right, OldV.bottom, 1);
      moveto(Oldx, Oldy);
      free(SWd[CWd.x0]);
      return 0;
   }
   SWd[CWd.x0]->x1 = OldV.left;             /* 保存新弹出的窗口新息 */
   SWd[CWd.x0]->y1 = OldV.top;
   SWd[CWd.x0]->x2 = OldV.right;
   SWd[CWd.x0]->y2 = OldV.bottom;
   SWd[CWd.x0]->Cx = Oldx;
   SWd[CWd.x0]->Cy = Oldy;
   SWd[CWd.x0]->Color = SavCl;
   return (1);
}

void WdUp(int Wnd, int  Dlt)    /* 窗口上移Dlt个象素点 */
{
   int WdMv;
   if (CWd.x0 == Wnd) SavTopWd();
   WdMv = SWd[Wnd]->y1;
   if (! WdMv) return ;
   if (WdMv-Dlt <= 0) Dlt = WdMv;
   SWd[Wnd]->y1 -= Dlt;
   SWd[Wnd]->y2 -= Dlt;
   WdRedrawAll();
   if (CWd.x0 == Wnd)
   {
      setviewport(0, 0, 639, 479, 1);
      putimage(SWd[Wnd]->x1, SWd[Wnd]->y1+Dlt, SWd[Wnd]->WdBuf, XOR_PUT);
      putimage(SWd[Wnd]->x1, SWd[Wnd]->y1, SWd[Wnd]->WdBuf, COPY_PUT);
      free(SWd[Wnd]);
   }
   return;
}

void WdDown(int Wnd, int Dlt)    /* 窗口下移Dlt个象素点 */
{
   int WdMv;
   if (CWd.x0 == Wnd) SavTopWd();
   WdMv = SWd[Wnd]->y2;
   if (WdMv == 479) return ;
   if (479-WdMv <= Dlt) Dlt = 479-WdMv;
   SWd[Wnd]->y1 += Dlt;
   SWd[Wnd]->y2 += Dlt;
   WdRedrawAll();
   if (CWd.x0 == Wnd)
   {
      setviewport(0, 0, 639, 479, 1);
      putimage(SWd[Wnd]->x1, SWd[Wnd]->y1-Dlt, SWd[Wnd]->WdBuf, XOR_PUT);
      putimage(SWd[Wnd]->x1, SWd[Wnd]->y1, SWd[Wnd]->WdBuf, COPY_PUT);
      free(SWd[Wnd]);
   }
   return;
}

void WdRight(int Wnd, int  Dlt)     /* 窗口右移Dlt个象素点 */
{
   int WdMv;
   if (CWd.x0 == Wnd) SavTopWd();
   WdMv=SWd[Wnd]->x2;
   if (WdMv == 639) return ;
   if (639-WdMv <= Dlt) Dlt = 639-WdMv;
   SWd[Wnd]->x1 += Dlt;
   SWd[Wnd]->x2 += Dlt;
   WdRedrawAll();
   if (CWd.x0 == Wnd)
   {
      setviewport(0, 0, 639, 479, 1);
      putimage(SWd[Wnd]->x1-Dlt, SWd[Wnd]->y1, SWd[Wnd]->WdBuf, XOR_PUT);
      putimage(SWd[Wnd]->x1, SWd[Wnd]->y1, SWd[Wnd]->WdBuf, COPY_PUT);
      free(SWd[Wnd]);
   }
   return;
}

void WdLeft(int Wnd, int  Dlt)      /* 窗口左移Dlt个象素点 */
{
   int WdMv;
   if (CWd.x0 == Wnd) SavTopWd();
   WdMv = SWd[Wnd]->x1;
   if (! WdMv) return ;
   if (WdMv < Dlt) Dlt = WdMv;
   SWd[Wnd]->x1 -= Dlt;
   SWd[Wnd]->x2 -= Dlt;
   WdRedrawAll();
   if (CWd.x0 == Wnd)
   {
      setviewport(0, 0, 639, 479, 1);
      putimage(SWd[Wnd]->x1+Dlt, SWd[Wnd]->y1, SWd[Wnd]->WdBuf, XOR_PUT);
      putimage(SWd[Wnd]->x1, SWd[Wnd]->y1, SWd[Wnd]->WdBuf, COPY_PUT);
      free(SWd[Wnd]);
   }
   return;
}

⌨️ 快捷键说明

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