| 일 | 월 | 화 | 수 | 목 | 금 | 토 | 
|---|---|---|---|---|---|---|
| 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 | 
- SQL
 - Two Points
 - 스토어드 프로시저
 - binary search
 - Brute Force
 - two pointer
 - 그래프
 - 이진탐색
 - String
 - union find
 - 다익스트라
 - Stored Procedure
 - Trie
 - MYSQL
 - DP
 - Dijkstra
 - Hash
 
- Today
 
- Total
 
codingfarm
8. 대화상자 (Dialogue Box) 본문
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, 0, 0, 0)) { 
        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 |