|
확인 |
|
보고일자 |
2015.03.19(목) |
책임자 |
박우영 |
콤보박스(WIN32API)
<기술문서>
SunmoonBit 29기
박우영
목차
콤보박스란? ............................. 3
스타일 ………………………… 4
메시지 ………………………… 4
통지 메시지 ………………………… 5
예제 ………………………… 6
콤보박스란?
콤보박스는 에디트 컨트롤과 리스트 박스를 결합시켜놓은 컨트롤입니다.
에디트 컨트롤처럼 직접 내용을 입력해 넣을 수도 있고
리스트박스처럼 목록에 있는 항목중의 하나를 선택할 수도 있습니다.
또한 리스트박스가 항상 열려 있는데 비해 콤보 박스는 필요한 경우에만 목록을 열어 선택하므로
화면 공간을 적게 차지한다는 장점이 있습니다.
<<생성 예시>>
hCombo = CreateWindow("combobox", NULL, WS_CHILD | WS_VISIBLE | WS_DROPDOWN,
50, 50, 100, 300, hWnd, (HMENU)ID_COMBOBOX, hIns, 0);
CreateWindow 함수를 이용하여 생성하거나
대화상자 리소스의 도구상자를 이용해서 추가할 수 있습니다.
스타일
CreateWindow의 두번째 매개변수에 지정할 수 있는 스타일의 종류입니다.
리스트나 에디트의 스타일 상당수도 접두어만 바꿔서 사용할 수 있습니다.
스타일 |
설명 |
CBS_SIMPLE |
에디트만 가진다. |
CBS_DROPDOWN |
에디트와 리스트 박스를 가진다. |
CBS_DROPDOWNLIST |
리스트 박스만 가지며 에디트에 항목을 입력할 수는 없다. |
메시지
SendMessage()등을 통해 이용할 수 있는 메시지들입니다.
마찬가지로 리스트나 에디트와 유사한 항목이 많습니다.
메시지 |
설명 |
CB_ADDSTRING |
리스트 박스에 항목을 추가한다. |
CB_DELETESTRING |
항목을 삭제한다. |
CB_GELBTTEXT |
지정한 항목의 문자열을 읽는다. |
CB_GETCOUNT |
항목의 개수를 조사한다. |
CB_GETCURSEL |
현재 선택된 항목의 번호를 조사한다. |
CB_SETCURSEL |
지정한 항목을 선택하도록 한다. |
CB_SHOWDROPDOWN |
드롭다운 리스트를 보이거나 숨긴다. |
통지 메시지
부모 윈도우에게 보내는 통지 메시지와 그 상황들입니다.
메시지 |
상황 |
CBN_CLOSEUP |
드롭 다운 리스트가 닫힐 때 |
CBN_DROPDOWN |
드롭 다운 리스트가 펼쳐질 때 |
CBN_DBLCLK |
항목을 더블클릭했을 때 |
CBN_SELCHANGE |
사용자가 항목을 선택했을 때 |
CBN_SELCANCEL |
선택이 취소될 때 |
CBN_KILLFOCUS |
포커스를 잃었을 때 |
CBN_SETFOCUS |
포커스를 얻었을 때 |
CBN_EDITUPDATE |
에디트 텍스트를 사용자가 변경할 때 |
예제
대화상자의 콤보박스를 이용하여 항목의 추가, 삭제, 선택 등을 수행하는 간단한 예제입니다.
<<항목 추가>>
void Add(HWND hDlg, wchar_t *buf){
HWND hCombo = GetDlgItem(hDlg, IDC_COMBO);
SendMessage(hCombo, CB_ADDSTRING, 0, (LPARAM)buf);
//hCombo의 항목에 buf를 추가한다
List(hDlg, TEXT("항목을 추가했습니다."));
}
<<항목 삭제>>
void EDelProc(HWND hDlg){
HWND hCombo = GetDlgItem(hDlg, IDC_COMBO);
int index = SendMessage(hCombo, CB_GETCURSEL, 0, 0);
//현재 커서가 가리키는 index를 확인한다
SendMessage(hCombo, CB_DELETESTRING, 0, index);
//index 위치의 항목을 삭제한다
List(hDlg, TEXT("항목을 삭제했습니다."));
index = SendMessage(hCombo, CB_GETCOUNT, 0, 0);
//남은 항목의 개수를 확인한다
wchar_t buf[256]=TEXT("");
wsprintf(buf, TEXT("남은 항목 수 : %d개"), index);
List(hDlg, buf);
}
<<선택된 항목 출력>>
void SelChangeProc(HWND hDlg){
HWND hCombo = GetDlgItem(hDlg, IDC_COMBO);
int index = SendMessage(hCombo, CB_GETCURSEL, 0, 0);
//현재 커서가 가리키는 index를 확인한다
wchar_t buf[256] =TEXT("");
SendMessage(hCombo, CB_GETLBTEXT, index, (LPARAM)buf);
//현재 선택된 항목의 텍스트를 buf로 읽어온다
List(hDlg, TEXT("항목을 선택하였습니다."));
List2(hDlg, buf);
}
<<전체 코드>>
#include <Windows.h>
#include "resource.h"
void List(HWND hDlg, wchar_t *buf){
HWND hList = GetDlgItem(hDlg, IDL_LIST1);
SendMessage(hList, LB_ADDSTRING, 0, (LPARAM)buf);
}
void List2(HWND hDlg, wchar_t *buf){
HWND hList = GetDlgItem(hDlg, IDL_LIST2);
SendMessage(hList, LB_ADDSTRING, 0, (LPARAM)buf);
}
void Add(HWND hDlg, wchar_t *buf){
HWND hCombo = GetDlgItem(hDlg, IDC_COMBO);
SendMessage(hCombo, CB_ADDSTRING, 0, (LPARAM)buf);
//hCombo의 항목에 buf를 추가한다
List(hDlg, TEXT("항목을 추가했습니다."));
}
void EAddProc(HWND hDlg){
wchar_t buf[256]=TEXT("");
GetDlgItemText(hDlg, IDE_EDIT, buf, 255);
//IDE_EDIT의 텍스트를 buf로 읽어온다
SetDlgItemText(hDlg, IDE_EDIT, TEXT(""));
Add(hDlg, buf);
}
void EDelProc(HWND hDlg){
HWND hCombo = GetDlgItem(hDlg, IDC_COMBO);
int index = SendMessage(hCombo, CB_GETCURSEL, 0, 0);
//현재 커서가 가리키는 index를 확인한다
SendMessage(hCombo, CB_DELETESTRING, 0, index);
//index 위치의 항목을 삭제한다
List(hDlg, TEXT("항목을 삭제했습니다."));
index = SendMessage(hCombo, CB_GETCOUNT, 0, 0);
//남은 항목의 개수를 확인한다
wchar_t buf[256]=TEXT("");
wsprintf(buf, TEXT("남은 항목 수 : %d개"), index);
List(hDlg, buf);
}
void SelChangeProc(HWND hDlg){
HWND hCombo = GetDlgItem(hDlg, IDC_COMBO);
int index = SendMessage(hCombo, CB_GETCURSEL, 0, 0);
//현재 커서가 가리키는 index를 확인한다
wchar_t buf[256] =TEXT("");
SendMessage(hCombo, CB_GETLBTEXT, index, (LPARAM)buf);
//현재 선택된 항목의 텍스트를 buf로 읽어온다
List(hDlg, TEXT("항목을 선택하였습니다."));
List2(hDlg, buf);
}
void ComboProc(HWND hDlg, WORD cmsg){
switch(cmsg){
case CBN_SELCHANGE : SelChangeProc(hDlg); return;
}
}
void OnCommand(HWND hDlg, WORD cid, WORD cmsg, HWND cWnd){
switch(cid){
case IDCANCEL: EndDialog(hDlg, 0); return;
case IDB_EADD: EAddProc(hDlg); return;
case IDB_EDEL: EDelProc(hDlg); return;
case IDC_COMBO: ComboProc(hDlg, cmsg); return;
}
}
BOOL CALLBACK DlgProc(HWND hDlg,UINT iMessage,WPARAM wParam,LPARAM lParam){
switch(iMessage){
case WM_COMMAND: OnCommand(hDlg,LOWORD(wParam),HIWORD(wParam),(HWND)lParam); return TRUE;
}
return FALSE;
}
INT APIENTRY WinMain(HINSTANCE hIns, HINSTANCE hPrev, LPSTR cmd, INT nShow){
DialogBox(hIns, MAKEINTRESOURCE(IDD_MAIN), 0, DlgProc);
return 0;
}
<<실행화면>>
|