📄 window.h
字号:
/***
* window.h
*
* - 窗体函数。可以根据需要画单线框,双线框,以及确定
* 窗体的大小,坐标,颜色等。
*
* Copyright (c) starsStudio, 2004.2
* All Rights Reserved.
***/
/**
* void Frame(WINDOWHANDLE *tmpWin);
* - 根据窗体参数绘出窗体
**/
void
Frame(WINDOWHANDLE *tmpWin)
{
int i,j;
int frameCell[2][6]={ /* 窗体边框线条元素 */
0xc9,0xcd,0xbb,0xba,0xc8,0xbc,
0xda,0xc4,0xbf,0xb3,0xc0,0xd9
};
/* 在指定位置绘出窗体,针对80X25模式 */
textcolor(tmpWin->lineColor);
textbackground(tmpWin->bakColor);
gotoxy(tmpWin->left, tmpWin->top);
putch(frameCell[tmpWin->lineStyle][0]);
gotoxy(tmpWin->left,
tmpWin->top + tmpWin->height - 1);
putch(frameCell[tmpWin->lineStyle][4]);
gotoxy(tmpWin->left + tmpWin->width - 1,
tmpWin->top);
putch(frameCell[tmpWin->lineStyle][2]);
gotoxy(tmpWin->left + tmpWin->width - 1,
tmpWin->top + tmpWin->height - 1);
putch(frameCell[tmpWin->lineStyle][5]);
for (i=1; i<tmpWin->width-1; i++)
{
gotoxy(tmpWin->left + i, tmpWin->top);
putch(frameCell[tmpWin->lineStyle][1]);
gotoxy(tmpWin->left + i,
tmpWin->top + tmpWin->height-1);
putch(frameCell[tmpWin->lineStyle][1]);
}
for (i=1; i<tmpWin->height-1; i++)
{
gotoxy(tmpWin->left, tmpWin->top + i);
putch(frameCell[tmpWin->lineStyle][3]);
gotoxy(tmpWin->left + tmpWin->width-1,
tmpWin->top + i);
putch(frameCell[tmpWin->lineStyle][3]);
}
gotoxy(tmpWin->left+1, tmpWin->top); /* 打印窗体名称 */
cputs(tmpWin->title);
textcolor(tmpWin->fontColor);
textbackground(tmpWin->fillColor); /* 背景填充 */
for (i=(tmpWin->width - 2)/2+1;
i>=1;
i--)
{
for (j=tmpWin->top+1;
j<(tmpWin->top + tmpWin->height - 1);
j++)
{
gotoxy(tmpWin->left+tmpWin->width-1-i, j);
putch(' ');
gotoxy(tmpWin->left+i, j);
putch(' ');
}
}
for (i=1, j=0; i<tmpWin->height-1; i++)
{ /* 打印窗体内的信息 */
gotoxy(tmpWin->left+1, tmpWin->top + i);
while (tmpWin->displayStr[j] != '\n'
&& tmpWin->displayStr[j] != '\0')
{
putch(tmpWin->displayStr[j++]);
}
if (tmpWin->displayStr[j] == '\0') break;
else j++;
}
gotoxy(tmpWin->curx+tmpWin->left, /* 将光标停留在指定位置 */
tmpWin->cury+tmpWin->top);
}
/**
* BOOL Window(WINDOWHANDLE *tmpWin);
* - 绘制窗体并根据窗体参数设定返回所需要的值
**/
BOOL
Window(WINDOWHANDLE *tmpWin)
{
int i, j, lineWidth;
WORD extScanKey;
BOOL lineFullFlag;
char ch;
if (POP == tmpWin->popFlag) /* 如果是弹出型窗体 */
{
tmpWin->bufWindow =
(char *) malloc(tmpWin->width
* tmpWin->height
* 2 * sizeof(char));
if (NULL == tmpWin->bufWindow)
{
strcpy(message.displayStr, "[!]\n\n No enough memory for window ");
Message(&message);
getch();
FreeMessage(&message);
return FALSE;
}
gettext(tmpWin->left,
tmpWin->top,
tmpWin->left + tmpWin->width - 1,
tmpWin->top + tmpWin->height - 1,
tmpWin->bufWindow);
}
Frame(tmpWin); /* 绘出窗体 */
/* 如果不在窗体中输入信息 则返回 */
if (NORET == tmpWin->retFlag)
{
return TRUE;
}
tmpWin->retStr =
(char *) malloc(tmpWin->retStrLen * sizeof(char));
if (NULL == tmpWin->retStr)
{
strcpy(message.displayStr, "[!]\n\nNo enough memory for return-string\n");
Message(&message);
getch();
FreeMessage(&message);
return FALSE;
}
i = 0;
lineFullFlag = 0;
while (1) /* 在窗体中输入信息 */
{
while (1)
{
extScanKey = GetKey();
ch = extScanKey & 0x00ff;
if (KEY_ENTER == extScanKey
|| KEY_ESC == extScanKey
|| KEY_BACKSPACE == extScanKey)
break;
else if ((PLAIN == tmpWin->plainFlag
&& ch >=0x20 && ch <=0x7e)
|| NONPLAIN == tmpWin->plainFlag)
break;
}
/* 如果按下ESC键则返回FALSE;而按ENTER键则返回TRUE,
* 同时,tmpWin->retStrLen返回字符串实际长度i。 */
switch (extScanKey)
{
case KEY_ENTER: tmpWin->retStrLen = i;
return TRUE;
break;
case KEY_ESC: return FALSE;
break;
default: break;
}
/* 如果输入长度大于预定长度,则对退
* 格键以外的按键不予响应 */
if (i >= tmpWin->retStrLen
&& KEY_BACKSPACE != extScanKey)
{
goto NEXTSTEP;
}
/* 判断当前行是否已满 */
if (wherex() >=
(tmpWin->left + tmpWin->width - 3))
{
lineFullFlag = 1;
}
else
{
lineFullFlag = 0;
}
if (KEY_BACKSPACE == extScanKey /* 按下BackSpace键,后退一格 */
&& (wherex() > (tmpWin->left + tmpWin->curx)))
{
if (!lineFullFlag)
{
gotoxy(wherex()-1, wherey());
putch(' ');
gotoxy(wherex()-1, wherey());
i--;
}
else
{
i--;
/* 清当前行 */
gotoxy(tmpWin->curx + tmpWin->left,
tmpWin->cury + tmpWin->top);
lineWidth = tmpWin->width - tmpWin->curx - 2;
for (j=0; j<lineWidth; j++)
{
putch(' ');
}
/* 显示按下BackSpace键后的当前行 */
gotoxy(tmpWin->curx + tmpWin->left,
tmpWin->cury + tmpWin->top);
for (j=0; j<lineWidth; j++)
{
if (0 <= (i - lineWidth + j))
{
if (PLAIN == tmpWin->plainFlag)
{
putch(tmpWin->retStr[i-lineWidth+j]);
}
else putch('*');
}
}
}
goto NEXTSTEP;
}
else if (KEY_BACKSPACE == extScanKey
&& (wherex() == tmpWin->left + tmpWin->curx))
{
goto NEXTSTEP;
}
if (!lineFullFlag) /* 当前行未满时.. */
{
tmpWin->retStr[i] = ch;
if (tmpWin->plainFlag) putch(ch);
else putch('*');
}
else /* 当前行已满时.. */
{
tmpWin->retStr[i] = ch;
gotoxy(tmpWin->curx+tmpWin->left,
tmpWin->cury+tmpWin->top);
lineWidth = tmpWin->width - tmpWin->curx - 2;
for (j=0; j<lineWidth; j++)
{
if (PLAIN == tmpWin->plainFlag)
{
putch(tmpWin->retStr[i+1-lineWidth+j]);
}
else putch('*');
}
}
i++;
NEXTSTEP:;
}
}
/**
* void FreeWindow(WINDOWHANDLE *tmpWin);
* - 释放有返回值或弹出型窗体申请的空间
**/
void
FreeWindow(WINDOWHANDLE *tmpWin)
{
if ((RET == tmpWin->retFlag)
&& (NULL != tmpWin->retStr))
{
free(tmpWin->retStr);
tmpWin->retStr = NULL;
}
if ((POP == tmpWin->popFlag)
&& (NULL != tmpWin->bufWindow))
{
puttext(tmpWin->left,
tmpWin->top,
tmpWin->left + tmpWin->width - 1,
tmpWin->top + tmpWin->height - 1,
tmpWin->bufWindow);
free(tmpWin->bufWindow);
tmpWin->bufWindow = NULL;
}
}
/**
* BOOL Message(BYTE *str);
* - 显示给定信息
**/
BOOL
Message(WINDOWHANDLE *tmpMsg)
{
int len;
len = (strlen(tmpMsg->displayStr)-6);
tmpMsg->width = len + 2;
tmpMsg->left = 40 - tmpMsg->width/2 + 1;
tmpMsg->curx = len/2;
tmpMsg->cury = 4;
if (POP == tmpMsg->popFlag) /* 如果是弹出型窗体 */
{
tmpMsg->bufWindow = (char *)
malloc(tmpMsg->width
* tmpMsg->height
* 2 * sizeof(char));
if (NULL == tmpMsg->bufWindow)
{
return FALSE;
}
gettext(tmpMsg->left,
tmpMsg->top,
tmpMsg->left + tmpMsg->width - 1,
tmpMsg->top + tmpMsg->height - 1,
tmpMsg->bufWindow);
}
Frame(tmpMsg);
return TRUE;
}
/**
* void FreeMessage(WINDOWHANDLE *tmpMsg);
* - 释放弹出型消息窗体申请的空间
**/
void
FreeMessage(WINDOWHANDLE *tmpMsg)
{
if ((POP == tmpMsg->popFlag)
&& (NULL != tmpMsg->bufWindow))
{
puttext(tmpMsg->left,
tmpMsg->top,
tmpMsg->left + tmpMsg->width - 1,
tmpMsg->top + tmpMsg->height - 1,
tmpMsg->bufWindow);
free(tmpMsg->bufWindow);
tmpMsg->bufWindow = NULL;
}
}
/**
* int Panel(WINDOWHANDLE **pPanel, int num);
* - 面板及面板装载的菜单,成功则返回所选项的项目值
* - 取消选择则返回-1
**/
int
Panel(WINDOWHANDLE **pPanel, int num)
{
int i,
tmpColor;
WORD extScanKey;
/* 显示面板及面板上的菜单项 */
Window(pPanel[0]);
for (i=num-1; i>=2; i--)
{
Window(pPanel[i]);
}
tmpColor = pPanel[1]->fillColor;
pPanel[1]->fillColor = pPanel[1]->fontColor;
pPanel[1]->fontColor = tmpColor;
Window(pPanel[1]);
i = 1;
while (1)
{
extScanKey = GetKey();
/* 消去选定菜单高亮显示 */
tmpColor = pPanel[i]->fontColor;
pPanel[i]->fontColor = pPanel[i]->fillColor;
pPanel[i]->fillColor = tmpColor;
Window(pPanel[i]);
switch (extScanKey)
{
case KEY_ENTER: FreeWindow(pPanel[0]); /* ENTER键确认当前选择 */
return i-1;
break;
case KEY_ESC: FreeWindow(pPanel[0]); /* ESC键取消当前选择 */
return -1;
break;
case KEY_DOWN: i++; /* 用上下光标键选择菜单 */
if (i == num) i = 1;
break;
case KEY_UP: i--;
if (i == 0) i = num-1;
break;
default: break;
}
/* 高亮显示当前选定菜单项 */
tmpColor = pPanel[i]->fillColor;
pPanel[i]->fillColor = pPanel[i]->fontColor;
pPanel[i]->fontColor = tmpColor;
Window(pPanel[i]);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -