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로 설정)을 읽어들이고 있다.

 

문자열 입력 후 Text()버튼
문자열 입력 후 Int() 버튼

 

숫자 입력 후 Text() 버튼과 Int()버튼


※ 데이터 설정 함수 SetDlgItemText, SetDlgItemInt

BOOL SetDlgItemText(
  HWND   hDlg,
  int    nIDDlgItem,
  LPCSTR lpString //설정할 문자열 지정
);
BOOL SetDlgItemInt(
  HWND hDlg,
  int  nIDDlgItem,
  UINT uValue, //지정하고자 하는 값
  BOOL bSigned //부호 설정
);

 

Get -> Set 으로 바꾸면 된다.

 

각각의 버튼을 누르면 Edit Text에 내용이 설정된다.


2. Combo Box

여러 항목을 리스트 형태로 출력 및 선택

※ Simple, Drop Down, Drop List 형태 제공

Dialog 설정

'정렬' 속성은 기본적으로 TRUE로 설정이 되어 있다. 

따라서 우리가 항목을 추가할 때 자동으로 정렬이 되므로 자동 정렬되는 것을 원치 않으면 FALSE로 설정하면 된다.

'형식' 속성을 보면 Simple, Drop Down, Drop List 형태를 제공하고 있음을 알 수 있다.

 

 

※ 항목이 펼쳐지는 영역 설정 가능

항목이 펼쳐지는 영역을 설정할 수도 있다.

 

※ 매크로 함수 사용

- Windowsx.h 포함

실제 MSDN에 combo box를 검색하면 사용가능한 매크로 함수 목록이 뜬다.

 

※ 윈도우 핸들 구하는 함수 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
);

DlgProc 함수에서 표시된 부분을 추가한다. DeleteString 함수 사용

 

버튼을 클릭할 때마다 항목이 하나씩 사라지고, 모두 지운 뒤에 버튼을 클릭하면 설정한 메세지 창이 뜬다.

 

 

ComboBox_InsertString() 사용하여 항목 추가 실습

void ComboBox_InsertString(
   hwndCtl,
   index,
   lpsz
);

 

코드 추가
WM_COMMAND 문을 switch-case문으로 바꾼 후 삽입 버튼을 누를 때 삽입이 되도록 한다.

 

해당 인덱스에 알맞게 추가되었다.

 

ComboBox_GetCurSel()을 통해 인덱스 조사

void ComboBox_GetCurSel(
   hwndCtl
);

IDC_BUTTON3 추가 후 인덱스 조사하기

 

정상적으로 처리하는 것을 알 수 있다.

단지, 메뉴를 추가한 뒤 인덱스가 늘어난 경우에 대해선 처리하지 못하므로 추후에 이를 case 0,1,2로 나누지 말고 for문으로 바꿔야할 것 같다.

 


3. List Box

- 리스트 출력 영역 안에서 항목 선택

- 지정된 영역보다 많은 항목은 스크롤 바를 통해 선택

- windowsx.h 포함

 

MSDN에서 list box macro를 검색하면 해당 매크로 함수들의 목록이 나온다

 

IDC_BUTTON4 추가
리스트 박스 메뉴 추가

여기서 10이 넘어가는 순간 자동정렬 되므로 속성창에 가서 '정렬'을 FALSE로 바꿔줘야 한다.

 

 

 

'Project > WIN32 API' 카테고리의 다른 글

컨트롤(3)  (0) 2021.07.22
컨트롤  (0) 2021.07.21
다이얼로그  (0) 2021.07.21
키보드, 마우스  (0) 2021.07.13
그래픽 오브젝트  (0) 2021.07.12

+ Recent posts