본문 바로가기

old drawer/C, C++, MFC

[MFC] CCombobox 이벤트 처리

. 콤보 박스의 화살표를 클릭하면 박스의 테두리가 나온다.

 

 

 

 

2. 테두리를 밑으로 잡아 당겨 늘리면 더 많은 리스트를 추가할때 밑에 부분까지 볼수 있다.

 

 


 


 

 


 

==================================================================================

[콤보박스 함수]

CComboBox::AddString - 스트링을 더함.
CComboBox::CComboBox - ComboBox 오브젝트를 생성(구성).
CComboBox::Clear -현재 선택을 지움.
CComboBox::CompareItem - 새로운 리스트 항목의 상태적 위치를 결정.
CComboBox::Copy - 현재 선택을 Copy.
CComboBox::Create - CComboBox를 생성.
CComboBox::Cut - 제거된 텍스트를 복사.
CComboBox::DeleteItem - 항목이 Combo 박스에서 제거.
CComboBox::DeleteString - 스트링을 제거.
CComboBox::Dir - 리스트를 더함.
CComboBox::DrawItem - 양상이 변할 때 불려짐.
CComboBox::FindString - 첫 번째 스트링을 찾음.
CComboBox::FindStringExact - 첫 번째 리스트 박스 스트링을 찾음.
CComboBox::GetCount - 항목의 수를 회복.
CComboBox::GetCurSel - 현재 선택된 항목의 색인을 찾음
CComboBox::GetDroppedControlRect - 스크린 좌표를 되찾음.
CComboBox::GetDroppedState - 리스트 박스가 보일지를 결정.
CComboBox::GetEditSel - 시작과 끝나는 문자의 위치를 얻음.
CComboBox::GetExtendedUI - 디폴트, 확장 사용자 인터페이스의 결정.
CComboBox::GetItemData - 항목과 관련된 비트값을 회복.
CComboBox::GetItemDataPtr - 포인터로서 관련된 비트 값을 회복.
CComboBox::GetItemHeight - 리스트 항목의 높이를 회복.
CComboBox::GetLBText - 리스트 박스로부터 스트링을 얻음.
CComboBox::GetLBTextLen - 스트링의 길이를 지정.
CComboBox::InsertString - 스트링의 삽입.
CComboBox::LimitText - 텍스트의 길이를 제한.
CComboBox::MeasureItem - Combo 박스 치수를 결정하기 위해 불려짐.
CComboBox::Paste - 현재 커서 위치에서 편집 제어로 삽입.
CComboBox::ResetContent - 모든 항목의 제거.
CComboBox::SelectString - 스트링을 선택, 복사.
CComboBox::SetCurSel - 스트링을 선택.
CComboBox::SetEditSel - 편집 제어에서 문자들을 선택.
CComboBox::SetExtendedUI - 디폴트, 확장 사용자 인터페이스의 선택.
CComboBox::SetItemData - 항목과 관련된 값을 정함.
CComboBox::SetItemDataPtr - 포인터에 대한 관련된 값을 정함.
CComboBox::SetItemHeight - 높이를 지정.
CComboBox::ShowDropDown - 리스트 박스를 보여주거나 숨김.

=============================================================================================

[콤보박스 이벤트]

 

 



콤보에서 제공하는 이벤트는 다음과 같습니다.
CBN_EDITCHANGE
CBN_CLOSEUP
CBN_DBLCLK
CBN_DROPDOWN
CBN_EDITUPDATE
CBN_ERRSPACE
CBN_KILLFOCUS
CBN_SELCHANGE

CBN_SELENDCANCEL
CBN_SELENDOK
CBN_SETFOCUS

 

이렇게 사용되며, 색상이 파란색인건 보통 자주사용되는 이벤트이고, 나머지는 잘 사용되지 않죠.
어디까지나 개인적으로 사용해본 경험을 바탕으로 추린 내용이니..흠..

1. CBN_EDITCHANGE, CBN_EDITUPDATE
CBN_EDITCHANGE은 드롭다운과 심플 스타일일 경우에만 발생하는 이벤트로, 에디트 박스 영역의 글자에 변화가 생길 경우에 발생하는 이벤트입니다. 보통 내부에 들어있는 콤보 아이템을 선택하는 목적으로 사용할 때는 잘 쓰이지 않습니다만, 인터넷 익스프롤러나 탐색기, 최근 들어 자주 볼수 있는 오토 컴프리트 기능들을 다룰 때 사용됩니다.

사용자가 문자열을 입력할 때, 내부 아이템중에서 선택적으로 일치하는 항목을 보여주거나 할 때
주로 사용되죠.

CBN_EDITUPDATE는 문자열의 변화뿐 아니라, 그 영역이 먼가에 가려져있다바 보인다던가..
화면을 갱신해야 할경우 발생하는 이벤트입니다. 한번 들어본 말이죠?

