Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
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
Archives
Today
Total
관리 메뉴

codingfarm

8. 대화상자 (Dialogue Box) 본문

Windows/윈도우즈 API

8. 대화상자 (Dialogue Box)

scarecrow1992 2022. 1. 3. 15:23

0. 개요

 

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

 

대화상자에는 컨트롤들이 배치되며 사용자는 대화상자를 호출한 후 컨트롤을 통해 자신의 의사를 표시하고 명령을 내리며 프로그램은 대화상자에 배치된 컨트롤을 통해 현재 상태를 사용자에게 보여준다.

대화상자는 크게 모달형과 모델리스형으로 나뉘어진다.

  • 모달(Modal)형 : 대화상자를 닫기 전에 다른 윈도우로 전환할 수 없으며 반드시 OK버튼이나 Cancel 버튼을 눌러 대화상자를 닫아야 다른 윈도우로 전환할 수 있다. MessageBox 함수에 의해 만들어지는 메시지 박스도 모달형 대화상자이다
  • 모델리스(Modeless)형 : 대화상자를 열어 놓은 채로 다른 윈도우로 전환할 수 있는 대화상자이다.

 

 

1. 생성

1-1. 리소스

Visual Studio의 리소스뷰에서 Dialog를 생성할 수 있다.

리소스뷰의 RC 폴더에서 우클릭 후 "리소스 추가" 선택

생성된 Dialog 리소스를 더블클릭하면 에디터를 열 수 있다.

 

확인과 취소버튼이 기본적으로 주어지는 대화상자가 생성되었다.

좌측의 도구상자에서 원하는 tool들을 dialog box 위에 배치 할 수 있다.

 

 

1-2. 코드

  • 대화상자를 만들기 위해서는 기본적으로 다음 두가지가 있어야 한다.
    • 대화상자 템플리트
      • 대화상자의 모양과 대화상자내의 컨트롤 배치 상태가 저장되는 이진 정보이며 리소스로 작성된다.
      • 개발자 스튜디오에 별도의 대화상자 편집기가 제공되므로 대화상자를 어렵지 않게 디자인할 수 있다.
    • 대화상자 프로시저
      • 대화상자에서 발생하는 메시지를 처리한다.
      • 윈도우 프로시저가 윈도우에서 발생하는 메시지를 처리하는 것과 유사

위 2가지 필수 요소들을 추가한 소스코드는 아래와 같다.

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include <windows.h>
#include <tchar.h>
#include <vector>
#include "resource.h"
 
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
HINSTANCE g_hInst;
LPCTSTR lpszClass = TEXT("Menu");
 
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance
    , LPSTR lpszCmdParam, int nCmdShow)
{
    HWND hWnd;
    MSG Message;
    WNDCLASS WndClass;
    g_hInst = hInstance;
 
    WndClass.cbClsExtra = 0;
    WndClass.cbWndExtra = 0;
    WndClass.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
    WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
    WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    WndClass.hInstance = hInstance;
    WndClass.lpfnWndProc = (WNDPROC)WndProc;
    WndClass.lpszClassName = lpszClass;
    WndClass.lpszMenuName = NULL;
    WndClass.style = CS_HREDRAW | CS_VREDRAW;
    RegisterClass(&WndClass);
 
    hWnd = CreateWindow(lpszClass, lpszClass, WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
        NULL, (HMENU)NULL, hInstance, NULL);
    ShowWindow(hWnd, nCmdShow);
 
    while (GetMessage(&Message, 000)) {
        TranslateMessage(&Message);
        DispatchMessage(&Message);
    }
    return Message.wParam;
}
 
 
BOOL CALLBACK AboutDlgProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
    switch (iMessage)
    {
    case WM_INITDIALOG:
        return TRUE;
    case WM_COMMAND:
        switch (wParam)
        {
        case IDOK:
        case IDCANCEL:
            EndDialog(hDlg, 0);
            return TRUE;
        }
        break;
    }
    return FALSE;
}
 
 
LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
    switch (iMessage) {
    case WM_LBUTTONDOWN:
        DialogBox(g_hInst, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, AboutDlgProc);
        return 0;
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }
    return(DefWindowProc(hWnd, iMessage, wParam, lParam));
}
cs

WndProc 함수 내부를 보면 좌클릭 메시지가 윈도우로 전달되면 DialogBox 함수를 호출함을 볼 수 있다.

위 함수 호출문은 "g_hInst 인스턴스에 정의된 IDD_DIALOG1 대화상자 템플리트로 대화상자를 만들되 이 대화상자의 메시지는 AboutDlgProc 함수가 대화상자 프로시저로써 처리한다"는 뜻이다. 프로그램을 컴파일시키고 실행해 보자. 작업영역에서 마우스 왼쪽 버튼을 누르면 대화상자가 나타날 것이다.

모달형의 대화상자이므로 이 대화상자를 닫기 전에는 부모 윈도우를 조작할 수는 없다. OK나 Cancel 버튼을 누르면 대화상자가 닫힌다.

 

 

 

 

 

 

 

 

 

 

 

 

'Windows > 윈도우즈 API' 카테고리의 다른 글

7-9. 스태틱  (0) 2021.12.29
7-8. 스크롤 바  (0) 2021.12.29
7-7. 콤보 박스  (0) 2021.12.28
7-6. 컨트롤 - 리스트 박스  (0) 2021.12.27
7-4. 컨트롤 - 에디트  (0) 2021.12.27
Comments