posted by nsakura 2010. 7. 21. 18:29

언급은 잠깐했었지만 솔직히

실습하면서 굉장히 귀찮지 않았나?

메모리 할당받고. 그냥 반납을 하면 되는데. 왜 굳

귀찮게. 어째서 다른 팬으로 바꾸고 기존의 팬을 지우는가?

너무 귀찮지 않았나?

이유는 간단하다.

예를 하나 들겠다. A라는 게임이 실행중이다.

그런데 실행중에 A라는 게임을 지워보자 지워지는가?

이런 메세지가 뜨지 않는가?

"실행중인 프로그램이니까 삭제 못해"

라고 말이다.

마찬가지이다 펜이나 브러쉬를 선택한순간 "이건 사용중임"

되는겁니다. 사용중인데 빼앗으면 어떻게 될까요? 현실세계를 생각해보죠.

싸우지 않겠나요? 즉 pc도 마찬가지다. 그러므로 나름 안전 장치가 있는것이다.

그것이 선택중일때는 삭제를 못한다. 라는 것이다.

즉 사용중일때는 삭제를 못한다 와 같은거다.

책에는 코드를 몇개나 예를들어서 설명되어있지만 간단하게 추려 보았다.

한번 테스트를 해볼까 한다.

[PS : 이 코드는 상당히 안좋은 코드다 다른작업하고있었다면 작업을 끝내거나

저장하거나 만일의 사태를 준비하고 실습에 임하기 바란다. 만일 이에 대한 문제는

나에게는 책임이 없다! 정말 없다! 책임 안질거다.

솔직히 문제라고 해봤자 다운밖에 더 되겠냐만은..]


#include <windows.h>

HINSTANCE nsakuragfp;
LPCTSTR wndname=TEXT("GDI ERROR");
HWND hWndMain;

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
void TestResource(BOOL,BOOL,int);


int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd){
 HWND hWnd;
 MSG Message;
 WNDCLASS WndClass;
 nsakuragfp=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=wndname;
 WndClass.lpszMenuName=NULL;
 WndClass.style=CS_HREDRAW|CS_VREDRAW;
 RegisterClass(&WndClass);

 hWnd=CreateWindow(wndname,wndname,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,(HMENU)NULL,hInstance,NULL);
 
 ShowWindow(hWnd,nShowCmd);

 hWndMain=hWnd;

 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 *information=TEXT("1:정상적인 경우 2:선택없이 삭제만 3:삭제 하지 않음");

 switch(iMessage){
 case WM_DESTROY:
  PostQuitMessage(0);
  return 0;
 case WM_PAINT:
  hdc=BeginPaint(hWnd,&ps);
  TextOut(hdc,10,10,information,lstrlen(information));
  EndPaint(hWnd,&ps);
  return 0;
 case WM_KEYDOWN:
  switch(wParam){
  case '1':
   TestResource(TRUE,TRUE,10000);
   break;
  case '2':
   TestResource(FALSE,TRUE,10000);
   break;
  case '3':
   TestResource(FALSE,FALSE,10000);
   break;
  }
  return 0;
 }

 return (DefWindowProc(hWnd,iMessage,wParam,lParam));
}

void TestResource(BOOL select, BOOL deleteOB, int ncnt){
 HDC hdc;
 HPEN hPen,savePen;
 int i;
 TCHAR str[256];

 hdc=GetDC(hWndMain);
 for(i=0; i<ncnt; i++){
  hPen=CreatePen(PS_SOLID,1,RGB(0,0,0));
  savePen=(HPEN)SelectObject(hdc,hPen);
  MoveToEx(hdc,rand()%300,rand()%200,NULL);
  LineTo(hdc,rand()%300,rand()%200+40);
  if(select){
   SelectObject(hdc,savePen);
  }
  if(deleteOB){
   DeleteObject(hPen);
  }

  wsprintf(str,TEXT("%d"),i);
  SetWindowText(hWndMain,str);
 }
 ReleaseDC(hWndMain,hdc);


}
 
참고로 메모리 누수가 생기거나 심하신분은 리붓을 하길 바란다.

함수의 인자에 따라 삭제만 할수도

팬만 바꿀수도

아니면 둘다 안할수도 있습니다.

참고로 NT계열 어느정도 이런 개발자의 실수를 백업을 해준다고 한다.

그래서 그런지  본인은 그렇게 문제가 생기지 않았다.

그러나! 절대 이런 실수는 하지말것.

메모리를 쓰면 돌려줘야한다.

독식하면 주빵을 맞는것이 세상의 진리이다.





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

WinApi 그래픽 [DrawMode]  (1) 2010.07.22
WinApi 그래픽 [투명 오브젝트]  (0) 2010.07.22
WinApi 그래픽 [색상][펜][브러쉬]  (0) 2010.07.21
WinApi 그래픽 [GetStockObject]  (0) 2010.07.21
WinApi 리소스 [String Table]  (0) 2010.07.21