일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Brute Force
- String
- Two Points
- 그래프
- binary search
- union find
- Trie
- Hash
- Dijkstra
- 다익스트라
- SQL
- DP
- Stored Procedure
- two pointer
- MYSQL
- 이진탐색
- 스토어드 프로시저
- 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 |