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

📄 window.h

📁 一款文件加密的小软件
💻 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 + -