공룡호가 사는 세상 이야기

Resource Leaking

프로그래밍2007. 8. 13. 18:33

MFC 에서, 컨트롤의 색상을 변경하고자 할 때, OnCtlColor()을 사용한다. (버튼 컨트롤 제외)

HBRUSH CPppDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
 HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

 if( pWnd->GetDlgCtrlID() == IDC_DIC)
 {
  hbr = CreateSolidBrush( RGB(0,0,255) );
  pDC->SetBkMode( TRANSPARENT );
  pDC->SetBkColor( RGB(0,0,255) );
  pDC->SetTextColor( RGB(255,255,0) );
    
  return hbr;       
 }
 return hbr;
}


여기서 문제가 있다. 이 메소드는 해당 컨트롤을 다시 그려야 할 이유가 생길 때 마다 자동적으로 호출된다.
따라서, 프로세스의 메모리 점유가 늘어날 수 밖에 없다.
계속해서 CreateSolidBrush()를 통해 계속해서 브러시를 생성하기 때문.

프로그램 시작시, 단 한번만 브러시를 생성하고 프로그램 종료 시, 생성된 브러시를 파괴해 주는 것으로 이 부분은 해결된다. 코드는 다음과 같다.

생성자에 다음과 같은 코드를 삽입한다.
물론 hBkBrush 는 HBRUSH type 이며, 클래스 정의부분에 명시해 둔다.
hBkBrush = CreateSolidBrush(RGB(0,0,255));

그리고 위의 코드 중, 붉은색으로 된 부분을 다음과 같이 변경한다.
hbr = hBkBrush;

마지막으로, 프로그램 종료시 호출되는 파괴자나, 기타 메소드 중에 적당한 곳을 골라 브러시 객체를 파괴한다.
DeleteObject(hBkBrush);

'프로그래밍' 카테고리의 다른 글

C# TIP 몇가지  (0) 2007.10.04
구글 가젯 만들기, Part1  (1) 2007.08.21
WebPage Redirect (MFC / API)  (0) 2007.05.16
SetTimer()  (0) 2007.05.14
ROBOCODE Master의 비밀!!!  (0) 2007.04.23