반응형

왼도우 콘솔 제어 및 키 입력 함수들.... 

 

정리. 오상문 sualchi@daum.net 

 

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <conio.h>    // kbhit(), getch()
#include <time.h>     // Sleep()

 

#define OFF 0
#define on  !OFF
// on은 대문자입니다. 다음 에디터에서 저장하면 소문자로 바뀌네요. -,,-;;  

 

// 콘솔창 윈도우 핸들 얻음
#define GET_OUTPUT_HANDLE() GetStdHandle(STD_OUTPUT_HANDLE)  
// SetConsoleTextAttribute(GET_OUTPUT_HANDLE, 색상값);

 

#define BLACK         0  // 검정색
#define DARK_BLUE     1  // 파란색
#define GREEN           2  // 녹색
#define BLUE_GREEN  3  // 청녹색
#define BLOOD          4  // 검붉은색
#define PURPLE         5  // 보라색
#define GOLD            6  // 금색
#define ORIGINAL       7  // 밝은회색(원래 콘솔 색)
#define GRAY            8  // 회색
#define BLUE            9  // 파란색
#define HIGH_GREEN 10 // 연두색
#define SKY_BLUE    11 // 하늘색
#define RED             12 // 빨간색
#define PLUM           13 // 자주색
#define YELLOW       14 // 노란색
#define WHITE           15 // 흰색

 

// 키 입력 제어
#define EXTENDED_KEY 224

#define LEFT 75
#define RIGHT 77
#define UP 72
#define DOWN 80
#define SPACE 32
#define ENTER 13
#define ESC 27

#define p 112
#define P 80
#define r 114
#define R 82
#define q 113
#define Q 81

 

// 시간 지연 매크로 함수(1/1000초 단위)  
#define Delay(milsec) Sleep(milsec)
#define delay(milsec) Sleep(milsec)

 

// 글자 색 변경

// 흰색:WHITE(15),검정색:BLACK(0), ...

void TextColor(int color) {
  SetConsoleTextAttribute(GET_OUTPUT_HANDLE(), color); 
}

 

// 커서 on/OFF
void Cursor(int onoff)  // OFF:0, on:1
{
  CONSOLE_CURSOR_INFO curInfo;
  GetConsoleCursorInfo(GET_OUTPUT_HANDLE(), &curInfo);
  curInfo.bVisible = (onoff==ON); 
  SetConsoleCursorInfo(GET_OUTPUT_HANDLE(), &curInfo);
}

 

// 커서 위치 이동, (x,y)는 x행, y열, 시작:(1,1)
void GotoXY(int x, int y)
{
  COORD Pos = { --x, --y };   // { x-1, y-1 };  
  SetConsoleCursorPosition(GET_OUTPUT_HANDLE(), Pos);
}

 

// 키보드 버퍼 비움

void ClearKeyBuf(void) {
  while (kbhit()) getch();
}

 

// 화면 크기 조정 (가로, 세로 글자 수)

void ScreenMode(int cols, int lines) {
  char str[100];
  sprintf(str, "mode con:cols=%d lines=%d", cols, lines);
  system(str);
}

 

// 입력된 키가 있으면 읽음 (확장 키면 확장 키 코드를 받음)

// 입력된 키가 없으면 돌아감...

int GetKey() {
  int key = 0;
  if (kbhit()) // 키 버퍼에 입력값이 있으면
  {
    key = getch();
    // 224 값이면 확장 키 코드를 받아온다
    if (key == EXTENDED_KEY)
      key = getch(); 
  } else
    return -1;   
  return key; 
}

 

// 확장 키 코드 입력 예제

int main()
{
  int key;

 

  ScreenMode(80,25); 
  Cursor(OFF);  // 커서 사라짐
 
  GotoXY(11,18);
  printf("키보드 키를 누르면 확장 키 코드를 알려줍니다.");  
 
  TextColor(YELLOW); 
  while(1) {
    delay(50);  
    key = GetKey();
    if(key!=-1) {   
      GotoXY(13,25);
      printf("%d번 코드 키가 눌렸습니다.  ", key);   
    }
  }

  Cursor(ON);    
  TextColor(WHITE); 
  return 0;
}

 

[참조] 배하람님의 테트리스 코드에서 발췌하여 추가 정리한 코드입니다. 

 

반응형

+ Recent posts