1. 에디트 컨트롤(박스)
2. 콤보 박스
3. 리스트 박스
※ 컨트롤도 윈도우이다. 따라서 윈도우 핸들이 존재한다.
GetDlgItem()을 통해 핸들을 얻는다.
1. Edit Control
: 사용자로부터 데이터 입력 받음
데이터 입력, 수정, 삭제를 위한 컨트롤
사용방법? 함수 사용
여러 속성을 제공하고 있음
- Password : 비밀번호(값이 보이지 않음)
- Visible : 화면에 출력
- Read Only : 오로지 읽도록(처리된 결과를 보여줄 때 사용)
- Border : 경계선 있/없
- Number : 값을 숫자로만 받음
...
※ 내용 읽기 함수 GetDlgItemText, GetDlgItemInt
UINT GetDlgItemTextA( //문자열 읽기
HWND hDlg,
int nIDDlgItem,
LPSTR lpString,
int cchMax
);
UINT GetDlgItemInt( //정수값 받기
HWND hDlg,
int nIDDlgItem,
BOOL *lpTranslated, //메모리 주소(보통 NULL)
BOOL bSigned //TRUE면 음수도 받을 수 있고, FALSE면 양수만 입력 받음
);
<EditControl에 쓰여진 데이터 읽기 코드>
#include "framework.h"
#include "WindowsProject7_control2.h"
#include <stdio.h>
INT_PTR CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM);
int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPWSTR lpCmdLine,
_In_ int nCmdShow)
{
DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DlgProc);
return 0;
}
INT_PTR CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
char string[100];
int nVal;
switch (message)
{
case WM_CLOSE:
EndDialog(hDlg, 0);
return (INT_PTR)TRUE;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDC_BUTTON1:
GetDlgItemText(hDlg, IDC_EDIT1, string, 99);
MessageBoxA(hDlg, string, "확인", MB_OK);
return (INT_PTR)TRUE;
case IDC_BUTTON2:
nVal = GetDlgItemInt(hDlg, IDC_EDIT1, NULL, FALSE);
sprintf_s(string, "%d", nVal);
MessageBoxA(hDlg, string, "확인", MB_OK);
return (INT_PTR)TRUE;
}
}
return (INT_PTR)FALSE;
}
GetDlgItemText 버튼으로 문자열을 읽어들이고, GetDlgItemInt 버튼으로 양의 정수만(마지막 매개변수를 False로 설정)을 읽어들이고 있다.
※ 데이터 설정 함수 SetDlgItemText, SetDlgItemInt
BOOL SetDlgItemText(
HWND hDlg,
int nIDDlgItem,
LPCSTR lpString //설정할 문자열 지정
);
BOOL SetDlgItemInt(
HWND hDlg,
int nIDDlgItem,
UINT uValue, //지정하고자 하는 값
BOOL bSigned //부호 설정
);
2. Combo Box
여러 항목을 리스트 형태로 출력 및 선택
※ Simple, Drop Down, Drop List 형태 제공
'정렬' 속성은 기본적으로 TRUE로 설정이 되어 있다.
따라서 우리가 항목을 추가할 때 자동으로 정렬이 되므로 자동 정렬되는 것을 원치 않으면 FALSE로 설정하면 된다.
'형식' 속성을 보면 Simple, Drop Down, Drop List 형태를 제공하고 있음을 알 수 있다.
※ 항목이 펼쳐지는 영역 설정 가능
※ 매크로 함수 사용
- Windowsx.h 포함
※ 윈도우 핸들 구하는 함수 GetDlgItem
HWND GetDlgItem(
HWND hDlg,
int nIDDlgItem
);
※ ComboBox_AddString() 사용 실습
void ComboBox_AddString(
hwndCtl,
lpsz
);
#include "framework.h"
#include "WindowsProject8_ComboBox.h"
#include <stdio.h>
#include "Windowsx.h"
INT_PTR CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM);
int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPWSTR lpCmdLine,
_In_ int nCmdShow)
{
DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DlgProc);
return 0;
}
INT_PTR CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
static HWND hComboBox; //정적 변수 선언
static const char* strMenu[] = { "메뉴1","메뉴2","메뉴3" }; //문자열 각각의 메모리 주소가 저장됨
switch (message)
{
case WM_INITDIALOG:
hComboBox = GetDlgItem(hDlg, IDC_COMBO1); //핸들 얻음
for (int i = 0; i < 3; i++) {
ComboBox_AddString(hComboBox, strMenu[i]);
}
return (INT_PTR)TRUE;
case WM_CLOSE:
EndDialog(hDlg, 0);
return (INT_PTR)TRUE;
}
return (INT_PTR)FALSE;
}
hComboBox 핸들을 선언하고, 각각의 문자열 주소를 저장할 strMenu를 선언한다.
Dialog를 실행할 때 콤보박스의 핸들을 얻어와서 hComboBox에 저장한 뒤 AddString()을 통해 설정한 문자열을 넣어주고 있다.
※ ComboBox_DeleteString() 사용 실습 - 역순으로 삭제
void ComboBox_DeleteString(
hwndCtl,
index
);
※ ComboBox_InsertString() 사용하여 항목 추가 실습
void ComboBox_InsertString(
hwndCtl,
index,
lpsz
);
※ ComboBox_GetCurSel()을 통해 인덱스 조사
void ComboBox_GetCurSel(
hwndCtl
);
단지, 메뉴를 추가한 뒤 인덱스가 늘어난 경우에 대해선 처리하지 못하므로 추후에 이를 case 0,1,2로 나누지 말고 for문으로 바꿔야할 것 같다.
3. List Box
- 리스트 출력 영역 안에서 항목 선택
- 지정된 영역보다 많은 항목은 스크롤 바를 통해 선택
- windowsx.h 포함
여기서 10이 넘어가는 순간 자동정렬 되므로 속성창에 가서 '정렬'을 FALSE로 바꿔줘야 한다.