에디트 컨트롤의 EN_CHANGE와 EN_UPDATE와 100% 일치하는 이벤트입니다.
콤보박스에 에디트 컨트롤이 달여있는 것이니 당연한거겠지요.

2. CBN_DROPDOWN, CBN_CLOSEUP
CBN_DROPDOWN는 콤보박스의 에디트 영역 우측에 버튼을 누르면 리스트박스가 주욱 열립니다.
이때 발생하는 이벤트고, 열린 리스트박스에서 아이템을 마우스로 선택하거나 엔터를 쳐서 리스트가
닫힐 때 발생하는 이벤트가 CBN_CLOSEUP 이죠.

3. CBN_DBLCLK
요 스타일은 콤보박스의 리스트박스상에서 아이템을 더블클릭 할 경우에만 발생합니다. 드롭 다운 스타일이나 드롭 리스트 스타일일 경우, 아무리 순발력이 좋아도 절대 일으킬 수 없는 메시지죠..
심플 스타일일 경우에만 발생하는 메시지입니다. ^^;


4. CBN_ERRSPACE
이것도 에디트를 다룰 때 한번 봤던 이벤트인데, 아이템을 추가하거나 삽입할 경우, 내부적으로
주소 공간을 할당해야 하겠죠? 이 때 할당 공간이 부족하면 발생하는 경고성 이벤트입니다.

 

5. CBN_KILLFOCUS, CBN_SETFOCUS
기본적인 윈도우 컨트롤이 가지고 있는 포커스 이벤트입니다.
예를 들어 선택해야 하는 아이템들이 잔뜩 모여있는 필수 아이템 그룹이 있다고 가정했을 때,
보통 라디오 버튼 그룹이나 콤보박스 혹은 리스트를 사용하게 됩니다. 라디오가 직관적이긴 한데
많은 아이템일 경우 공간이 부족하게 되죠, 리스트도 마찬가지고..

이럴 경우 콤보가 첨에 생기면 빨간색 글자로
<필수 선택 항목>이라고 써있다가 포커스가 옮겨
가게 되면 경고문구가 지워지고 아이템을 선택할 수 있는 원래의 환경으로 돌아오는 겁니다.

6. CBN_SELCHANGE
일반적인 콤보 기능을 담당할 경우 가장 많이 사용되는 이벤트 중에 하나입니다. 마우스나 키보드로
아이템을 선택하거나 변경할 경우 발생하는 이벤트죠.

7. CBN_SELENDOK, CBN_SELENDCANCEL
콤보박스에서 아이템을 선택할 경우, 나열된 리스트에서 마우스로 콕 찍거나 엔터키를 치면
발생하는 이벤트입니다. CBN_SELCHANGE와 같다고 볼수 있는데 이는 변경되는 내내 발생하지만
CBN_SELNDOK는 선택되어지는 그 순간에 한번만 발생한다는 차이점이 있습니다. 물론 이 후에
CBN_SELCHANGE도 당연히 발생하죠.

CBN_SELENDCANCEL은 키보드의 방향키로 아이템을 고르고 있다가 혹은 마우스로 찾아다니다가
이건 아닌가바.. ESCAPE 키를 딱 누르는 순간에 발생하는 이벤트입니다. 선택을 취소했다고 나오는
이벤트인데 콤보박스에서 동작특성이 상당히 불안한 이벤트이기도 하죠..
믿고 쓸만한 이벤트가 못됩니다.

-------------------------------------------------------------------------------------
이벤트를 모두 사용하는 샘플을 제작하기가 여간 까다로운게 아니네요..
그래서 여러스타일의 콤보를 놓고 사용자가 하나씩 클릭해 보면서
이벤트가 어떤 순서로 어떻게 발생하는 지를 관찰할 수 있는 아주 간단한 -_- 샘플을 올립니다.


샘플을 제작하면서 각각의 컨트롤의 이벤트 핸들러를 클래스위저드를 이용해서 추가할 수 도
있겠지만 코드가 길어지니, 셀체인지 이벤트만 클래스 위저드에서 콤보박스마다 넣고, 나머지는
ON_CONTROL_RANGE를 이용하겠습니다.

ON_CONTROL_RANGE는 어떤 이벤트를 잡아줄건지를 명시하여 원하는 컨트롤의 이벤트
묶음으로 건질수 있다는 차이가 있습니다.

ON_CONTROL_RANGE(event, begin, end, handler)
event : 처리하고자 하는 대상 이벤트
begin : 범주의 시작이 되는 컨트롤의 아이디
end : 범주가 끝나는 컨트롤의 아이디
handler : LRESULT 함수명(UIND nID) 타입의 멤버함수

저것들도 다 한방에 묶어서 처리할 수 있으면 좋겠지만, 거기까지는 자동으로 지원하는 매크로는
없구요, PreTranslateMessage 에서 처리하면 가능하겠죠. 하지만 코드가 지저분 해진다는거..