2010년 5월 23일 일요일

setcursortype(커서on/off)

콘솔창에서는 주로 문자를 입출력하는데 다음 입출력될 위치는 커서가 가리킨다. 사용자는 주기적으로 깜박거리는 커서를 보고 자신이 입력한 문자가 이 위치에 나타난다는 것을 알 수 있으며 또한 다음 출력될 위치도 알게 된다. 통상적인 경우 커서는 꼭 필요하지만 게임같은 경우에는 커서가 오히려 게임 진행에 방해가 되므로 표시하지 않는 것이 더 좋다. 14장의 여러 게임들을 실행해 보면 커서가 보이지 않는데 커서가 있는 상태로 게임을 실행해 보면 이 함수가 왜 필요한지를 알 수 있을 것이다.

setcursortype 함수는 커서의 형태를 변경하는데 괄호안의 인수로 NOCURSOR를 전달하면 커서가 사라지고 NORMALCURSOR라고 주면 커서가 다시 나타난다. 게임을 시작하기 전에 커서를 없애 버리는 것이 좋고 게임이 끝날 때 다시 나타나도록 한다. 물론 커서는 잠시 숨겨지는 것이지 커서 자체가 없어지는 것은 아니다. 커서는 보통 문자 아래쪽의 얇은 두 줄로 표시되는데 SOLIDCURSOR로 지정하면 문자 높이만큼의 크기를 가진다.

#include <stdio.h>
#include <conio.h> //getch()
#include <windows.h> //SetConsoleCursorInfo(), GetStdHandle(), CONSOLE_CURSOR_INFO

#define TRUE 1
#define FALSE 0
typedef enum {NOCURSOR, SOLIDCURSOR, NORMALCURSOR}CURSOR_TYPE;

void setcursortype(CURSOR_TYPE);

void main()
{
 setcursortype(NORMALCURSOR);
 printf("Normal cursor type.\n");
 getch();
 setcursortype(SOLIDCURSOR);
 printf("Big cursor type\n");
 getch();
 setcursortype(NOCURSOR);
 printf("No cursor type\n");
 getch();
 setcursortype(NORMALCURSOR);
}

void setcursortype(CURSOR_TYPE c)
{
 CONSOLE_CURSOR_INFO Curinfo; // console sursor 구조체
 switch(c)
 {
 case NOCURSOR:
  Curinfo.dwSize = 1; //cursor size
  Curinfo.bVisible = FALSE; // cursor 안보임
  break;
 case SOLIDCURSOR:
  Curinfo.dwSize = 100;
  Curinfo.bVisible = TRUE;
  break;
 case NORMALCURSOR:
  Curinfo.dwSize = 20;
  Curinfo.bVisible = TRUE;
  break;
 }
 SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &Curinfo);
}
/* GetStdHandle(STD_OUTPUT_HANDLE) : 현제 console의 handle을 구하는 함수
SetConsoleCursorInfor(consoleHandle, consoleCursorInformationStruct)
*/

댓글 없음:

댓글 쓰기