posted by nsakura 2010. 7. 19. 19:31
생성과 종료

WndProc함수 스위치 문을보면.

WM_CREATE , WM_DESTROY 메세지가 있는데.

간단하게 크레딧에서는 윈도우가 생성될때 전달되는 메세지이고 디스트로이는 종료될때 전달되는 메세제지인데.

크레딧에는 주로 초기화와 할당을

디스토리이는 자원을 반납을 주로 한다.

예를들어 동적 메모리를 할당을 한다고 치자. 1MB

TCHAR *mem;

이하 생략

switch(iMessage){
case WM_CREATE:
 mem=(TCHAR*)malloc(1048576);
 return 0;
case WM_DESTROT:
 free(mem);
 return 0;

이런식으로 되겠다.

두번째 방법은

WinMain에서 할당과 반납을 할수있는데.


이하생략

mem=(TCHAR*)malloc(1048576);
while(GetMessage(&Message,NULL,0,0)){
이하 생략
}
free(mem)으로 해도 된다.

차이점이 있는데

상위에 방법은 CREATE메세지가 전달이 되기전에는 동적 메모리 할당이 되지 않는다.

라는 차이점이 있다.

엄밀히 따져들어가면 그렇게 동일하다고 볼수있다.

그런데 인풋을 하고있는데 왜 이런 설명을 하고있는가 의문을 품지 않은가?

간단하다 윈도우의 상황 변화시에 보내지는 메세지들도 응용 프로그램 입장으로 보면 입력이라고 할수 있기 때문이다.

작업영역

책에 이래 저래 설명이 되어있었는데 다 버려버리고.

하나의 그림을 설명하겠다.



표시된 곳 안쪽이 작업 영역 그외는 비작업 영영역이라고 한다.

비작업영역은 프로그래밍 대상이 아니고 운영체제가 알아서 관리한다.

즉 프로그래밍의 대상이 되는것은

작업영역인 것이다.

프로그램밍을 하다보면

작업 영역이 어느정도인이 알 필요성이 생길 때가 있는 이 때 쓰는 함수가

GetClientRect이다.

함수의 원형을 보면.

BOOL GetClientRect(HWND hWnd,LPRECT lpRect);

첫번째 인자는 크기를 구하고자하는 윈도우.

두번째 인자는 크기를 저장할 RECT 구조체를 말한다

만일 중앙의 위치를 계산하고자 할때.

static RECT rt;


이하 생략

GetClientRect(hWnd,&rt);

하면 윈도우 창의 크기가 구해지며.

중앙을 알아내기 윈해서는

rt.right/2

rt.bottom/2

이렇게 하면 화면의 중앙을 알수있다.

코드가 없어서 알아보기 힘들다 하는 당신들을 위해 준비했습니다.

#include <windows.h>

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

HINSTANCE g_hInst;

LPCTSTR lpszClass=TEXT("GFP NSAKURA OUTPUT");

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd){

 HWND hWnd;
 MSG Message;
 WNDCLASS WndClass;
 
 g_hInst=hInstance;

 WndClass.cbClsExtra=0;
 WndClass.cbWndExtra=0;
 WndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
 WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
 WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
 WndClass.hInstance=hInstance;
 WndClass.lpfnWndProc=WndProc;
 WndClass.lpszClassName=lpszClass;
 WndClass.lpszMenuName=lpszClass;
 WndClass.style=CS_HREDRAW|CS_VREDRAW;
 RegisterClass(&WndClass);

 hWnd=CreateWindow(lpszClass,lpszClass,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,(HMENU)NULL,hInstance,NULL);

 ShowWindow(hWnd,nShowCmd);

 while(GetMessage(&Message,NULL,0,0)){
  TranslateMessage(&Message);
  DispatchMessage(&Message);
 }
 
 return (int)Message.wParam;

}

LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam,LPARAM lParam){
 HDC hdc;
 PAINTSTRUCT ps;
  TCHAR str[20];
 int score=80;
 static RECT rt;

 switch(iMessage){
  case WM_CREATE:
   GetClientRect(hWnd,&rt); 
   return 0;
  case WM_DESTROY:
   PostQuitMessage(0);
   return 0;
  case WM_PAINT:
   hdc=BeginPaint(hWnd,&ps);
   wsprintf(str,TEXT("너 점수 %d"),score);
   TextOut(hdc,rt.right/2,rt.bottom/2,str,lstrlen(str));
   EndPaint(hWnd,&ps);
   return 0;
 }
 return (DefWindowProc(hWnd,iMessage,wParam,lParam));
}


보시는바와 같이 자동으로 계산을 해준다.


 

'Computer > Win API' 카테고리의 다른 글

WinApi 리소스 [메뉴]  (0) 2010.07.20
WinApi WM_SIZE  (0) 2010.07.20
WinApi 타이머 확장 2  (0) 2010.07.19
WinApi 타이머 확장  (1) 2010.07.19
WinApi 타이머 콜백함수  (0) 2010.07.19