TODAY : / TOTAL :

120620_API :: 도형 그리기(Graphic Draw) , 키 입력(KeyDown)

  • Share this:
반응형


Draw Graphic

 LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
 HDC hdc;
 PAINTSTRUCT ps;
 static bool Check = false;
 int xPos;
 int yPos;
 static int xPos1;
 static int yPos1;
 int xPos2;
 int yPos2;

 switch (iMessage) {
 case WM_DESTROY:
  PostQuitMessage(0);
  return 0;

 case WM_LBUTTONDOWN :
  
  // lParam 에 x,y 좌표 정보가 저장되고 rParam 에는 조합키정보가 들어감. MSDN 참고.
  /**************** 클릭한 두점을 이용한 사각형 만들기 ************************/
  xPos = LOWORD(lParam);
  yPos = HIWORD(lParam);
  if(Check==false)
  {
   // 첫번째 입력 데이터 저장.
   xPos1 = xPos;
   yPos1 = yPos;
   Check=true;
  }
  else
  {
   // 두번째 입력 데이터 저장.
   xPos2 = xPos;    
   yPos2 = yPos;
   hdc = GetDC(hWnd); 
   Rectangle(hdc,xPos1,yPos1,xPos2,yPos2); 
   ReleaseDC(hWnd,hdc);
   Check=false;
  }
  /*********************************************************************************/

 case WM_PAINT:
  hdc=BeginPaint(hWnd,&ps);
  SetPixel(hdc,10,10,RGB(255,0,0));       // 픽셀(점) 찍기
  MoveToEx(hdc,50,50,NULL);             // CP값 지정하기 :: CP는 DC값을 새로 가져올때마다 다시 초기화 됨.
 
 [ MoveToEx(DC핸들, x좌표,y좌표, 이전 CP값 저장) ]

  LineTo(hdc,300,90);                         // CP값을 기준으로 줄 긋기
  [ LineTo(hdc,x좌표,y좌표) ]

  Rectangle(hdc,50,100,200,180);         // 사각형 그리기
  [ Rectangle(Left Pos , Top Pos, Right Pos, Bottm Pos ) ]

  Ellipse(hdc,220,100,400,200);           // 사각형을 내접하는 원이 그리기.
  [ Ellipse(Left Pos , Top Pos, Right Pos, Bottm Pos ) ]
  
  EndPaint(hWnd,&ps);
  return 0;
 }
 return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}



KEYDOWN

 LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
 HDC hdc;
 PAINTSTRUCT ps;
 static int x=100;
 static int y=100;

 switch (iMessage) {
 case WM_KEYDOWN:        // 키 입력 받음.
  switch (wParam) {           // 어떤 키를 입력받는지 wParam 에 저장.
  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);
  InvalidateRect(hWnd,NULL,FALSE);   // InvalidateRect(사각 영역이 지워짐) -> 다시 그림 :: PAINT 메시지를 발생하게 해줌.
  InvalidateRect(hWnd,
                       NULL        // ==    화면전체가 다 지워졌다고 OS에 통보,  / &rect : 사각영역의 좌표
                       TRUE       // TRUE: 기존 PAINT 삭제후 그림. FLASE : 기존 PAINT 놔두고 그림)
                       return 0;   //  Paint 를 받기위해 OS에 지워졌다고 메시지를 주어서 PAINT 메시지를 불러오게 해주는 함수.
 
 case WM_PAINT:         
  hdc=BeginPaint(hWnd,&ps);
  TextOut(hdc,x,y,TEXT("A"),1);
  EndPaint(hWnd,&ps);
  return 0;
 case WM_DESTROY:
  PostQuitMessage(0);
  return 0;
 }
 return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}


반응형

SEARCH

태그로 찾아보기