순천향대학교컴퓨터학부이상정 1 학습내용 리스트박스컨트롤 다이얼로그와리스트박스 콤보박스컨트롤 순천향대학교컴퓨터학부이상정 2
리스트박스컨트롤 순천향대학교컴퓨터학부이상정 3 리스트박스컨트롤 사용자가선택할수있는항목들을여러개나열해두고선택할수있는컨트롤 윈도우클래스의이름은 "listbox" 생성예 hlist=createwindow(l"listbox",null,ws_child WS_VISIBLE WS_BORDER WS_VSCROLL LBS_NOTIFY,10,30,100,100, 100 100 hwnd,(hmenu)idc_listbox, g_hinst,null); 통지메시지 컨트롤이부모윈도우에게 WM_COMMAND와함께보내는메시지 컨트롤 ID, wmid = LOWORD(wParam); 통지메시지, wmevent = HIWORD(wParam); 리스트박스컨트롤메시지 부모윈도우가리스트박스컨트롤에게보내는메시지 순천향대학교컴퓨터학부이상정 4
리스트박스컨트롤스타일 스타일 LBS_MULTIPLESEL LBS_NOTIFY 설명 여러개의항목을선택할수있도록한다. 이스타일을적용하지않으면디폴트로하나만선택할수있다. 사용자가목록중하나를선택했을때부모윈도우로통지메시지를보내도록한다.( 필수 ) LBS_SORTSORT 추가된항목들을자동정렬하도록한다. LBS_OWNERDRAW 문자열이아닌비트맵이나그림을넣을수있도록한다. LBS_STANDARD LBS_NOTIFY LBS_SORT WS_BORDER 순천향대학교컴퓨터학부이상정 5 통지메시지 메시지 설명 LBN_DBLCLK 리스트박스를더블클릭하였다. LBN_ERRSPACE 메모리가부족하다. LBN_KILLFOCUS 키보드포커스를잃었다. LBN_SELCANCEL 사용자가선택을취소하였다. LBN_SELCHANGE 사용자에의해선택이변경되었다. LBN_SETFOCUS 키보드포커스를얻었다. 순천향대학교컴퓨터학부이상정 6
리스트박스메시지 리스트박스메시지 LB_ADDSTRING 설명 리스트박스에항목을추가한다. lparam 으로추가하고자하는문자열의번지를넘겨주면된다. LB_DELETESTRING 항목을삭제한다. wparam으로항목의번호를넘겨주며남은문자열수를리턴한다. LB_GETCURSEL 현재선택된항목의번호 (Index) 를조사해준다. 지정한항목의문자열을읽는다. wparam 에항목번호, LB_GETTEXT lparam에문자열버퍼의번지를넘겨주면버퍼에문자열을 채워준다. LB_GETCOUNT 항목의개수를조사한다. LB_SETCURSEL wparam이지정한항목을선택하도록한다. 순천향대학교컴퓨터학부이상정 7 예제 36: 리스트박스컨트롤예 1 리스트박스컨트롤의선택된항목으로윈도우타이틀을변경하는예 순천향대학교컴퓨터학부이상정 8
임베디드 #define 소프트웨어 IDC_LISTBOX 500 #define NumList 6 HWND hlist; TCHAR Items[][15]=L"Apple",L"Orange" Orange,L"Grape" Grape,L"Melon" Melon,L"Pear" Pear, L"Banana"; LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) switch (message) case WM_COMMAND: wmid = LOWORD(wParam); wmevent = HIWORD(wParam); // 메뉴의선택영역을구문분석합니다. switch (wmid) case IDC_LISTBOX: if (wmevent == LBN_SELCHANGE) int n; n = SendMessage(hList, LB_GETCURSEL, 0,0); SetWindowText(hWnd, Items[n]); case IDM_HELP_ABOUT: case WM_CREATE: hlist=createwindow(l"listbox", NULL, WS_CHILD WS_VISIBLE WS_BORDER WS_VSCROLL LBS_NOTIFY,10,30,100,100, hwnd, (HMENU)IDC_LISTBOX, ghinst g_hinst, NULL); for (int i=0; i<numlist; i++) SendMessage(hList, LB_ADDSTRING,0, (LPARAM)Items[i]); 순천향대학교컴퓨터학부이상정 9 예제 37: 리스트박스컨트롤예 2 예제 36 의예에아래와같이리스트를추가, 삭제하는버튼과에디트컨트롤추가 순천향대학교컴퓨터학부이상정 10
예제 37: 리스트박스컨트롤예 2 순천향대학교컴퓨터학부이상정 11 #define ID_LISTBOX 500 #define ID_Edit 501 #define ID_BtnAdd 502 #define ID_BtnDel 503 #define NumList 2 HWND hlist, hedit, hbtnadd, hbtndel; TCHAR Items[][15]=L"Apple", L"Orange"; Orange; LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) int wmid, wmevent; PAINTSTRUCT ps; HDC hdc; TCHAR sztext[128]; int index; switch (message) case WM_COMMAND: wmid = LOWORD(wParam); am) wmevent = HIWORD(wParam); switch (wmid) case ID_LISTBOX: if (wmevent == LBN_SELCHANGE) index = SendMessage(hList, LB_GETCURSEL, 0, 0); SendMessage(hList, LB_GETTEXT, index, (LPARAM)szText); SetWindowText(hWnd, sztext); 순천향대학교컴퓨터학부이상정 12
case ID_BtnAdd: SendMessage(hEdit, WM_GETTEXT, (WPARAM)128, (LPARAM)szText); if (lstrlen(sztext)) SendMessage(hList, LB_ADDSTRING, 0, (LPARAM)szText); case ID_BtnDel: index = SendMessage(hList, LB_GETCURSEL, 0, 0); if (index!= LB_ERR) SendMessage(hList, LB_DELETESTRING, (WPARAM)index, 0); case IDM_HELP_ABOUT: case WM_CREATE: hlist=createwindow(l"listbox", NULL, WS_CHILD WS_VISIBLE WS_BORDER WS_VSCROLL LBS_NOTIFY, 10,30,100,200, hwnd, (HMENU)ID_LISTBOX, g_hinst, NULL); for (int i=0; i<numlist; i++) SendMessage(hList, LB_ADDSTRING, 0, (LPARAM)Items[i]); hedit = CreateWindow(L"edit", NULL, WS_CHILD WS_VISIBLE WS_BORDER ES_AUTOHSCROLL, 120,30,100,20, 100 hwnd, (HMENU)ID_Edit, Edit g_hinst, NULL); hbtnadd = CreateWindow(L"button", L"ADD LIST", WS_CHILD WS_VISIBLE BS_PUSHBUTTON, 120, 80, 100, 30, hwnd, (HMENU)ID_BtnAdd, g_hinst, NULL); hbtndel = CreateWindow(L"button", L"DELETE LIST", WS_CHILD WS_VISIBLE BS_DEFPUSHBUTTON, 120, 130, 100, 30, hwnd, (HMENU)ID_BtnDel, g_hinst, NULL); 순천향대학교컴퓨터학부이상정 13 다이얼로그와리스트박스 순천향대학교컴퓨터학부이상정 14
다이얼로그컨트롤 다이얼로그에서컨트롤생성 CreateWindow() 함수가아닌도구상자를사용하여그림 API LONG SendDlgItemMessage(HWND hdlg, int niddlgitem, UINT Msg, WPARAM wparam, LPARAM lparam ); 다이얼로그에서컨트롤로메시지를전송 hdlg: 다이얼로그핸들 niddlgitem: 컨트롤 ID Msg: 메시지 순천향대학교컴퓨터학부이상정 15 예제 38: 다이얼로그리스트박스컨트롤예 스크린을터치하면나타나는다이얼로그의리스트박스의항목을선택하면해당항목이표시된메시지박스를표시하는예 순천향대학교컴퓨터학부이상정 16
예제 38: 리소스추가 다이얼로그 (IDD_DIALOG1) DIALOG1) 추가리소스 버튼컨트롤 : IDOK, IDCANCEL 리스트박스컨트롤 : IDC_LIST1 (Use Tabstops: True) 순천향대학교컴퓨터학부이상정 17 예제 38: 코드 (1) INT_PTR CALLBACK ListboxDlgProc(HWND, UINT, WPARAM, LPARAM); TCHAR items[][30]= L"Korea tseoul", L"France tparis", L"England tlondon", L"Japan ttokyo", L"USA twashington"; // 속성을 LBS_USETABSTOPS 사용 int postab[1] = 50; TCHAR selectstr[128]; LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) switch (message) case WM_LBUTTONDOWN: // 다이얼로그생성 DialogBox(g_hInst, MAKEINTRESOURCE(IDD_DIALOG1), hwnd, ListboxDlgProc); MessageBox(hWnd, selectstr, L"Select", MB_OK); 순천향대학교컴퓨터학부이상정 18
INT_PTR CALLBACK ListboxDlgProc(HWND hdlg, UINT message, WPARAM wparam, LPARAM lparam) switch (message) case WM_INITDIALOG: for (int i=0; i<5; i++) SendDlgItemMessage(hDlg, IDC_LIST1, LB_ADDSTRING, 0, (LPARAM)items[i]); SendDlgItemMessage(hDlg, IDC_LIST1, LB_SETTABSTOPS, 1, // 탭갯수 (LPARAM)posTab); // 탭포지션 SendDlgItemMessage(hDlg, IDC_LIST1, LB_SETCURSEL, 0, 0); case WM_COMMAND: switch (LOWORD(wParam)) case IDOK: int select = SendDlgItemMessage(hDlg, IDC_LIST1, LB_GETCURSEL, 0, 0); SendDlgItemMessage(hDlg, IDC_LIST1, LB_GETTEXT, select, (LPARAM)selectStr); EndDialog(hDlg, LOWORD(wParam)); return (INT_PTR)TRUE; case IDCANCEL: case WM_CLOSE: EndDialog(hDlg, IDOK); return (INT _ PTR)TRUE; EndDialog(hDlg, g, message); return (INT_PTR)TRUE; 순천향대학교컴퓨터학부이상정 19 예제 38: 코드 (2) 콤보박스 순천향대학교컴퓨터학부이상정 20
콤보박스컨트롤 콤보박스는리스트박스와에디트박스의기능을통합 리스트박스는리스트박스에있는항목만선택가능하고, 화면을넓게차지하는단점을보완, 대부분의속성이리스트박스와유사 윈도우클래스의이름은 "combobox" 생성예 hcombo=createwindow(l"combobox" CreateWindow(L,NULL, WS_CHILD WS_VISIBLE CBS_DROPDOWN, 10,30,100,200, hwnd, (HMENU)ID_COMBOBOX, g_hinst,null); 통지메시지 컨트롤이부모윈도우에게 WM_COMMAND와함께보내는메시지 컨트롤 ID, wmid = LOWORD(wParam); 통지메시지, wmevent = HIWORD(wParam); 콤보박스컨트롤메시지 부모윈도우가콤보박스컨트롤에게보내는메시지 순천향대학교컴퓨터학부이상정 21 콤보박스컨트롤스타일 스타일 설명 CBS_SIMPLE 에디트만가진다. CBS_DROPDOWN 에디트와리스트박스를가진다. CBS_DROPDOWNLIST 리스트박스만가지며에디트에항목을입력할수는없다. 순천향대학교컴퓨터학부이상정 22
통지메시지 통지메시지 CBN_CLOSEUP 내용리스트가없어지는경우 CBN_DBLCLK 더블클릭 ( 탭핑 ) CBN_DROPDOWN CBN_EDITCHANGE CBN_EDITUPDATE CBN_SELCHANGE 다운버튼누른경우에디트영역에서글자변경시에디트영역에서글자변경직전선택된경우 순천향대학교컴퓨터학부이상정 23 콤보박스메시지 메시지 CB_ADDSTRING CB_DELETESTRING CB_GETCOUNT CB_GETCURSEL CB_GETDROPPEDWIDTH CB_GETTOPINDEX CB_LIMITTEXT CB_SETCURSEL CB_SETTOPINDEX 내용콤보박스항목추가항목삭제전체항목수선택된항목버튼을누를경우내려올높이첫번째나타날항목입력문자수지정선택된항목으로지정첫번째나타날항목지정
예제 39: 콤보박스컨트롤예 콤보박스컨트롤의선택된항목으로윈도우타이틀을변경하는예 순천향대학교컴퓨터학부이상정 25 예제 39: 코드 (1) #define ID_COMBOBOX 500 #define NumCombo 6 TCHAR Items[][15]=L"Apple",L"Orange",L"Grape",L"Melon",L"Pear", L"Banana"; TCHAR sztext[128]; static HWND hcombo; LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) switch (message) case WM_COMMAND: wmid = LOWORD(wParam); wmevent = HIWORD(wParam); // 메뉴의선택영역을구문분석합니다. switch (wmid) case ID_COMBOBOX: switch (HIWORD(wParam)) case CBN_SELCHANGE: int i = SendMessage(hCombo, CB_GETCURSEL,0,0); SendMessage(hCombo, CB_GETLBTEXT, i, (LPARAM)szText); SetWindowText(hWnd, sztext); 순천향대학교컴퓨터학부이상정 26
예제 39: 코드 (2) case CBN_EDITCHANGE: GetWindowText(hCombo, sztext, 128); SetWindowText(hWnd,szText); case IDM_HELP_ABOUT: case WM_CREATE: hcombo = CreateWindow(L"combobox", NULL, WS_CHILD WS_VISIBLE CBS_DROPDOWN, 10,30,100,200, hwnd, (HMENU)ID_COMBOBOX, g_hinst,null); for (int i=0; i<numcombo; i++) SendMessage(hCombo, CB_ADDSTRING,0, (LPARAM)Items[i]); g_hwndcommandbar = CommandBar_Create(g_hInst, hwnd, 1); CommandBar_InsertMenubar(g_hWndCommandBar, g_hinst, IDR_MENU, 0); CommandBar_AddAdornments(g_hWndCommandBar, 0, 0); 순천향대학교컴퓨터학부이상정 27 과제 11 아래와같이두개의리스트박스에서다음과같이동작하는프로그램 버튼 > 이나콤보박스 Add(>) 를선택하면왼쪽의리스트박스의선택된항목이오른쪽으로이동 버튼 < 이나콤보박스 Delete(<) 를선택하면오른쪽의리스트박스의선택된항목이왼쪽으로이동 순천향대학교컴퓨터학부이상정 28