티스토리 뷰

프로그래밍/API

다이얼로그박스

에어버스 2016. 3. 20. 11:21

DialogBox

다이얼로그 상자 폭은 글자 폭의 1/4, 높이는 글자 높이의 1/8 단위로 취급한다.

윈도우 프로시저에서
DialogBox(hInstance, ""다이얼로그박스 이름", hWnd, 다이얼로그박스 메시지처리콜백함수);
로 다이얼로그박스를 만들면 모든 메시지는 윈도우프로시저에서 받아 다이얼로그박스 메시지처리함수로 전달하게된다.

BOOL CALLBACK 다이얼로그메시지처리함수(HWND hDlg, UINT iMsg, WPARA wParam, LPARAM lParam)
{
....
return FALSE;
}

다이얼로그 프로시저가 윈도우프로시저와 다른점

- LRESULT 가 아닌 BOOL 타입을 리턴한다.
- 윈도우 프로시저는 특정메시지를 처리하지 못하면 DefWindowProc()를 호출하지만 대화상자는 메시지처리하면 TRUE, 처리 못하면 FALSE 를 반환해서 윈도우프로시저에게 처리 못했음을 알려준다.
- 윈도우의 WM_PAINT, WM_DESTORY, WM_CRETAE 는 받지 않는다. 초기화는 WM_INITDIALOG 에서 해준다.
- 모달다이얼로그 메시지는 프로그램 메시지큐를 통하지 않는다.

WM_INITDIALOG 에서 TRUE를 리턴하면 TABSTOP 속성을 가진 컨트롤에 포커스를 가진다. 만약, FALSE를 리턴하면 다이얼로그박스에 포커스가 없어 다이얼로그를 닫을 수 없다.

다이얼로그 닫기 : EndDialog(hDlg, 0);

부모윈도우로 메시지 보내기 : SendMessage(GetParent(hDlg), ....)

WS_CAPTION 속성을 가지면 WS_SYSMENU도 사용 가능해진다.
메뉴도 가질 수 있음.

CONTROL "OK", IDOK, "button", WS_CHILD|WS_VISIBLE 은
CreateWindow("button", "OK", WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON|WS_TABSTOP, 10*cxChar/4, 20*cyChar/8, 32*cxChar/4, 14*cyChar/8, hDlg, IDOK, hInstance, NULL) 과 같다.

다이얼로그 닫기 : EndDialog(hDlg, TURE); TRUE(보통 확인(OK)버튼 TRUE, 취소버튼은 FALSE) 값은 DialogBox() 에 리턴값이다.

hWndCtrl = GetNextDlgTabItem(hDlg, hWndCtrl, bPrevious); GetNextDlgGroupItem(hDlg, hWndCtrl, bPrevious)
bPrevious 값이 TRUE면 이전 탭으로 이동할 컨트롤, FALSE면 다음으로 이동할 컨트롤을 얻는다.

EnableWindow(hWndCtrl, TRUE); 컨트롤을 활성화, FALSE면 비활성화 시킴

사용자정의 컨트롤 추가 방법 (기존 OK버튼 대신 사용자 정의 버튼으로 바꾸기)
클래스 정보 등록하고 (클래스이름 EllipPush)
도구상자에서 class=EllipPush, ID=IDOK, Caption=OK 로 설정한다.

1
LRESULT CALLBACK EllipsePushWndProc(HWND, UINT, WPARAM, LPARAM);
cs

1
2
3
4
5
6
7
8
// 클래스 정의
wcex.lpfnWndProc = EllipsePushWndProc;
    wcex.hIcon = NULL;
    wcex.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
    wcex.lpszMenuName = NULL;
    wcex.lpszClassName = TEXT("EllipsPush");
    wcex.hIconSm = NULL;
    return RegisterClassExW(&wcex);
cs

모달 다이얼로그
다른 창으로 포커스 이동 불가능
DialogBox(), EndDialog() 쌍으로 이뤄진다.

모달리스 다이얼로그 
다른 창으로 포커스 이동 가능
CreateDialog(hInstance, szTemplate, 부모핸들, 프로시저함수); // 보통의 윈도우와 비슷함
WS_VISIBLE 을 지정하거나 ShowWindow(hDlgModeless, SW_SHOW) 호출해야 모달리스 다이얼로그를 볼 수 있다.
메시지는 메시지큐를 통해 오므로 메시지 루프를 수정해야만 한다.

1
2
3
4
5
6
7
8
9
 while (GetMessage(&msg, nullptr, 00))
    {
        if (hDlgModeless == 0 || !IsDialogMessage(hDlgModeless, &msg)) 
            if(!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
            {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
    }
cs


 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31