에디트 박스와 이벤트 통지 메시지
통지 메시지
통지 메시지 | 설명 |
EN_CHANGE | 에디터 컨트롤의 내용이 변경 되었을 때 |
EN_HSCROLL | 에디터 컨트롤에서 수평 스크롤 바를 클랙했을 때 |
EN_VSCROLL | 에디터 컨트롤에서 수직 스크롤 바를 클릭했을 때 |
EN_ERRSPACE | 메모리가 부족할 때 |
EN_UPDATE | 에디터 컨트롤에서 문자열이 변경 되기 직전에 |
EN_MAXTEXT | 지정한 문자열의 길이를 초과하였을 때 |
EN_SETFOCUS | 에디터 컨트롤이 포커스를 받을 때 |
에디트 컨트롤에서 텍스트 얻어오기
HWND GetDlgItemText ( HWND hDlg, // 컨트롤을 가진 대화상자의 핸들 int nIDDlgItem, // 컨트롤 ID LPTSTR lpString, // 텍스트를 저장할 버퍼 주소 int nMaxCount // lpString이 가리키는 버퍼의 크기 ); |
에디트 컨트롤에 텍스트 출력하기
HWND SetDlgItemText ( HWND hDlg, // 컨트롤을 가진 대화상자의 핸들 int nIDDlgItem, // 컨트롤 ID LPTSTR lpString // 출력할 문자열의 시작 주소 ); |
에디트 컨트롤에 문자열을 복사해보자.
컨트롤을 아래 그림과 같이 만든다.
BOOL CALLBACK DlgProc(HWND hDlg, UINT iMsg, WPARAM wParam, LPARAM lParam) { TCHAR word[100];
switch (iMsg) { case WM_INITDIALOG: return 1; case WM_COMMAND: switch (LOWORD(wParam)) { case ID_BUTTON_COPY: GetDlgItemText(hDlg, IDC_EDIT_SOURCE, word, 100); SetDlgItemText(hDlg, IDC_EDIT_COPY, word); break; case ID_BUTTON_CLEAR: SetDlgItemText(hDlg, IDC_EDIT_SOURCE, _T("")); SetDlgItemText(hDlg, IDC_EDIT_COPY, _T("")); break; case ID_BUTTON_END: EndDialog(hDlg, 0); break; case IDOK: EndDialog(hDlg, 0); break; case IDCANCEL: EndDialog(hDlg, 0); break; } break; } return 0; } |
실행 결과]
체크박스와 라디오 버튼
체크박스 컨트롤 메시지
메시지 | 내용 |
BM_GETCHECK | 체크박스가 현재 체크되어 있는 상태인지 조사 |
BM_SETCHECK | 체크박스의 체크 상태를 변경한다. wParam에 변경할 체크 상태를 보내준다. |
BM_GETCHECK에 의해 리턴되거나 BM_SETCHECK에 의해 설정되는 체크 박스의 상태는 아래와 같다.
상태 | 내용 |
BST_CHECKED | 현테 체크되어 있는 상태 |
BST_UNCHECKED | 현재 체크되어 있지 않은 상태 |
BST_INDETERMINATE |
체크 혹은 비체크도 아닌 상태 |
CheckRadioButton() 함수 : 선택한 라디오버튼만 체크하는 함수
CheckRadioButton( IDC_RADIO1, // 첫번째 라디오 버튼 IDC_RADIO2, // 마지막번째 라디오 버튼 IDC_RADIO2 // 선택하고 싶은 라디오 버튼 ); |
체크박스와 라디오 버튼을 이용하여 취미와 성별을 출력해보자.
아래그림과 같이 디자인해보자.
컨트롤 ID와 속성 설정하기
종류 | ID | 속성 |
Group | IDC_STATIC | Caption : 취미 선택 |
Group | IDC_STATIC | Caption : 성별 선택 |
Check | IDC_CHECK_Y | Caption : 유튜브 |
Check | IDC_CHECK_A | Caption : 애니감상 |
Check | IDC_CHECK_O | Caption : 온라인게임 |
Radio | IDC_RADIO_MALE | Caption : 남자 |
Radio |
IDC_RADIO_FEMALE | Caption : 여자 |
Edit | IDC_EDIT_OUTPUT | Multiline : TURN |
Button | IDC_BUTTON_OUTPUT | Caption : 출력하기 |
Button | IDC_BUTTON_CLOSE | Caption : 종료 |
BOOL CALLBACK DlgProc(HWND hDlg, UINT iMsg, WPARAM wParam, LPARAM lParam) { static int Check[3], Radio; TCHAR hobby[][30] = { _T("유트브"), _T("애니감상"), _T("온라인게임") }; TCHAR sex[][30] = { _T("남자"), _T("여자") }; TCHAR output[200];
switch (iMsg) { case WM_INITDIALOG: CheckRadioButton(hDlg, IDC_RADIO_FEMALE, IDC_RADIO_MALE, IDC_RADIO_FEMALE); return 1; case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_CHECK_Y: Check[0] = 1 - Check[0]; // 체크박스 선택하면 0, 아니면 1 break; case IDC_CHECK_A: Check[1] = 1 - Check[1]; break; case IDC_CHECK_O: Check[2] = 1 - Check[2]; break; case IDC_RADIO_FEMALE: Radio = 0; break; case IDC_RADIO_MALE: Radio = 1; break; case IDC_BUTTON_OUTPUT: _stprintf_s(output, _T("선택한 취미는 %s %s %s입니다.\r\n") _T("선택한 성별은 %s입니다."), Check[0] ? hobby[0] : _T(""), Check[1] ? hobby[1] : _T(""), Check[2] ? hobby[2] : _T(""), sex[Radio]); SetDlgItemText(hDlg, IDC_EDIT_OUTPUT, output); break; case IDC_BUTTON_CLOSE: EndDialog(hDlg, 0); break; case IDOK: EndDialog(hDlg, 0); break; case IDCANCEL: EndDialog(hDlg, 0); break; } break; } return 0; } |
실행 결과]
콤보 박스 컨트롤
통지 메시지 | 설명 |
CBN_DROPDOWN | 콤보 박스 항목을 아래로 펄침 |
CBN_DBLCLK | 드롭다운한 항목 중 하나를 선택하여 더블클릭 |
CBN_EDITCHANGE | 콤보박스 에디트창에서 텍스트를 추가하거나 수정 |
CBN_SELCHANGE | 드롭다운한 항목 중 하나를 선택 |
SendMessage() 함수 : 메시지를 처리한 결과가 리턴된다. 리턴값은 전달되는 메시지에 따라 달라진다.
LRESULT SendMessage ( HWND hWnd, // 메시지를 받을 윈도우나 컨트롤의 핸들 값 UINT Msg, // 전송할 메시지 WPARAM wParam, // 메시지 추가 정보. 메시지에 따라 의미가 달라진다. LPARAM lParam // 메시지 추가 정보 ); |
SendMessage 함수는 보낸 메시지가 완전히 처리되기 전에는 리턴하지 않는 블록 특성을 가지고 있다.
콤보박스 컨트롤 메시지
메시지 | 설명 |
CB_ADDSTRING | 콤보 박스의 항목을 추가한다. |
CB_DELETESTRING | 콤보 박스의 항목 중 하나를 삭제한다. |
CB_FINDSTRING | 콤보 박스의 항목 리스트에 있는 텍스트 중에서 원하는 텍스트가 있는지 찾는다. |
CB_GETCOUNT | 콤보 박스의 항목 리스트에 있는 항목의 개수를 얻어온다. |
CB_GETCURSEL | 콤보 박스에서 선택한 항목의 인덱스 번호를 얻어온다. |
CB_SETCURSEL | 콤보 박스 컨트롤의 텍스트 편집 공간에 지정한 항목의 텍스트를 보여준다. |
BOOL CALLBACK DlgProc(HWND hDlg, UINT iMsg, WPARAM wParam, LPARAM lParam) { static HWND hCombo; static int selection; TCHAR name[20];
switch(iMsg) { case WM_INITDIALOG: hCombo = GetDlgItem(hDlg, IDC_COMBO_LIST); return 1; case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_BUTTON_INSERT: GetDlgItemText(hDlg, IDC_EDIT_NAME, name, 20); if (_tcscmp(name, _T(""))) SendMessage(hCombo, CB_ADDSTRING, 0, (LPARAM)name); return 0; case IDC_BUTTON_DELETE: SendMessage(hCombo, CB_DELETESTRING, selection, 0); return 0; case IDC_COMBO_LIST: if (HIWORD(wParam) == CBN_SELCHANGE) selection = SendMessage(hCombo, CB_GETCURSEL, 0, 0); break; case IDCANCEL: EndDialog(hDlg,0); return 0; } break; } return 0; } |
실행 결과]
리스트 박스 컨트롤
통지 메시지 | 설명 |
LBN_DBLCLK | 리스트 박스를 더블클릭하였다. |
LBN_ERRSPACE | 메모리가 부족하다. |
LBN_KILLFOCUS | 키보드 포커스를 잃었다. |
LBN_SELCANCEL | 사용자가 선택을 취소하였다. |
LBN_SELCHANGE | 사용자에 의해 선택이 변경되었다. |
LBN_SETFOCUS | 키보드 포커스를 얻었다. |
메시지 | 설명 |
LB_ADDSTRING | 리스트 박스에 항목을 추가한다. lParam으로 추가하고자 하는 문자열의 번지를 넘겨주면 된다. |
LB_DELETESTRING | 항목을 삭제한다. wParam으로 항목의 번호를 넘겨주며 남은 문자열수를 리턴한다. |
LB_GETCURSEL | 현재 선택된 항목의 번호(Index)를 조사해준다. |
LB_GETTEXT | 지정한 항목의 문자열을 읽는다. wParam에 항목 번호, lParam에 문자열 버퍼의 번지를 넘겨주면 버퍼에 문자열을 채워준다. |
LB_GETCOUNT | 항목의 개수를 조사한다. |
LB_SETCURSEL | wParam이 지정한 항목을 선택하도록 한다. |
BOOL CALLBACK DlgProc(HWND hDlg, UINT iMsg, WPARAM wParam, LPARAM lParam) { static HWND hList; static int selection; TCHAR name[20];
switch (iMsg) { case WM_INITDIALOG: hList = GetDlgItem(hDlg, IDC_LIST_NAME); return 1; case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_BUTTON_INSERT: GetDlgItemText(hDlg, IDC_EDIT_NAME, name, 20); if (_tcscmp(name, _T(""))) SendMessage(hList, LB_ADDSTRING, 0, (LPARAM)name); return 0; case IDC_BUTTON_DELETE: SendMessage(hList, LB_DELETESTRING, selection, 0); return 0; case IDC_LIST_NAME: if (HIWORD(wParam) == LBN_SELCHANGE) selection = (int)SendMessage(hList, LB_GETCURSEL, 0, 0); break; case IDCANCEL: EndDialog(hDlg, 0); return 0; } break; } return 0; } |
실행 결과]