윈도우즈 API 정복 1권 4장 KeyDown2 과제정답입니다.
ch를 static으로 선언하던가 아니면 전역으로 선언해야됩니다.-ㅅ-;



#include <windows.h>

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HINSTANCE g_hInst; //hINstance값 저장
LPSTR lpszClass="KeyDown"; //윈도우 클래스정의, 윈도우타이틀바에 표기됨

int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, LPSTR lpszCmdParam,int nCmdShow) //첫번째함수
{
 g_hInst=hInstance;
 HWND hWnd;
 MSG Message;
 
 WNDCLASS WndClass;

 WndClass.style=CS_HREDRAW | CS_VREDRAW; // 크기변경시 다시그리기(HREDRAW,VREDRAW)
 WndClass.lpfnWndProc=(WNDPROC)WndProc; //***********************
 //메시지처리함수를 지정. 메시지발생시마다 지정하는 함수가 호출되어 이 함수가 메시지처리
 WndClass.cbClsExtra=0;  //예약공간.
 WndClass.cbWndExtra=0; //예약공간.
 WndClass.hInstance=hInstance; //클래스등록
 WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
 WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
 WndClass.hbrBackground=(HBRUSH)GetStockObject(COLOR_WINDOW+1); //윈도우배경을 색칠할 브러시색깔
 WndClass.lpszMenuName=NULL; //메뉴 안쓸경우 null
 WndClass.lpszClassName=lpszClass;  //*****************************
 
 RegisterClass(&WndClass); //레지스터클래스 함수를 호출해 윈도우 클래스를 등록한다.

 hWnd=CreateWindow(lpszClass,lpszClass,WS_OVERLAPPEDWINDOW,  // 윈도클래스,타이틀글씨,윈도형식
    CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT, // 화면위치,크기지정
    NULL,(HMENU)NULL,hInstance,NULL); //부모윈도우, 메뉴핸들지정, 프로그램핸들,

 ShowWindow(hWnd,nCmdShow); //CreateWindow로 만든것을 화면에 보인다.
 
 while(GetMessage(&Message,0,0,0)) {
  TranslateMessage(&Message);
  DispatchMessage(&Message);
 }
 return Message.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam) //두번째함수
{
 HDC hdc;
 PAINTSTRUCT ps;
 static int x=100;
 static int y=100;
 static TCHAR *ch=TEXT("*");

 switch(iMessage)
 {
 case WM_KEYDOWN:
  switch(wParam)
  {
  case VK_SPACE:
   if(ch=="*")
   {
    ch="#";
   }else{
    if(ch=="#")
    {
    ch="*";
    }
   };
   break;
  
  case VK_LEFT:
   x-=8;
   break;
  case VK_RIGHT:
   x+=8;
   break;
  case VK_UP:
   y-=8;
   break;
  case VK_DOWN:
   y+=8;
   break;
  }
  InvalidateRect(hWnd,NULL,TRUE);
  return 0;

  case WM_PAINT:
   hdc=BeginPaint(hWnd,&ps);
   TextOut(hdc,x,y,ch,1);
   EndPaint(hWnd,&ps);
   return 0;
  case WM_DESTROY:
   PostQuitMessage(0);
   return 0;
 }
 return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}


 

Posted by 큐에이
,