posted by nsakura 2010. 7. 20. 01:31

방금전 포스트를 보면 자동으로 윈도우 크기를 구해서 창 가운데에 글씨를 출력하는 프로그램인데

약간 문제가있다.

사용자가 창의 크기를 바꾸거나하면

글씨는 그대로 처음에 있던 곳에 있다 이게 무슨 말이냐면.

창이커지면 커진대로 중앙을 찾아야하는데 그런게 안된다는것이다.

그럼 어떻게하면 사용자가 윈도우창의 크기를 바꿔도 출력은 항상가운데 뜨게 할것인가?

이것 역시 윈도에서 지원하고 그 메세지는  WM_SIZE 이다.

WM_SIZE의 플래그 값은

 SIZE_MAXHIDE   다른 윈도우가 최대화 되어 이 윈도우가 가려졌다
 SIZE_IMIZED   최대화 되었다
 SIZE_MAXSHOW   다른 윈도우가 원래 크기로 복구되어 이 윈도우가 드러났다
 SIZE_MINIMIZED   최소화 되었다
 SIZE_RESTORED   크기가 변경되었다.


그래서 문제가 있던 이전 코드를

#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_SIZE:
   GetClientRect(hWnd,&rt); 
   InvalidateRect(hWnd,&rt,TRUE);
   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));
}

이렇게 바꾸어주면 해결이 된다.

이 방법 말고.

  case WM_SIZE:
   rt.right=LOWORD(lParam);
   rt.bottom=HIWORD(lParam);
   InvalidateRect(hWnd,&rt,TRUE);
   return 0;

이런 방법도 있다.

그리고 마지막 한가지 방법이 더있는데 WM_PAINT에서도 가능하지만

이 방법은 효율성의 문제가 있기때문에 설명하지 않겠다.

그 외에도

WM_MOVE라는 메세지가 있는데.

이건 단순 윈도우의 위치가 변경되었을때 보내지는 메세지인데.

뭐 그렇게 많이 쓰지도 않을것 같아 굳이 해보지는 않겠다.

이로서 입력도 끝이 났다.

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

WinApi 리소스 [아이콘][커서]  (2) 2010.07.20
WinApi 리소스 [메뉴]  (0) 2010.07.20
WinApi 생성과 종료, 작업영역  (0) 2010.07.19
WinApi 타이머 확장 2  (0) 2010.07.19
WinApi 타이머 확장  (1) 2010.07.19