void TestResource(BOOL bUnSel,BOOL bDelete,int num)
{
HDC hdc;
HPEN hPen,OldPen;
int i;
TCHAR str[256];
hdc=GetDC(hWndMain);
for (i=0;i<num;i++) {
hPen=CreatePen(PS_SOLID,rand()%5+1,RGB(rand()%256,rand()%256,rand()%256)); // 랜덤한 색상의 펜 생성
OldPen=(HPEN)SelectObject(hdc, hPen); // OldPen 에 기본 오브젝트 저장 후 펜 장착
MoveToEx(hdc,rand()%300,rand()%200+40,NULL); //** CP 위치 무작위 지정
LineTo(hdc,rand()%300,rand()%200+40); //** 선그릴 위치 무작위 지정
if (bUnSel) SelectObject(hdc,OldPen); // bUnSel(선택) 이 되면... 기본 오브젝트 장착
if (bDelete) DeleteObject(hPen); // bDelete(삭제) 가 되면... 생성한 펜 삭제.
wsprintf(str,TEXT("%d"),i);
SetWindowText(hWndMain,str); //** 캡션에다가 str 에 저장된 문자열 출력.
}
ReleaseDC(hWndMain,hdc);
}
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
TCHAR *Mes=TEXT("1:정상적인 경우, 2:선택 해제없이 삭제만, 3:삭제하지 않음");
switch (iMessage) {
case WM_KEYDOWN:
switch (wParam) {
case '1':
TestResource(TRUE,TRUE,10000); // 기본오브젝트를 다시 장착시켜주고, 생선한 펜 삭제한 경우.
break; //=> ** DC에는 항상 오브젝트가 장착 되어 있는 상태여야 함.
case '2':
TestResource(FALSE,TRUE,10000); // 기본 오브젝트를 다시 장착시켜주지 않고, 바로 삭제한 경우.
break; // => DC에 펜이 장착된 채로 삭제됨. - 다른 작업을 진행 할시 문제가 발생.
case '3':
TestResource(FALSE,FALSE,10000); // 기본 오브젝트를 다시 장착시켜주지도 않고, 삭제도 하지 않은 경우.
break; //=> 펜 생성만 계속하게 됨. (리소스 과부하)
}
return 0;
case WM_PAINT:
hdc=BeginPaint(hWnd, &ps);
TextOut(hdc,10,10,Mes,lstrlen(Mes));
EndPaint(hWnd, &ps);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return(DefWindowProc(hWnd,iMessage,wParam,lParam));
} |