Memory Drive

반응형

  1. #include <windows.h>
  2. #include <stdio.h>
  3. #include <conio.h>
  4. // 화면을 지우는 함수.
  5. void clrscr(void)
  6. {
  7.   system("cls")
  8. }
  9. // 코드페이지 변경 함수 ( 영문 : 437 , 한글 : 949 )
  10. void SetCodePage(UINT nPage)
  11. {
  12.   SetConsoleCP(nPage);
  13.   SetConsoleOutputCP(nPage);
  14. }
  15. // 코드페이지를 얻는 함수
  16. UINT GetCodePage(void)
  17. {
  18.   return GetConsoleCP()
  19. }
  20. // 현제 커서 X 위치를 얻는 함수
  21. int wherex(void)
  22. {
  23.   CONSOLE_SCREEN_BUFFER_INFO BufInfo;
  24.   GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE),&BufInfo);
  25.   return BufInfo.dwCursorPosition.X;
  26. }
  27. // 현제 커서 Y 위치를 얻는 함수
  28. int wherey(void)
  29. {
  30.   CONSOLE_SCREEN_BUFFER_INFO BufInfo;
  31.   GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE),&BufInfo);
  32.   return BufInfo.dwCursorPosition.Y;
  33. }
  34. // 커서 위치를 설정하는 함수
  35. void  gotoxy(int x, int y)
  36. {
  37.   COORD Pos = { x , y };
  38.   SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);
  39. }
  40. // 글자 색깔을 변경하는 함수
  41. void  SetTextAttribute(WORD BkColor, WORD TxColor)
  42. {
  43.   SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), (unsigned char)((BkColor << 4) TxColor));
  44. }
  45. // 택스트를 출력하는 함수.
  46. int PrintText(int nPosX, int nPosY, const char* szFormat, ...)
  47. {
  48.   char szBuffer[512] = { 0 };
  49.   if(szFormat)
  50.   {
  51.     va_list vl;
  52.     va_start(vl, szFormat);
  53.     vsprintf(szBuffer, szFormat, vl);
  54.     va_end(vl);
  55.   }
  56.   gotoxy(nPosX, nPosY);
  57.   return fputs(szBuffer, stdout);
  58. }
  59. // 전광판과 같은 스크롤 텍스트 출력.
  60. int PrintNeonsineText(int nPosX, int nPosY, int nWidth, int nFrame, const char* szFormat, ...)
  61. {
  62.   int     i, nBufferLen;
  63.   char    szBuffer[512]   = { 0 };
  64.   char    szNeonsine[512] = { 0, };
  65.   if(szFormat)
  66.   {
  67.     va_list vl;
  68.     va_start(vl, szFormat);
  69.     nBufferLen = vsprintf(szBuffer, szFormat, vl);
  70.     va_end(vl);
  71.   }
  72.   strcpy(&szNeonsine[nFrame = (nFrame % nWidth)], szBuffer);
  73.   i = nWidth - nFrame;
  74.   if(i < nBufferLen) strcpy(szNeonsine, &szBuffer[i]);
  75.   for(i = 0 ; i < nWidth ; ++i) if(!szNeonsine[i]) szNeonsine[i] = ' ';
  76.   szNeonsine[nWidth] = 0;
  77.   gotoxy(nPosX, nPosY);
  78.   fputs(szNeonsine, stdout);
  79.   return nFrame;
  80. }
  81. void main(void)
  82. {
  83.   int   nPosX     = 0;
  84.   int   nPosY     = 10;
  85.   int   nBkColor  = 7;
  86.   int   nTxColor  = 0;
  87.   int   nWidth    = 50;
  88.   int   nFrame    = 0;
  89.   int   nSpeed    = 1;
  90.   int   nDelay    = 200;
  91.   char  szString[512] = "This is Test of Scroll String";
  92.   //              "┌──────────────────────────────────────┐"
  93.   PrintText(0, 0, "┌────┬────────┬────┬────┬────┬────┐");
  94.   PrintText(0, 1, "│POSITION│      COLOR     │ WIDTH  │ FRAME  │ SPEED  │ DELAY  │");
  95.   PrintText(0, 2, "├────┼────────┼────┼────┼────┼────┤");
  96.   PrintText(0, 3, "│%2d , %2d │%2d , %2d         │ %6d │ %6d │ %6d │ %6d │"
  97.                 , nPosX, nPosY, nBkColor, nTxColor, nWidth, nFrame, nSpeed, nDelay);
  98.   PrintText(0, 4, "│NUM-MOVE│[SHIFT + ] > / <│NUM 7/9 │        │  + / - │ 1 - 9  │");
  99.   PrintText(0, 5, "├────┼────────┴────┴────┴────┴────┤");
  100.   PrintText(0, 6, "│ String │%-46s [ ENTER ]│", szString);
  101.   PrintText(0, 7, "└────┴────────────────────────────┘");
  102.   PrintText(0, 8, "0        1         2         3         4         5         6         7         8");
  103.   PrintText(0, 9, "12345678901234567890123456789012345678901234567890123456789012345678901234567890");
  104.   while("RUN")
  105.   {
  106.     while(kbhit())
  107.     {
  108.       int nCh = getch();
  109.       // 키 입력 센서
  110.       switch(nCh)
  111.       {
  112.       case 0x1B : clrscr(); gotoxy(0,0); return;
  113.       case 0x47 : PrintNeonsineText(nPosX, nPosY, nWidth, 0, ""); nWidth -= 1; break;
  114.       case 0x49 : PrintNeonsineText(nPosX, nPosY, nWidth, 0, ""); nWidth += 1; break;
  115.       case 0x4B : PrintNeonsineText(nPosX, nPosY, nWidth, 0, ""); nPosX  -= 1; break;
  116.       case 0x4D : PrintNeonsineText(nPosX, nPosY, nWidth, 0, ""); nPosX  += 1; break;
  117.       case 0x48 : PrintNeonsineText(nPosX, nPosY, nWidth, 0, ""); nPosY  -= 1; break;
  118.       case 0x50 : PrintNeonsineText(nPosX, nPosY, nWidth, 0, ""); nPosY  += 1; break;
  119.       case '+'  : nSpeed    += 1;   break;
  120.       case '-'  : nSpeed    -= 1;   break;
  121.       case '>'  : nBkColor  += 1;   break;
  122.       case '<'  : nBkColor  -= 1;   break;
  123.       case '.'  : nTxColor  += 1;   break;
  124.       case ','  : nTxColor  -= 1;   break;
  125.       case '1'  : nDelay     =  50; break;
  126.       case '2'  : nDelay     = 100; break;
  127.       case '3'  : nDelay     = 150; break;
  128.       case '4'  : nDelay     = 200; break;
  129.       case '5'  : nDelay     = 250; break;
  130.       case '6'  : nDelay     = 300; break;
  131.       case '7'  : nDelay     = 350; break;
  132.       case '8'  : nDelay     = 400; break;
  133.       case '9'  : nDelay     = 450; break;
  134.       case '0'  : nDelay     = 500; break;
  135.       case '\r' :
  136.       case '\n' :
  137.         {
  138.           PrintText(0, 6, "│ String │%60s│", "");
  139.           gotoxy(12, 6);
  140.           gets(szString);
  141.         } break;
  142.       }
  143.       if(nPosX    <   0) nPosX    = 0;
  144.       if(nPosY    <  10) nPosY    = 10;
  145.       if(nBkColor <   0) nBkColor = 0;
  146.       if(nBkColor >  15) nBkColor = 0;
  147.       if(nTxColor <   0) nTxColor = 0;
  148.       if(nTxColor >  15) nTxColor = 0;
  149.       if(nWidth   <   1) nWidth   = 1;
  150.       if(nSpeed   <   1) nSpeed   = 1;
  151.     }
  152.     // 메뉴
  153.     PrintText(0, 3, "│%2d , %2d │%2d , %2d         │ %6d │ %6d │ %6d │ %6d │"
  154.                   , nPosX, nPosY, nBkColor, nTxColor, nWidth, nFrame, nSpeed, nDelay);
  155.     PrintText(0, 6, "│ String │%-46s [ ENTER ]│", szString);
  156.     // 글 색깔 선택
  157.     SetTextAttribute(nBkColor, nTxColor);
  158.     PrintText(22, 3, "[TEXT]");
  159.     // 스크롤 출력
  160.     nFrame = PrintNeonsineText(nPosX, nPosY, nWidth, nFrame + nSpeed, szString);
  161.     // 글 색깔 복귀
  162.     SetTextAttribute(0, 7);
  163.     // 딜레이
  164.     Sleep(nDelay);
  165.   }
  166. }

출처 : 어느분..ㅡㅡ.. (모름)
반응형