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

codingfarm

7-2. 컨트롤 - 체크박스 버튼 본문

Windows/윈도우즈 API

7-2. 컨트롤 - 체크박스 버튼

scarecrow1992 2021. 12. 26. 23:52

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, 000)) {
        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, 202016025, hWnd, (HMENU)0, g_hInst, NULL);
        c2 = CreateWindow(L"button", L"Good bye Message?", WS_CHILD | WS_VISIBLE |
            BS_AUTOCHECKBOX, 205016025, hWnd, (HMENU)1, g_hInst, NULL);
        c3 = CreateWindow(L"button", L"3State", WS_CHILD | WS_VISIBLE | BS_3STATE,
            208016025, hWnd, (HMENU)2, g_hInst, NULL);
        c4 = CreateWindow(L"button", L"Auto 3State", WS_CHILD | WS_VISIBLE |
            BS_AUTO3STATE, 2011016025, hWnd, (HMENU)3, g_hInst, NULL);
        return 0;
    case WM_COMMAND:
        switch (LOWORD(wParam)) {
        case 0:
            if (SendMessage(c1, BM_GETCHECK, 00== 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, 00== BST_UNCHECKED)
                SendMessage(c3, BM_SETCHECK, BST_CHECKED, 0);
            else
                if (SendMessage(c3, BM_GETCHECK, 00== 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, 200100400200);
        else
            Rectangle(hdc, 200100400200);
        EndPaint(hWnd, &ps);
        return 0;
    case WM_DESTROY:
        if (SendMessage(c2, BM_GETCHECK, 00== 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