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

7-3. 컨트롤 - 라디오 버튼 본문

Windows/윈도우즈 API

7-3. 컨트롤 - 라디오 버튼

scarecrow1992 2021. 12. 27. 11:34

0. 개요

"button" 윈도우 클래스에 BS_RADIOBUTTON, BS_AUTORADIOBUTTON 둘 중 하나의 스타일을 지정하면 라디오 버튼이 된다. 

체크 버튼은 하나의 속성에 대한 참/거짓 속성만을 가지는 반면 라디오 버튼은 그룹에 속한 여러개의 버튼 중 하나만 선택가능하다.

 

라디오 버튼의 그룹을 구성하는 방법

그룹을 이루는 첫번째 라디오 버튼에만 WS_GROUP 스타일을 주고 나머지 라디오 버튼은 WS_GROUP 스타일을 주지 않으면 된다.

그룹 박스 컨트롤 : 어떤 라디오 버튼들이 같은 그룹에 속하는지 나타내기 위해 사용되는 오브젝트. 그룹 박스는 BS_GROUPBOX 스타일을 가지는 버튼의 일종이지만 화면으로 보여지기만 할 뿐 사용자의 입력을 받아들이거나 어떤 기능을 가지는 것은 아니다. 단순한 장식일 뿐이다.

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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
#include <windows.h>
#include <tchar.h>
 
#define ID_R1 101
#define ID_R2 102
#define ID_R3 103
#define ID_R4 104
#define ID_R5 105
#define ID_R6 106
 
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;
}
 
HWND r1,r2,r3,r4,r5,r6;
int GRAPH=0;
int COLOR=0;
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    HBRUSH MyBrush, OldBrush;
    switch(iMessage) {
    case WM_CREATE:
        CreateWindow("button","Graph",WS_CHILD | WS_VISIBLE | 
            BS_GROUPBOX,5,5,120,110,hWnd,(HMENU)0,g_hInst,NULL);
        CreateWindow("button","Color",WS_CHILD | WS_VISIBLE | 
            BS_GROUPBOX,145,5,120,110,hWnd,(HMENU)1,g_hInst,NULL);
        r1=CreateWindow("button","Rectangle",WS_CHILD | WS_VISIBLE | 
            BS_AUTORADIOBUTTON | WS_GROUP,
            10,20,100,30,hWnd,(HMENU)ID_R1,g_hInst,NULL);
        r2=CreateWindow("button","Ellipse",WS_CHILD | WS_VISIBLE | 
            BS_AUTORADIOBUTTON,
            10,50,100,30,hWnd,(HMENU)ID_R2,g_hInst,NULL);
        r3=CreateWindow("button","Line",WS_CHILD | WS_VISIBLE | 
            BS_AUTORADIOBUTTON,
            10,80,100,30,hWnd,(HMENU)ID_R3,g_hInst,NULL);
        r4=CreateWindow("button","Black",WS_CHILD | WS_VISIBLE | 
            BS_AUTORADIOBUTTON | WS_GROUP,
            150,20,100,30,hWnd,(HMENU)ID_R4,g_hInst,NULL);
        r5=CreateWindow("button","Red",WS_CHILD | WS_VISIBLE | 
            BS_AUTORADIOBUTTON,
            150,50,100,30,hWnd,(HMENU)ID_R5,g_hInst,NULL);
        r6=CreateWindow("button","Blue",WS_CHILD | WS_VISIBLE | 
            BS_AUTORADIOBUTTON,
            150,80,100,30,hWnd,(HMENU)ID_R6,g_hInst,NULL);
        //CheckRadioButton(hWnd, ID_R1, ID_R3, ID_R1);
        //CheckRadioButton(hWnd, ID_R4, ID_R6, ID_R4);
        break;
    case WM_COMMAND:
        if (HIWORD(wParam) == BN_CLICKED) {
            switch (LOWORD(wParam)) {
            case ID_R1:
                GRAPH=0;
                break;
            case ID_R2:
                GRAPH=1;
                break;
            case ID_R3:
                GRAPH=2;
                break;
            case ID_R4:
                COLOR=0;
                break;
            case ID_R5:
                COLOR=1;
                break;
            case ID_R6:
                COLOR=2;
                break;
            }
            InvalidateRect(hWnd, NULL, TRUE);
        }
        return 0;
    case WM_PAINT:
        hdc=BeginPaint(hWnd,&ps);
        switch (COLOR) {
        case 0:
            MyBrush=CreateSolidBrush(RGB(0,0,0));
            break;
        case 1:
            MyBrush=CreateSolidBrush(RGB(255,0,0));
            break;
        case 2:
            MyBrush=CreateSolidBrush(RGB(0,0,255));
            break;
        }
        OldBrush=(HBRUSH)SelectObject(hdc,MyBrush);
        switch (GRAPH) {
        case 0:
            Rectangle(hdc,10,200,200,300);
            break;
        case 1:
            Ellipse(hdc,10,200,200,300);
            break;
        case 2:
            MoveToEx(hdc,10,200,NULL);
            LineTo(hdc,200,300);
            break;
        }
        SelectObject(hdc,OldBrush);
        DeleteObject(MyBrush);
        EndPaint(hWnd,&ps);
        return 0;
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }
    return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}
cs

두 그룹의 선두에 있는 r1, r4 라디오 버튼에 WS_GROUP 스타일이 설정되어 있음을 주목한다.

CheckRadioButton 함수를 통해 런타임중에 코드를 통해 체크될 라디오 버튼을 선택할 수 있다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

7-6. 컨트롤 - 리스트 박스  (0) 2021.12.27
7-4. 컨트롤 - 에디트  (0) 2021.12.27
7-2. 컨트롤 - 체크박스 버튼  (0) 2021.12.26
7-1. 컨트롤 - 버튼  (0) 2021.12.26
7. 컨트롤  (0) 2021.12.25
Comments