ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [API] 08월28일 수업내용
    0x05 Programming/API / MFC 2009. 8. 28. 11:38

    ######### 08월28일 수업내용 ############

    GetDC() , ReleaseDC() 사용법
    WM_PAINT 메세지
    WM_MOUSEMOVE 메세지
    화면제어방법
    두더지 Game


    GetDC : 파라미터는 hWnd 하나만 주면된다.  // 화면제어 티켓을 얻는 함수

    ReleaseDC : 파라미터는 hWnd , hdc 두개이다. // 화면제어가 끝났을때 호출


    위의 방법대로만 사용하면 프로그램 창의 크기를 줄이거나 하면
    내용이 지워지기때문에

    그린내용을 다른 변수에 저장을 한다음 다시 그릴때 불러오면 된다.

    그러므로 화면에 그려주는 것들은 따로 함수를 만들어서 WM_PAINT에 맵핑을 해주면 될것이다.


    -----------wsprintf() 사용법--------------
     
    wsprintf(문자열을 넣어줄 변수,"문자열",x좌표,y좌표);

    -------------TextOut() 사용법---------------

    TextOut(hdc,출력할 x의 좌표,출력할 y의좌표,문자열,문자열의 길이);

    ------------- Rectangle()사용법 --------------

    Rectangle(hdc,출력할 x의좌표,출력할 y의 좌표,가로길이,세로의 길이);


    ############# 화면제어 방법 ##################

    새로운 c파일 안에다가  전역변수로 미리 선언을한다.

    int g_x = -100;
    itn g_y = -100;

    전역변수 g_x와 g_y에 -100 을 넣어준 이유는 화면 밖의 좌표값이기때문에
    처음에는 보이지 않는다.
    나중에 화면을 복원할때 사용한다.

    void MyPaint(HWND hWnd, WPARAM wParam,LPARAM lParam,HDC hdc)
    {
     char temp[80];
     
     wsprintf(temp,"x = %d y = %d",g_x,g_y);
     TextOut(hdc,g_x,g_y,temp,strlen(temp));

    }

    void MyLbutton(HWND hWnd, WPARAM wParam,LPARAM lParam)
    {
     g_x=LOWORD(lParam); // 전역변수  g_x에다가 x의 값을 넣어준다.
     g_y=HIWORD(wParam); // 전역변수 g_y에다가 y의 값을 넣어준다.

     InvalidateRect(hWnd,NULL,TRUE); // 화면을 모두지운다.
    }

    위처럼 한후에 맵핑을 해주어야 하는데 위의 프로토 타입들을 복사해서 WndProc에 들어가서
    맨 위에 추가 하여준다.

    void MyPaint(HWND hWnd, WPARAM wParam,LPARAM lParam,HDC hdc);
    void MyLbutton(HWND hWnd, WPARAM wParam,LPARAM lParam);

    그런후에 MyPaint는  case WM_PAINT 에 넣어주고 호출을한다.
    호출을 하기전에 //TODO 밑에 있는 3줄은 지워준다.


    ※주의 BeginPaint 와 EndPaint 사이에 넣어주어야 하고 둘다 지우면 안된다.

    MyLbutton은 맨밑에 있는 default 위에다가 case WM_LBUTTONDOWN을 만들어주고
    거기에서 호출을 한다.


    ################## 수업 내용 소스 ################

    예제 1. GetDC사용예제


    void MyLbutton(HWND hWnd, WPARAM wParam,LPARAM lParam)
    {
     //MessageBox(hWnd,"test","info",MB_OK);
     
     HDC hdc;
     int x,y;
     char temp[80];

     hdc=GetDC(hWnd); // 화면제어 티켓을 받음

     x=LOWORD(lParam); //x에 x의좌표를 넣어줌
     y=HIWORD(lParam); //y에 y의 좌표를 넣어줌

     wsprintf(temp,"x = %d y= %d",x,y);
     TextOut(hdc,x,y,temp,strlen(temp));

     ReleaseDC(hWnd,hdc);  // 화면제어가 끝났다는것을 알려줌

    }

    예제 2. 화면 제어 예제

    int g_x = -100; // 처음에 화면에 안찍히게 하기위함
    int g_y = -100; // 처음에 화면에 안찍히게 하기위함


    void MyPaint(HWND hWnd, WPARAM wParam, LPARAM lParam, HDC hdc)
    {
     char temp[80];

     wsprintf(temp,"x= %d y = %d",g_x,g_y);
     TextOut(hdc,g_x,g_y,temp,strlen(temp));

    }

    void MyLbutton(HWND hWnd, WPARAM wParam, LPARAM lParam, HDC hdc)
    {

     g_x=LOWORD(lParam); // 전역변수에 x의 값을 기억하여 넣어줌
     g_y=HIWORD(lParam); // 전역변수에 y의 값을 기억하여 넣어줌
     
     InvalidateRect(hWnd,NULL,TRUE); // 화면을 다 지워줌

    }

    예제 3. 두더지게임 (시간제한은 없는버전)


    int g_score = 0; //점수가 저장될 변수

    int g_x = 100; // 두더지의 처음 위치
    int g_y = 100; // 두더지의 처음 위치


    void MyPaint(HWND hWnd, WPARAM wParam, LPARAM lParam,HDC hdc)
    {
     char temp[80];

     Rectangle(hdc,1,1,300,300); // 화면 사각박스 그리기
     Rectangle(hdc,g_x,g_y,g_x+50,g_y+50); // 두더지 그리기

     wsprintf(temp,"Score : %d",g_score);
     TextOut(hdc,10,10,temp,strlen(temp));  // Score 출력


    }

    void MyLbutton(HWND hWnd,WPARAM wParam,LPARAM lParam)
    {
     int x,y;
     
     x=LOWORD(lParam); // 클릭한 x좌표
     y=HIWORD(lParam); // 클릭한 y좌표

     if(g_x < x && x <(g_x+50))
     {
      if(g_y<y && y<(g_y+50));
      {
       g_score = g_score+100;

       g_x= rand()%200; // 두더지 의 위치를 무작위로 바꿈 x좌표
       g_y= rand()%200; // 두더지 의 위치를 무작위로 바꿈 y좌표

      }
     }

     

     InvalidateRect(hWnd,NULL,TRUE);  // 화면을 지우고 다시 출력
    }

Designed by Tistory.