Directio.c
上传用户:bjlvip
上传日期:2010-02-08
资源大小:744k
文件大小:7k
源码类别:

Windows编程

开发平台:

Visual C++

  1. #include <STDIO.H>
  2. #include <STRING.H>
  3. #include <STDLIB.H>
  4. #include <STDARG.H>
  5. #include <LIMITS.H>
  6. #include <WINDOWS.H>
  7. #include "directio.h"
  8. #define WHITE_ON_CYAN FOREGROUND_WHITE|FOREGROUND_INTENSITY|BACKGROUND_CYAN
  9. /* Declaration for Ctrl-C and Ctrl-Break handler */
  10. extern BOOL WINAPI CtrlHandler(DWORD CtrlType);
  11. HANDLE hStdOut;
  12. CONSOLE_SCREEN_BUFFER_INFO csbi;
  13. /* Initialize Screen Access and set Ctrl-C and Ctrl-Break handlesr */
  14. void set_vid_mem(void)
  15.    {
  16.    hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
  17.    GetConsoleScreenBufferInfo(hStdOut, &csbi);
  18.    SetConsoleCtrlHandler(CtrlHandler, TRUE);
  19.    }
  20. /* Display string pointed by str at location (x,y) with attribute attr */
  21. void mxyputs(unsigned char x, unsigned char y, char *str, unsigned  attr)
  22.    {
  23.    COORD BufferCoord;
  24.    DWORD dummy;
  25.    WORD Color[MAX_STR];
  26.    unsigned count;
  27.    BufferCoord.X = x;
  28.    BufferCoord.Y = y;
  29.    WriteConsoleOutputCharacter(hStdOut, str, strlen(str), BufferCoord,
  30.       &dummy);
  31.    for(count = 0; count < strlen(str); count++)
  32.       Color[count] = attr;
  33.    WriteConsoleOutputAttribute(hStdOut, Color, strlen(str), BufferCoord,
  34.       &dummy);
  35.    }
  36. /* Display character ch num times starting at (x,y) with attribute atr */
  37. void mxyputc(unsigned char x, unsigned char y, char ch, unsigned char num,
  38.    unsigned char attr)
  39.    {
  40.    COORD BufferCoord;
  41.    DWORD dummy;
  42.    BufferCoord.X = x;
  43.    BufferCoord.Y = y;
  44.    FillConsoleOutputCharacter(hStdOut, ch, num, BufferCoord, &dummy);
  45.    FillConsoleOutputAttribute(hStdOut, attr, num, BufferCoord, &dummy);
  46.    }
  47. /* Display character ch at location (x,y) with attribute attr   */
  48. void moutchar(unsigned char x, unsigned char y, char ch, unsigned char attr)
  49.    {
  50.    COORD BufferCoord;
  51.    DWORD dummy;
  52.    BufferCoord.X = x;
  53.    BufferCoord.Y = y;
  54.    FillConsoleOutputCharacter(hStdOut, ch, 1, BufferCoord, &dummy);
  55.    }
  56. /*
  57.    Display Box from (x1,y1) to (x2,y2), S_D flag for single
  58.    or double border
  59. */
  60. void box(unsigned char x1, unsigned char y1, unsigned char x2,
  61.    unsigned char y2, char S_D)
  62.    {
  63.    COORD BufferCoord;
  64.    DWORD dummy;
  65.    unsigned char count;
  66.    char chr;
  67.    for(count = y1 + 1; count < y2; count++)
  68.       {
  69.       BufferCoord.X = x1;
  70.       BufferCoord.Y = count;
  71.       chr = S_D ? 186 : 179;
  72.       FillConsoleOutputCharacter(hStdOut, chr, 1, BufferCoord, &dummy);
  73.       FillConsoleOutputAttribute(hStdOut, WHITE_ON_CYAN, 1, BufferCoord, 
  74.          &dummy);
  75.       BufferCoord.X = x2;
  76.       FillConsoleOutputCharacter(hStdOut, chr, 1, BufferCoord, &dummy);
  77.       FillConsoleOutputAttribute(hStdOut, WHITE_ON_CYAN, 1, BufferCoord, 
  78.          &dummy);
  79.       }
  80.    BufferCoord.X = x1 + 1;
  81.    BufferCoord.Y = y1;
  82.    count = x2 - x1 - 1;
  83.    chr =   S_D ? 205 : 196;
  84.    FillConsoleOutputCharacter(hStdOut, chr, count, BufferCoord, &dummy);
  85.    FillConsoleOutputAttribute(hStdOut, WHITE_ON_CYAN, count+1, BufferCoord,
  86.       &dummy);
  87.    BufferCoord.Y = y2;
  88.    chr = S_D ? 205 : 196;
  89.    FillConsoleOutputCharacter(hStdOut, chr, count, BufferCoord, &dummy);
  90.    FillConsoleOutputAttribute(hStdOut, WHITE_ON_CYAN, count+1, BufferCoord,
  91.       &dummy);
  92.    BufferCoord.X = x1;
  93.    BufferCoord.Y = y1;
  94.    chr = S_D ? 201 : 218;
  95.    FillConsoleOutputCharacter(hStdOut, chr, 1, BufferCoord, &dummy);
  96.    FillConsoleOutputAttribute(hStdOut, WHITE_ON_CYAN, 1, BufferCoord,
  97.       &dummy);
  98.    BufferCoord.Y = y2;
  99.    chr = S_D ? 200 : 192;
  100.    FillConsoleOutputCharacter(hStdOut, chr, 1, BufferCoord, &dummy);
  101.    FillConsoleOutputAttribute(hStdOut, WHITE_ON_CYAN, 1, BufferCoord,
  102.       &dummy);
  103.    BufferCoord.X = x2;
  104.    BufferCoord.Y = y1;
  105.    chr = S_D ? 187 : 191;
  106.    FillConsoleOutputCharacter(hStdOut, chr, 1, BufferCoord, &dummy);
  107.    FillConsoleOutputAttribute(hStdOut, WHITE_ON_CYAN, 1, BufferCoord,
  108.       &dummy);
  109.    BufferCoord.Y = y2;
  110.    chr = S_D ? 188 : 217;
  111.    FillConsoleOutputCharacter(hStdOut, chr, 1, BufferCoord, &dummy);
  112.    FillConsoleOutputAttribute(hStdOut, WHITE_ON_CYAN, 1, BufferCoord,
  113.       &dummy);
  114.    }
  115. /*
  116.    Reads field from (x1,y) to (x2,y), saves value in a variable pointed by
  117.    buffer
  118. */
  119. void read_field(unsigned char x1, unsigned char x2, unsigned char y,
  120.    char *buffer)
  121.    {
  122.    unsigned char col = x1;
  123.    unsigned char count;
  124.    for(count = x1; count <= x2; count++)
  125.       moutchar(count, y, (char)32, 0);
  126.    for(count = x1; ; count++)
  127.       {
  128.       buffer[count - x1] = toupper(get_character_wait());
  129.       if(buffer[count - x1] == 'r')
  130.          break;
  131.       if(buffer[count - x1] == 'b')
  132.          {
  133.          count--;
  134.          if(col != x1)
  135.             {
  136.             moutchar(--col, y, (char)32, 0);
  137.             count--;
  138.             }
  139.          }
  140.       else
  141.          moutchar(col++, y, buffer[count - x1], 0);
  142.       if(col < x1)
  143.          col = x1;
  144.       else
  145.          if(col > ((unsigned char)(x2 + 1)))
  146.             {
  147.             count--;
  148.             col = x2 + 1;
  149.             moutchar(col, y, (char)32, 0);
  150.             }
  151.       }
  152.    buffer[count - x1] = 0;
  153.    }
  154. /* Clears screen from (x1,y1) to (x2,y2) */
  155. void clear(unsigned char x1, unsigned char y1, unsigned char x2,
  156.    unsigned char y2, unsigned char attr)
  157.    {
  158.    unsigned char row;
  159.    for(row = y1; row <= y2; row++)
  160.       mxyputc(x1, row, (char)32, (unsigned char)((x2-x1)+1), attr);
  161.    }
  162. /* Clears the entire screen   */
  163. void clearscreen(WORD attr)
  164.    {
  165.    COORD BufferCoord;
  166.    DWORD dummy;
  167.    BufferCoord.X = 0;
  168.    BufferCoord.Y = 0;
  169.    FillConsoleOutputCharacter(hStdOut, (char)32, 80*25, BufferCoord, &dummy);
  170.    FillConsoleOutputAttribute(hStdOut, attr, 80*25, BufferCoord, &dummy);
  171.    if(!attr)
  172.       SetConsoleCtrlHandler(CtrlHandler, FALSE);
  173.    }
  174. /* Waits for a character and returns it */
  175. char get_character_wait(void)
  176.    {
  177.    HANDLE hStdIn;     /* standard input         */
  178.    DWORD dwInputMode; /* to save the input mode */
  179.    DWORD dwRead;
  180.    char chBuf;        /* buffer to read into    */
  181.    hStdIn = GetStdHandle(STD_INPUT_HANDLE);
  182.    GetConsoleMode(hStdIn, &dwInputMode);
  183.    SetConsoleMode(hStdIn, dwInputMode & ~ENABLE_LINE_INPUT & 
  184.       ~ENABLE_ECHO_INPUT);
  185.    ReadFile(hStdIn, &chBuf, sizeof(chBuf), &dwRead, NULL);
  186.    SetConsoleMode(hStdIn, dwInputMode);
  187.    return chBuf;
  188.    }
  189. /* If there is a character, returns it. Otherwise, returns */
  190. char get_character_no_wait(void)
  191.    {
  192.    HANDLE hStdIn;     /* standard input         */
  193.    INPUT_RECORD aInputBuffer;
  194.    DWORD dummy;
  195.    DWORD dwInputMode; /* to save the input mode */
  196.    hStdIn = GetStdHandle(STD_INPUT_HANDLE);
  197.    GetConsoleMode(hStdIn, &dwInputMode);
  198.    SetConsoleMode(hStdIn, dwInputMode & ~ENABLE_LINE_INPUT &
  199.       ~ENABLE_ECHO_INPUT);
  200.    PeekConsoleInput(hStdIn, &aInputBuffer, 1, &dummy);
  201.    SetConsoleMode(hStdIn, dwInputMode);
  202.    FlushConsoleInputBuffer(hStdIn);
  203.    if(aInputBuffer.EventType == KEY_EVENT)
  204.       return (char)(aInputBuffer.Event.KeyEvent.wVirtualKeyCode);
  205.    else
  206.    return 0;
  207.    }
  208. BOOL WINAPI CtrlHandler(DWORD CtrlType)
  209.    {
  210.    switch (CtrlType)
  211.       {
  212.       case CTRL_BREAK_EVENT:
  213.       case CTRL_C_EVENT:
  214.          return TRUE;
  215.          break;
  216.       }
  217.    return TRUE;
  218.    }