본문 바로가기

프로그램언어/C++

대화상자만들기2

에디트 박스와 이벤트 통지 메시지

 

통지 메시지

통지 메시지 설명
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;

}

 

실행 결과]

 

 

'프로그램언어 > C++' 카테고리의 다른 글

대화상자4  (0) 2020.12.31
대화상자3  (0) 2020.12.29
대화상자만들기  (0) 2020.12.23
ROP모드로 이미지 마스크 설정  (0) 2020.12.22
API 비트맵2  (0) 2020.09.28