기술(Tech, IT)/C++

[C++] CreateDialog() 함수

Daniel803 2024. 3. 20. 13:55

CreateDialog() 함수는 대화 상장 템플리 리소스에서 모델리스 대화 상자(modeless dialog box)를 만드는 데 사용되는 Windows API의 일부다. 모델리스 대화 상자(modeless dialog box)는 사용자가 애플리케이션의 다른 창과 상호 작용하는 것을 차단하지 않는다. 이는 사용자가 애플리케이션의 다른 부분에 액세스하기 전에 대화 상자와 상호 작용하고 대화 상자를 닫아야 하는 모달 대화 상자(modal dialog box)와는 대조적이다.

 

CreateDialog() 함수는 리소스 스크립트(.rc 파일) 또는 메모리에 정의된 대화 상자를 만드는 데 사용할 수 있다. 대화 상자는 레이아웃, 제어 요소(예: 버튼, 텍스트 상자 등) 및 기타 속성을 지정하는 템플릿을 기반으로 만들어진다. 아래는 CreateDialog() 의 syntax(문법) 이다.

HWND CreateDialogParam(
  HINSTANCE hInstance,
  LPCTSTR   lpTemplateName,
  HWND      hWndParent,
  DLGPROC   lpDialogFunc,
  LPARAM    dwInitParam
);
  • hInstance
    : 대화 상자 템플릿이 포함된 모듈에 대한 핸들이다. 이 매개변수가 NULL이면, 현재 실행 파일이 사용된다.

  • IpTemplateName
    : 대화 상자 템플릿이다. 이 매개변수는 대화 상자 템플릿의 리소스 이름을 지정하거나 메모리에 있는 대화 상자 템플릿에 대한 포인터일 수 있다. 리소스 이름인 경우 일반적으로 리소스 스크립트에 정의된 대화 상자 리소스의 이름이다.

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

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

  • dwInitParam
    : 대화 상자에 전달할 사용자 정의 데이터다. 이 데이터는 WM_INITDIALOG 메시지 중에 대화 상자에서 사용할 수 있다. 데이터 구조에 대한 포인터나 정수 값과 같은 정보를 전달하는 데 사용할 수 있다.

  • 함수가 성공하면 대화 상자 창에 대한 핸들(HWND)를 반환하고 실패하면 NULL을 반환한다. 자세한 에러 정보를 얻으려면 GetLastError() 함수를 호출하면 된다.

아래는 CreateDialog() 함수를 사용한 예제다. 이 예제에서 resource.h와 .rc 파일은 대화 상자 템플릿으로 IDD_MYDIALOG를 정의한다. MyDialogProc() 은 대화 상자에 대한 메시지를 처리하는 대화 프로시저다. 대화 상자는 ShowWindow를 사용하여 표시되며, 모델리스(modeless)기 때문에 기본 애플리케이션은 대화 상자와 독립적으로 독립적으로 계속 실행될 수 있으므로 사용자는 대화 상자와 기본 애플리케이션 창 모두와 상호 작용할 수 있다.

 

#include <windows.h>
#include "resource.h" // Where your 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:
            // Initialize dialog (e.g., set default values)
            return TRUE;
        case WM_COMMAND:
            // Handle command messages (e.g., button clicks)
            switch (LOWORD(wParam)) {
                case IDOK:
                    // User clicked OK
                    EndDialog(hwndDlg, IDOK);
                    return TRUE;
                case IDCANCEL:
                    // User clicked Cancel
                    EndDialog(hwndDlg, IDCANCEL);
                    return TRUE;
            }
            break;
        case WM_CLOSE:
            EndDialog(hwndDlg, 0);
            return TRUE;
    }
    return FALSE; // Let system handle other messages
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, int nCmdShow) {
    // Create a modeless dialog box
    HWND hwndDialog = CreateDialogParam(hInstance, MAKEINTRESOURCE(IDD_MYDIALOG), NULL, MyDialogProc, 0);
    
    if (hwndDialog != NULL) {
        ShowWindow(hwndDialog, SW_SHOW);
        // Your message loop here, which must handle modeless dialog interactions
    } else {
        // Handle error
    }
    
    return 0;
}

 

참고

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

- https://learn.microsoft.com/ko-kr/windows/win32/api/winuser/nf-winuser-createdialoga

- https://learn.microsoft.com/ko-kr/windows/win32/api/winuser/nf-winuser-createdialogparama

- http://www.soen.kr/lecture/win32api/reference/Function/CreateDialog.htm