zoukankan      html  css  js  c++  java
  • pcc32源文件

    pcc32.c


    /********************************************************
    * Author:  RedOC                                        *
    * Email:   RedOC@foxmail.com                            *
    * Notes:   Some functions about Win32 Console Control.  *
    * License: Copyleft. Enjoy it Just for fun.             *
    * Date:    2008-12-17 00:28:39                          *
    ********************************************************/
    
    #include "pcc32.h"
    
    void delayMS(uint32 d)
    {
       Sleep(d);
       return ;
    }
    
    void clearText(void)
    {
       system("cls");
       return ;
    }
    
    int setTextColor(uint8 fColor)
    {
       HANDLE hd = GetStdHandle(STD_OUTPUT_HANDLE);
       CONSOLE_SCREEN_BUFFER_INFO csbInfo;
       GetConsoleScreenBufferInfo(hd, &csbInfo);
       return SetConsoleTextAttribute(hd, fColor | (csbInfo.wAttributes&~0x0F));
    }
    
    PCCOLOR getTextColor(void)
    {
       CONSOLE_SCREEN_BUFFER_INFO csbInfo;
       GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbInfo);
       return (PCCOLOR)(csbInfo.wAttributes&0x0F);
    }
    
    int setBackColor(uint8 bColor)
    {
       HANDLE hd = GetStdHandle(STD_OUTPUT_HANDLE);
       CONSOLE_SCREEN_BUFFER_INFO csbInfo;
       GetConsoleScreenBufferInfo(hd, &csbInfo);
       return SetConsoleTextAttribute(hd, (bColor << 4) | (csbInfo.wAttributes&~0xF0));
    }
    
    PCCOLOR getBackColor(void)
    {
       CONSOLE_SCREEN_BUFFER_INFO csbInfo;
       GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbInfo);
       return (PCCOLOR)((csbInfo.wAttributes&0xF0) >> 4);
    }
    
    int setColors(uint8 fColor, uint8 bColor)
    {
       HANDLE hd = GetStdHandle(STD_OUTPUT_HANDLE);
       CONSOLE_SCREEN_BUFFER_INFO csbInfo;
       GetConsoleScreenBufferInfo(hd, &csbInfo);
       return SetConsoleTextAttribute(hd, fColor | (bColor << 4) | (csbInfo.wAttributes&~0xFF));
    }
    
    int setSwapColors(int b)
    {
       HANDLE hd = GetStdHandle(STD_OUTPUT_HANDLE);
       CONSOLE_SCREEN_BUFFER_INFO csbInfo;
       GetConsoleScreenBufferInfo(hd, &csbInfo);
       if (!!b)
          return SetConsoleTextAttribute(hd, csbInfo.wAttributes | 0x4000);
       else
          return SetConsoleTextAttribute(hd, csbInfo.wAttributes & ~0x4000);
    }
    
    int setUnderLine(int b)
    {
       HANDLE hd = GetStdHandle(STD_OUTPUT_HANDLE);
       CONSOLE_SCREEN_BUFFER_INFO csbInfo;
       GetConsoleScreenBufferInfo(hd, &csbInfo);
       if (!!b)
          return SetConsoleTextAttribute(hd, csbInfo.wAttributes | 0x8000);
       else
          return SetConsoleTextAttribute(hd, csbInfo.wAttributes & ~0x8000);
    }
    
    uint8 getLineWidth(void)
    {
       CONSOLE_SCREEN_BUFFER_INFO csbInfo;
       GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbInfo);
       return csbInfo.dwSize.X;
    }
    
    uint8 getLineNum(void)
    {
       CONSOLE_SCREEN_BUFFER_INFO csbInfo;
       GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbInfo);
       return csbInfo.dwSize.Y;
    }
    
    uint8 getCursorX(void)
    {
       CONSOLE_SCREEN_BUFFER_INFO csbInfo;
       GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbInfo);
       return csbInfo.dwCursorPosition.X;
    }
    
    uint8 getCursorY(void)
    {
       CONSOLE_SCREEN_BUFFER_INFO csbInfo;
       GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbInfo);
       return csbInfo.dwCursorPosition.Y;
    }
    
    int gotoTextPos(uint8 x, uint8 y)
    {
       COORD cd;
       cd.X = x;
       cd.Y = y;
       return SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), cd);
    }
    
    int setCursorVisible(int b)
    {
       HANDLE hd = GetStdHandle(STD_OUTPUT_HANDLE);
       CONSOLE_CURSOR_INFO ccInfo;
       GetConsoleCursorInfo(hd, &ccInfo);
       ccInfo.bVisible = !!b;
       return SetConsoleCursorInfo(hd, &ccInfo);
    }
    
    int setCursorSize(uint8 s)
    {
       HANDLE hd = GetStdHandle(STD_OUTPUT_HANDLE);
       CONSOLE_CURSOR_INFO ccInfo;
       GetConsoleCursorInfo(hd, &ccInfo);
       ccInfo.dwSize = s;
       return SetConsoleCursorInfo(hd, &ccInfo);
    }
    
    int getConsoleTitle(char *title, uint8 len)
    {
       return GetConsoleTitle(title, len);
    }
    
    int setConsoleTitle(char *title)
    {
       return SetConsoleTitle(title);
    }
    
    int fixConsoleSize(uint16 width, uint16 height)
    {
       int ret = 0;
       int fixX = 0, fixY = 0;
       COORD cd;
       SMALL_RECT srctWindow;
       CONSOLE_SCREEN_BUFFER_INFO csbiInfo;
       HANDLE hWin = GetStdHandle(STD_OUTPUT_HANDLE);
    
       if (!hWin)
          return 0;
    
       // 调整最小范围
       fixX = (width < MIN_CONSOLE_WIDTH) ? MIN_CONSOLE_WIDTH : width;
       fixY = (height < MIN_CONSOLE_HEIGHT) ? MIN_CONSOLE_HEIGHT : height;
    
       // 先将BUF尺寸扩大到最大
       cd.X = 512;
       cd.Y = 512;
       ret = SetConsoleScreenBufferSize(hWin, cd);
       if (!ret)
          return ret;
       //puts("Set Max Buf Error.");
    
       // 测试屏幕允许的最大尺寸
       GetConsoleScreenBufferInfo(hWin, &csbiInfo);
       cd = csbiInfo.dwMaximumWindowSize;
       //printf("Max Win Size[%d, %d].\n", cd.X, cd.Y);
       fixX = (fixX > cd.X) ? cd.X : fixX;
       fixY = (fixY > cd.Y) ? cd.Y : fixY;
       //printf("Fix Win Size[%d, %d].\n", fixX, fixY);
    
       // 确定适当的窗口尺寸
       srctWindow.Left = 0;
       srctWindow.Right = fixX - 1;
       srctWindow.Top = 0;
       srctWindow.Bottom = fixY - 1;
       ret = SetConsoleWindowInfo(hWin, 1, &srctWindow);
       if (!ret)
          return ret;
       //puts("Set Size Error.");
    
       // 确定适当的BUF尺寸
       cd.X = fixX;
       cd.Y = fixY;
       ret = SetConsoleScreenBufferSize(hWin, cd);
       if (!ret)
          return ret;
    
       //printf("Fix Win Size[%d, %d]: %d.\n", fixX, fixY, ret);
       Sleep(100);
       return ret;
    }
    
    int showConsoleInfo()
    {
       int ret;
       HANDLE hWin = GetStdHandle(STD_OUTPUT_HANDLE);
       CONSOLE_SCREEN_BUFFER_INFO csbiInfo;
    
       ret = GetConsoleScreenBufferInfo(hWin, &csbiInfo);
       if (ret)
       {
          printf("Buffer Size: [X]%d - [Y]%d\n", csbiInfo.dwSize.X, csbiInfo.dwSize.Y);
          printf("Cursor Pos : [X]%d - [Y]%d\n", csbiInfo.dwCursorPosition.X, csbiInfo.dwCursorPosition.Y);
          printf("Attributes : %d\n", csbiInfo.wAttributes);
          printf("Current Win: [L]%d - [R]%d - [T]%d - [B]%d\n", \
                 csbiInfo.srWindow.Left, csbiInfo.srWindow.Right, csbiInfo.srWindow.Top, csbiInfo.srWindow.Bottom);
          printf("Maximum Win: [X]%d - [Y]%d\n", csbiInfo.dwMaximumWindowSize.X, csbiInfo.dwMaximumWindowSize.Y);
          puts("Over.");
       }
       return ret;
    }
    
    int simpleRing(uint16 freq, uint16 len)
    {
       return Beep(freq, len);
    }
    
    uint16 jkGetKey(void)
    {
       uint16 rk = 0;
       uint8 k = getch();
       if (k == JK_FUNC_KEY)
       {
          k = getch();
          rk = 0xFF00 | k;
          return rk;
       }
       if (k == JK_CTRL_KEY)
       {
          k = getch();
          rk = 0xE000 | k;
          return rk;
       }
       rk = 0x0000 | k;
       return rk;
    }
    
    int jkHasKey(void)
    {
       return (kbhit());
    }
    
    //End of pcc32.c
    


    pcc32.h


    /********************************************************
    * Author:  RedOC                                        *
    * Email:   RedOC@foxmail.com                            *
    * Notes:   Some functions about Win32 Console Control.  *
    * License: Copyleft. Enjoy it Just for fun.             *
    * Date:    2008-12-17 00:28:39                          *
    ********************************************************/
    
    #ifndef PCC32_H_INCLUDED
    #define PCC32_H_INCLUDED
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    #include <windows.h>
    
    #ifndef REDOC_COMMEN_TYPE
    #define REDOC_COMMEN_TYPE
    
    typedef unsigned char uint8;
    typedef unsigned short uint16;
    typedef unsigned long uint32;
    
    #endif // REDOC_COMMEN_TYPE
    
    /* 按键定义 */
    #define JK_FUNC_KEY  0x00
    #define JK_CTRL_KEY  0xE0
    
    #define JK_ESC       0x001B
    #define JK_ENTER     0x000D
    #define JK_SPACE     0x0020
    #define JK_BKSPACE   0x0008
    #define JK_TAB       0x0009
    
    #define JK_CTRL_Z    0x001A
    #define JK_CTRL_X    0x0018
    #define JK_CTRL_C    0x0003
    #define JK_CTRL_A    0x0001
    #define JK_CTRL_S    0x0013
    #define JK_CTRL_D    0x0004
    
    #define JK_LEFT      0xE04B
    #define JK_RIGHT     0xE04D
    #define JK_UP        0xE048
    #define JK_DOWN      0xE050
    #define JK_INSERT    0xE052
    #define JK_HOME      0xE047
    #define JK_PGUP      0xE049
    #define JK_DELETE    0xE053
    #define JK_END       0xE04F
    #define JK_PGDW      0xE051
    
    #define JK_F1        0xFF3B
    #define JK_F2        0xFF3C
    #define JK_F3        0xFF3D
    #define JK_F4        0xFF3E
    #define JK_F5        0xFF3F
    #define JK_F6        0xFF40
    #define JK_F7        0xFF41
    #define JK_F8        0xFF42
    #define JK_F9        0xFF43
    #define JK_F10       0xFF44
    #define JK_F11       0xE085
    #define JK_F12       0xE086
    
    /* 控制台尺寸定义 */
    #define MIN_CONSOLE_WIDTH   14
    #define MIN_CONSOLE_HEIGHT  1
    
    /* 颜色定义 */
    typedef enum _PCCOLOR
    {
       BLACK           =  0,   // 黑色
       BLUE            =  1,   // 蓝色
       GREEN           =  2,   // 绿色
       CYAN            =  3,   // 青色
       RED             =  4,   // 红色
       MAGENTA         =  5,   // 紫色
       BROWN           =  6,   // 褐色
       LIGHT_GRAY      =  7,   // 浅灰
       DARK_GRAY       =  8,   // 深灰
       LIGHT_BLUE      =  9,   // 亮蓝
       LIGHT_GREEN     = 10,   // 亮绿
       LIGHT_CYAN      = 11,   // 浅蓝
       LIGHT_RED       = 12,   // 亮红
       LIGHT_MAGENTA   = 13,   // 亮紫
       YELLOW          = 14,   // 黄色
       WHITE           = 15    // 白色
    }PCCOLOR;
    
    #ifdef __cplusplus
    extern "C"
    {
    #endif
    
       /* 延时,以毫秒计 */
       void delayMS(uint32 d);
       /* 清除文字 */
       void clearText(void);
       /* 暂停,等待用户按键 */
       void pauseHere(void);
       /* 发出简单的响铃声(阻塞,慎用) */
       int simpleRing(uint16 freq, uint16 len);
    
       /* 设置文本颜色,0~15 */
       int setTextColor(uint8 fColor);
       /* 获取文本颜色,0~15 */
       PCCOLOR getTextColor(void);
       /* 设置文本背景颜色,0~15 */
       int setBackColor(uint8 bColor);
       /* 获取文本背景颜色,0~15 */
       PCCOLOR getBackColor(void);
       /* 设置文本及其背景颜色,0~15 */
       int setColors(uint8 fColor, uint8 bColor);
       /* 设置/取消前/背景颜色的交换解析 */
       int setSwapColors(int b);
       /* 设定/取消文字的下划线 */
       int setUnderLine(int b);
    
       /* 获取控制台文本行的最大长度[默认为80] */
       uint8 getLineWidth(void);
       /* 获取控制台文本行的最大行数 */
       uint8 getLineNum(void);
    
       /* 获取光标的横坐标[列数] */
       uint8 getCursorX(void);
       /* 获取光标的纵坐标[行数] */
       uint8 getCursorY(void);
       /* 屏幕光标定位,x为列(横),y为行(纵) */
       int gotoTextPos(uint8 x, uint8 y);
       /* 设置光标的可见性 */
       int setCursorVisible(int b);
       /* 设置光标的(厚度)尺寸,1-100 */
       int setCursorSize(uint8 s);
    
       /* 获取控制台的标题字符串 */
       int getConsoleTitle(char *title, uint8 len);
       /* 设置控制台的标题字符串 */
       int setConsoleTitle(char *title);
    
       /* 设置一个没有滚动条的控制台窗口尺寸 */
       int fixConsoleSize(uint16 width, uint16 height);
       /* 输出控制台的相关信息(仅作调试用) */
       int showConsoleInfo();
    
       /* 获取控制台的键输入 */
       uint16 jkGetKey(void);
       /* 判断控制台是否有键按下 */
       int jkHasKey(void);
    
    #ifdef __cplusplus
    }
    #endif
    
    #endif // PCC32_H_INCLUDED
    


  • 相关阅读:
    javascript
    自己动手、丰衣足食!<菜单导航栏------不简单>
    补---div渐变色条
    自己动手、丰衣足食!<箭头 → ← → ← ---2>
    自己动手、丰衣足食!<箭头 → ← → ← ---1>
    6.19 抽象类
    6.19 多态
    6.19 提纲
    6.18 继承
    6.18 (继承+(四类访问修饰符+程序集+静态方法))提纲
  • 原文地址:https://www.cnblogs.com/lgh1992314/p/5835278.html
Copyright © 2011-2022 走看看