티스토리 뷰


CButton을 상속 받은 CMonitorButton을 하나 만들어서 버튼을 동적 생성 하기 위한 프로그램을 구현했다.
CMonitorButton에선 오너 드로를 위해 DrawItem을 호출했고, OnBnClicked를 오버라이딩해서 자신의 nID값을 nSelectedMonitor 변수에 리턴해주었다.

CMonitorButton을 생성하기 위해 다음과 같은 코드를 구현하였는데

for(int i = 0;i < n;i++)
{
   CMonitorButton *pButton = new CMonitorButton();
   pButton->Create(strMonitorNum,WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON|BS_OWNERDRAW,rtMonitor[i],         this,i);
}

마지막 인자인nID에 i가 0부터 들어가기 때문에 문제가 생겼다.
이상하게 객체를 두개까지 만들면 괜찮은데 세개부터는 x를 눌러도 이를 생성한 부모 다이얼로그가 죽질 않더라.

알고보니.. 세번째로 만들어지는 객체의 nID가 2가 들어가는데..
이것은 다이얼로그의 'X'버튼에 해당하는 것이었다.
그래서 2번 ID 자리의 OnBnClicked를 다른 객체가 사용해 버렸으니 종료가 되지 않는 것이었다..

그래서 ID생성시에 CMonitorButton::MONITOR_ID_INDEX+i를 넣어줬더니 (MONITOR_ID_INDEX는 static const int MONITOR_ID_INDEX = 300;으로 정의함) 잘 됐다.

이와 비슷한 맥락으로 GetDlgItem을 사용할 땐 조심 해야 한다.
안에 중복되는 ID를 가진 컨트롤 값이 들어갈 수 있기 때문이다. 그러면 프로그램이 이상 동작 한다.

종료가 되지않던가 리소스가 중복되던가 하는 문제는 항상 염두해 두도록 하자
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함