-
[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); // 화면을 지우고 다시 출력
}