일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- String
- Trie
- Brute Force
- 그래프
- Two Points
- DP
- two pointer
- Stored Procedure
- 이진탐색
- union find
- Dijkstra
- 스토어드 프로시저
- binary search
- Hash
- MYSQL
- SQL
- 다익스트라
Archives
- Today
- Total
codingfarm
7-2. 컨트롤 - 체크박스 버튼 본문
0. 개요
CreateWindow 함수를 사용하여 버튼 컨트롤 생성시 3번째 매개변수인 dwStyle 를 통해서 버튼의 스타일을 설정할 수 있다.
스타일 | 속성 |
BS_PUSHBUTTON | 푸시 버튼 |
BS_DEFPUSHBUTTON | 디폴트 푸시 버튼 |
BS_CHECKBOX | 체크 박스 |
BS_3STATE | 3가지 상태를 가지는 체크 박스 |
BS_AUTOCHECKBOX | 자동 체크 박스 |
BS_AUTO3STATE | 3가지 상태를 가지는 자동 체크 박스 |
BS_RADIOBUTTON | 라디오 버튼 |
BS_GROUPBOX | 그룹 박스 |
푸시버튼은 앞서 살펴보았다.
여기서는 체크박스를 살펴보겠다.
위표에서 보듯이 체크박스는 스타일에 따라 4가지가 존재한다.
3가지 상태의 경우 선택, 비선택 이외에 grayed라는 상태를 의미하는데, 아마 한번쯤은 보았으리라 생각한다.
동작 방법에 따라서 자동 체크박스와 수동 체크박스로 나뉘는데 수동체크박스는 선택/비선택 상태를 부모 윈도우가 직접 바꾸어야한다.
1. 사용 예
체크박스의 사용 예는 아래와 같다.
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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
|
#include <windows.h>
#include <tchar.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;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
static HWND c1, c2, c3, c4;
static BOOL ELLIPSE = FALSE;
switch (iMessage) {
case WM_CREATE:
c1 = CreateWindow(L"button", L"Draw Ellipse?", WS_CHILD | WS_VISIBLE |
BS_CHECKBOX, 20, 20, 160, 25, hWnd, (HMENU)0, g_hInst, NULL);
c2 = CreateWindow(L"button", L"Good bye Message?", WS_CHILD | WS_VISIBLE |
BS_AUTOCHECKBOX, 20, 50, 160, 25, hWnd, (HMENU)1, g_hInst, NULL);
c3 = CreateWindow(L"button", L"3State", WS_CHILD | WS_VISIBLE | BS_3STATE,
20, 80, 160, 25, hWnd, (HMENU)2, g_hInst, NULL);
c4 = CreateWindow(L"button", L"Auto 3State", WS_CHILD | WS_VISIBLE |
BS_AUTO3STATE, 20, 110, 160, 25, hWnd, (HMENU)3, g_hInst, NULL);
return 0;
case WM_COMMAND:
switch (LOWORD(wParam)) {
case 0:
if (SendMessage(c1, BM_GETCHECK, 0, 0) == BST_UNCHECKED) {
SendMessage(c1, BM_SETCHECK, BST_CHECKED, 0);
ELLIPSE = TRUE;
}
else {
SendMessage(c1, BM_SETCHECK, BST_UNCHECKED, 0);
ELLIPSE = FALSE;
}
InvalidateRect(hWnd, NULL, TRUE);
break;
case 2:
if (SendMessage(c3, BM_GETCHECK, 0, 0) == BST_UNCHECKED)
SendMessage(c3, BM_SETCHECK, BST_CHECKED, 0);
else
if (SendMessage(c3, BM_GETCHECK, 0, 0) == BST_INDETERMINATE)
SendMessage(c3, BM_SETCHECK, BST_UNCHECKED, 0);
else
SendMessage(c3, BM_SETCHECK, BST_INDETERMINATE, 0);
break;
}
return 0;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
if (ELLIPSE == TRUE)
Ellipse(hdc, 200, 100, 400, 200);
else
Rectangle(hdc, 200, 100, 400, 200);
EndPaint(hWnd, &ps);
return 0;
case WM_DESTROY:
if (SendMessage(c2, BM_GETCHECK, 0, 0) == BST_CHECKED)
MessageBox(hWnd, L"Good bye", L"Check", MB_OK);
PostQuitMessage(0);
return 0;
}
return(DefWindowProc(hWnd, iMessage, wParam, lParam));
}
|
cs |
3. 컨트롤 메시지
CreateWindow 함수로 컨트롤들을 생성하고 나면 해당 서브윈도우들의 핸들을 c1~c4 인스턴스에 모두다 할당한다.
그리고 해당 핸들을 매개 삼아 SendMessage 함수로 각 체크박스들의 상태 확인 및 변경을 수행한다.
컨트롤은 자신에게 어떤 변화가 있을때마다 부모 윈도우로 메시지를 보내며 이 메시지를 통지메시지라고 부름을 앞서 설명했다.
또한 부모윈도우가 자식윈도우의 상태를 확인하거나 변경하기 위해 메시지를 보내는것도 가능하다.
메시지의 종류는 컨트롤마다 다르다. 부모 윈도우가 체크박스로 보낼 수 있는 메시지는 다음과 같다.
메시지 | 설명 |
BM_GETCHECK | 체크 박스가 현재 체크되어 있는 상태인지를 조사하며 추가정보는 없다. |
BM_SETCHECK | 체크 박스의 체크 상태를 변경하며 wParam에 변경할 체크 상태를 보내주면 된다. |
BM_GETCHECK에 의해 리턴되는 값, 또는 BM_SETCHEKC에 의해 설정되는 체크박스의 상태는 다음 세가지가 있다.
상수 | 의미 |
BST_CHECKED | 현재 체크되어 있다. |
BST_UNCHECKED | 현재 체크되어 있지 않다. |
BST_INDETERMINATE | 체크도 아니고 미체크도 아닌 상태 |
사용법 자체는 전체적으로 직관적이므로 사용에 큰 어려움은 없으리라 생각한다.
'Windows > 윈도우즈 API' 카테고리의 다른 글
7-4. 컨트롤 - 에디트 (0) | 2021.12.27 |
---|---|
7-3. 컨트롤 - 라디오 버튼 (0) | 2021.12.27 |
7-1. 컨트롤 - 버튼 (0) | 2021.12.26 |
7. 컨트롤 (0) | 2021.12.25 |
6. 그래픽 - 폰트 (0) | 2021.12.25 |
Comments