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