공룡호가 사는 세상 이야기

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

Memod Version 0.1 Beta



프로그램의 이름은 Memorize 와 Word 를 합성하여 붙였습니다.
워낙에 컴퓨터 앞에 앉아 있는 시간이 많다 보니,
좀 더 효과적으로 영어 단어를 외우는 방법은 없을까 해서 간단하게 만들어 보았습니다.
Data 파일의 형식만 지킨다면, 영어 단어 암기 외의 용도로도 사용할 수 있을 것 같습니다.
사용하시는 분들의 많은 버그레포팅 부탁합니다.
사실 너무 간단한 프로그램이라 내놓기에도 민망하지만 -_ -;

[사용법]
실행파일과 함께 들어 있는 dic.txt 파일을 메모장으로 EDIT 합니다.
구분자 '|'를 기준으로 좌측은 영단어, 우측은 뜻이나 의미 등을 기술합니다.
저장 후, 메모드를 실행시키고, Play 버튼을 클릭하면 기록한 데이터가 일정 간격으로 회전합니다.
회전 시간 변경은 Play 버튼 우측의 ComboBox를 통해 할 수 있습니다.

[주의사항]
dic.txt 파일 내에 공백(space)이 존재할 경우, 정상적인 출력이 불가능합니다.
하나의 단어에 여러개의 의미를 부여할 경우, '|'를 사용하여 구분할 수 있습니다.
example)
dog|개|멍멍이|강아지
cat|고양이|야옹이

[사용 예]
저는 화면 우상단에 최대 최소화, 종료버튼이 가리지 않을 만큼에 위치에 두고 씁니다;


invalid-file

Memod 다운로드


다음 버전에서 수정할 사항
1. 공백이 들어간 문자열 표시 기능 (단어 외 숙어 표시 가능)
2. Stop 버튼
3. Stop 된 상태에서 단어의 자세한 의미를 알고자 할 경우, 네이버 OpenAPI를 이용, 서비스
[추가중]