기술(Tech, IT)/C++

[C++] DialogBox() 함수

Daniel803 2024. 3. 22. 05:17

DialogBox() 는 메모리 또는 애플리케이션의 리소스 파일에 있는 대화 상자 템플릿에서 모달 대화 상자(modal dialog box)를 만드는 Windows API 함수다. CreateDialog() 함수로 만든 모델리스 대화 상자(modeless)와 달리 모달 대화 상자는 입력 포커스를 캡처하고 대화 상자가 닫힐 때까지 사용자가 애플리케이션 내의 다른 창과 상호 작용할 수 없도록 한다.

 

DialogBox() 로 만든 대화 상자의 모달(modal) 특성은 파일 열기, 설정 대화 상자, 확인 등과 같이 애플리케이션에서 진행하기 전에 사용자의 입력이나 결정이 필요한 시나리오에 적합하다. 다음은 DialogBox() 함수의 구문이다.

 

INT_PTR DialogBox(
  HINSTANCE hInstance,
  LPCTSTR   lpTemplate,
  HWND      hWndParent,
  DLGPROC   lpDialogFunc
);

 

  • hInstance
    : 대화 상자 템플릿이 포함된 모듈에 대한 핸들이다. 이 매개변수가 NULL이면 함수는 현재 프로세스를 생성한 모듈을 사용한다.

  • IpTemplate
    : 대화 상자 템플릿으로, 대화 상자 템플릿 리소스의 이름 또는 리소스를 식별하는 정수 값일 수 있다. MAKEINTRESOURCE 매크로는 일반적으로 정수 값을 이 형식으로 변환하는 데 사용된다.

  • hWndParent
    : 대화 상자를 소유하는 창에 대한 핸들로, 대화 상자에 소유자가 없는 경우 NULL 일 수 있다.

  • IpDialogFunc
    : 대화 상자로 전송된 메시지를 처리하는 대화 상자 프로시저(콜백 함수)에 대한 포인터다. 이 함수는 Windows API의 콜백 함수 규칙을 준수해야 한다.

  • 이 함수는 대화 상자가 어떻게 닫혔는지를 나타내는 INT_PTR 값을 반환한다. 이 값은 일반적으로 대화 상자를 닫은 EndDialog 함수 호출에 지정된 nResult 매개 변수의 값이다. 함수가 실패하면 -1을 반환한다.

다음은 DialogBox() 를 사용한 간단한 예다. resourc.h 및 해당 .rc 파일은 대화 상자 템플릿의 식별자로 IDD_MYDIALOG를 정의한다. MyDialogProc() 함수는 버튼 (확인 또는 취소)의 명령이나 초기화 이벤트 등 대화 상장에 대한 메시지를 처리하는 대화 프로시저다. DialogBox() 에 의해 생성된 대화 상자는 모달(modal)이므로 애플리케이션은 사용자가 대화 상자를 닫을 때까지 기다렸다가 DialogBox() 호출을 넘어 실행을 계속한다.

 

#include <windows.h>
#include "resource.h" // Where your dialog resource IDs are defined

// Dialog procedure for handling dialog messages
BOOL CALLBACK MyDialogProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam) {
    switch (message) {
        case WM_INITDIALOG:
            // Perform initialization before the dialog box is displayed
            return TRUE;
        case WM_COMMAND:
            if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) {
                EndDialog(hwndDlg, LOWORD(wParam));
                return TRUE;
            }
            break;
    }
    return FALSE; // Let system handle other messages
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, int nCmdShow) {
    // Display the dialog box as modal
    INT_PTR result = DialogBox(hInstance, MAKEINTRESOURCE(IDD_MYDIALOG), NULL, MyDialogProc);

    if (result == IDOK) {
        // User clicked OK
    } else if (result == IDCANCEL) {
        // User clicked Cancel
    } else {
        // The dialog box could not be created
    }

    return 0;
}

 

참고

- https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-dialogboxa

- https://learn.microsoft.com/en-us/windows/win32/dlgbox/using-dialog-boxes

- https://m.blog.naver.com/richard0326/220691113026