본문 바로가기
프로그래밍/C++

[MFC] CListBox 동적 생성시 이벤트 연결

by 건우아빠유리남편 2012. 1. 30.
반응형
에이 젠장...
OnCommand에서 아무리 확인해봐도... 직접 동적으로 생성해준 CListBox에 도무지 메세지가 Notify 되지 않았다.

왜 그렇지...;;;
이리 찾고 저리 찾고... 계속 안나오다가 결국 찾았당.

생성시...
m_ctlRecItem.Create(WS_CHILD|WS_VISIBLE|WS_TABSTOP|LBS_NOTIFY, CRect(nCurX, nCurY, nCurX + nRecItemWidth + nPadding, nCurY + nrecItemHeight), this, IDC_RECITEM_ID);

요런식으로 했어야 했다. LBS_NOTIFY를 넣어주지 않으면 젠장 안온다. 오직 포커스를 얻었다, 잃었다만 올 뿐...

휴... 젠장



-참고-

리스트 박스는 선택가능한 여러개의 항목들을 나열해 놓고 그중 하나(또는 여러개)를 선택하도록 하는 컨트롤이며 여기서 항목이란 주로 문자열이다. "listbox"라는 윈도우 클래스를 사용하며 다음과 같은 여러가지 스타일이 정의되어 있다.

스타일 설명
LBS_MULTIPLESEL 여러개의 항목을 선택할 수 있도록 한다. 이 스타일을 적용하지 않으면 디폴트로 하나만 선택할 수 있다.
LBS_NOTIFY 사용자가 목록중 하나를 선택했을 때 부모 윈도우로 통지 메시지를 보내도록 한다.
LBS_SORT 추가된 항목들을 자동 정렬하도록 한다.
LBS_OWNERDRAW 문자열이 아닌 비트맵이나 그림을 넣을 수 있도록 한다.
LBS_STANDARD LBS_NOTIFY | LBS_SORT | WS_BORDER

부모 윈도우로 통지 메시지를 보내는 것이 일반적이므로 LBS_NOTIFY 스타일은 거의 필수적으로 선택하는 것이 좋으며 그외 LBS_MULTIPLESEL이나 LBS_SORT 스타일은 필요할 때 선택하면 된다.

부모 윈도우가 리스트 박스를 조작하고자 할 때는 리스트 박스 메시지를 사용한다.

메시지 설명
LB_ADDSTRING 리스트 박스에 항목을 추가한다. lParam으로 추가하고자 하는 문자열의 번지를 넘겨주면 된다.
LB_DELETESTRING 항목을 삭제한다. wParam으로 항목의 번호를 넘겨주며 남은 문자열수를 리턴한다.
LB_GETCURSEL 현재 선택된 항목의 번호(Index)를 조사해준다.
LB_GETTEXT 지정한 항목의 문자열을 읽는다. wParam에 항목 번호, lParam에 문자열 버퍼의 번지를 넘겨주면 버퍼에 문자열을 채워준다.
LB_GETCOUNT 항목의 개수를 조사한다.
LB_SETCURSEL wParam이 지정한 항목을 선택하도록 한다.

이 외에도 수많은 메시지들이 있는데 자세한 사항은 레퍼런스를 참고하기 바란다. 이 메시지들은 부모 윈도우가 리스트 박스에게 명령을 내리기 위해 사용하며 반대로 리스트 박스에서 어떤 사건이 발생했을 때 부모 윈도우로 통지 메시지를 보낸다.

메시지 설명
LBN_DBLCLK 리스트 박스를 더블클릭하였다.
LBN_ERRSPACE 메모리가 부족하다.
LBN_KILLFOCUS 키보드 포커스를 잃었다.
LBN_SELCANCEL 사용자가 선택을 취소하였다.
LBN_SELCHANGE 사용자에 의해 선택이 변경되었다.
LBN_SETFOCUS 키보드 포커스를 얻었다.
반응형

댓글