라디오 버튼도 일종의 버튼이며, "button"클래스에 BS_RADIOBUTTON, BS_AUTORADIOBUTTON 둘 중 하나의 스타일을 지정하면 라디오 버튼이 된다.
라디오 버튼은 여러가지 선택사항 중 한 가지만 선택할 필요가 있을 때 사용한다.
그룹을 이루는 첫 번째 라디오 버튼에만 WS_GROUP 스타일을 주고 나머지 라디오 버튼은 WS_GROUP 스타일을 주지 않으면 된다. 최초로 WS_GROUP을 가지는 라디오 버튼부터 다음 WS_GROUP 스타일을 가지는 라디오 버튼 직전 까지가 한 그룹이 된다.
Radio.c
#include "MsgProc.h"
enum {ID_R1=101,ID_R2,ID_R3,ID_R4,ID_R5,ID_R6};
HWND r1,r2,r3,r4,r5,r6;
int Graph=0;
COLORREF Color=RGB(255,255,255); //처음엔 흰색
HDC hdc;
PAINTSTRUCT ps;
HBRUSH MyBrush, OldBrush;
LRESULT OnCreate(HWND hWnd, WPARAM wParam, LPARAM lParam)
{ //실행시 그룹박스를 만든다
CreateWindow(TEXT("button"),TEXT("Graph"),WS_CHILD|WS_VISIBLE|
BS_GROUPBOX,5,5,120,110,hWnd,(HMENU)0,g_hInst,NULL);
CreateWindow(TEXT("button"),TEXT("Color"),WS_CHILD|WS_VISIBLE|
BS_GROUPBOX,145,5,120,110,hWnd,(HMENU)2,g_hInst,NULL);
//라디오 버튼 만드는 소스, 첫번째 그룹 WS_GROUP 입력
r1 = CreateWindow(TEXT("button"),TEXT("Rectangle"),WS_CHILD|WS_VISIBLE|
BS_AUTORADIOBUTTON|WS_GROUP,
10,20,100,30,hWnd,(HMENU)ID_R1,g_hInst,NULL);
r2 = CreateWindow(TEXT("button"),TEXT("Ellipse"),WS_CHILD|WS_VISIBLE|
BS_AUTORADIOBUTTON,
10,50,100,30,hWnd,(HMENU)ID_R2,g_hInst,NULL);
r3 = CreateWindow(TEXT("button"),TEXT("Line"),WS_CHILD|WS_VISIBLE|
BS_AUTORADIOBUTTON,
10,80,100,30,hWnd,(HMENU)ID_R3,g_hInst,NULL);
//두번째 라디오 그룹
r4 = CreateWindow(TEXT("button"),TEXT("Green"),WS_CHILD|WS_VISIBLE|
BS_AUTORADIOBUTTON|WS_GROUP,
150,20,100,30,hWnd,(HMENU)ID_R4,g_hInst,NULL);
r5 = CreateWindow(TEXT("button"),TEXT("Red"),WS_CHILD|WS_VISIBLE|
BS_AUTORADIOBUTTON,
150,50,100,30,hWnd,(HMENU)ID_R5,g_hInst,NULL);
r6 = CreateWindow(TEXT("button"),TEXT("Blue"),WS_CHILD|WS_VISIBLE|
BS_AUTORADIOBUTTON,
150,80,100,30,hWnd,(HMENU)ID_R6,g_hInst,NULL);
//처음 선택될 라디오 버튼지정(처음엔 ID_R1과 ID_R4에 클릭되어 있다)
CheckRadioButton(hWnd,ID_R1,ID_R3,ID_R1);
CheckRadioButton(hWnd,ID_R4,ID_R6,ID_R4);
return 0;
}
LRESULT OnCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
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=RGB(0,255,0);
break;
case ID_R5:
Color=RGB(255,0,0);
break;
case ID_R6:
Color=RGB(0,0,255);
break;
}
InvalidateRect(hWnd,NULL,TRUE); //지우고 다시 그리기
return 0;
}
LRESULT OnPaint(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
hdc = BeginPaint(hWnd, &ps);
MyBrush=CreateSolidBrush(Color);
OldBrush=(HBRUSH)SelectObject(hdc,MyBrush);
switch(Graph)
{
case 0:
Rectangle(hdc,70,150,200,300);
break;
case 1:
Ellipse(hdc,70,150,200,300);
break;
case 2:
MoveToEx(hdc,70,150,NULL);
LineTo(hdc,200,300);
break;
}
SelectObject(hdc,OldBrush);
DeleteObject(MyBrush);
EndPaint(hWnd, &ps);
return 0;
}
LRESULT OnDestroy(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
PostQuitMessage(0);
return 0;
}
#include "MsgProc.h"
enum {ID_R1=101,ID_R2,ID_R3,ID_R4,ID_R5,ID_R6};
HWND r1,r2,r3,r4,r5,r6;
int Graph=0;
COLORREF Color=RGB(255,255,255); //처음엔 흰색
HDC hdc;
PAINTSTRUCT ps;
HBRUSH MyBrush, OldBrush;
LRESULT OnCreate(HWND hWnd, WPARAM wParam, LPARAM lParam)
{ //실행시 그룹박스를 만든다
CreateWindow(TEXT("button"),TEXT("Graph"),WS_CHILD|WS_VISIBLE|
BS_GROUPBOX,5,5,120,110,hWnd,(HMENU)0,g_hInst,NULL);
CreateWindow(TEXT("button"),TEXT("Color"),WS_CHILD|WS_VISIBLE|
BS_GROUPBOX,145,5,120,110,hWnd,(HMENU)2,g_hInst,NULL);
//라디오 버튼 만드는 소스, 첫번째 그룹 WS_GROUP 입력
r1 = CreateWindow(TEXT("button"),TEXT("Rectangle"),WS_CHILD|WS_VISIBLE|
BS_AUTORADIOBUTTON|WS_GROUP,
10,20,100,30,hWnd,(HMENU)ID_R1,g_hInst,NULL);
r2 = CreateWindow(TEXT("button"),TEXT("Ellipse"),WS_CHILD|WS_VISIBLE|
BS_AUTORADIOBUTTON,
10,50,100,30,hWnd,(HMENU)ID_R2,g_hInst,NULL);
r3 = CreateWindow(TEXT("button"),TEXT("Line"),WS_CHILD|WS_VISIBLE|
BS_AUTORADIOBUTTON,
10,80,100,30,hWnd,(HMENU)ID_R3,g_hInst,NULL);
//두번째 라디오 그룹
r4 = CreateWindow(TEXT("button"),TEXT("Green"),WS_CHILD|WS_VISIBLE|
BS_AUTORADIOBUTTON|WS_GROUP,
150,20,100,30,hWnd,(HMENU)ID_R4,g_hInst,NULL);
r5 = CreateWindow(TEXT("button"),TEXT("Red"),WS_CHILD|WS_VISIBLE|
BS_AUTORADIOBUTTON,
150,50,100,30,hWnd,(HMENU)ID_R5,g_hInst,NULL);
r6 = CreateWindow(TEXT("button"),TEXT("Blue"),WS_CHILD|WS_VISIBLE|
BS_AUTORADIOBUTTON,
150,80,100,30,hWnd,(HMENU)ID_R6,g_hInst,NULL);
//처음 선택될 라디오 버튼지정(처음엔 ID_R1과 ID_R4에 클릭되어 있다)
CheckRadioButton(hWnd,ID_R1,ID_R3,ID_R1);
CheckRadioButton(hWnd,ID_R4,ID_R6,ID_R4);
return 0;
}
LRESULT OnCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
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=RGB(0,255,0);
break;
case ID_R5:
Color=RGB(255,0,0);
break;
case ID_R6:
Color=RGB(0,0,255);
break;
}
InvalidateRect(hWnd,NULL,TRUE); //지우고 다시 그리기
return 0;
}
LRESULT OnPaint(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
hdc = BeginPaint(hWnd, &ps);
MyBrush=CreateSolidBrush(Color);
OldBrush=(HBRUSH)SelectObject(hdc,MyBrush);
switch(Graph)
{
case 0:
Rectangle(hdc,70,150,200,300);
break;
case 1:
Ellipse(hdc,70,150,200,300);
break;
case 2:
MoveToEx(hdc,70,150,NULL);
LineTo(hdc,200,300);
break;
}
SelectObject(hdc,OldBrush);
DeleteObject(MyBrush);
EndPaint(hWnd, &ps);
return 0;
}
LRESULT OnDestroy(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
PostQuitMessage(0);
return 0;
}
|
두 개의 라디오 그룹이 있고 각 그룹은 그룹박스에 둘러싸여 있어 같은 그룹임을 쉽게 알 수 있다.
두 개의 전역변수 Graph와 Color이 선언되어 있으며 이 변수들이 현재 선택된 옵션값을 기억한다.
WM_PAINT는 이 두 변수값을 참고하여 선택된 도형을 선택된 색상으로 그린다.
버튼들을 만든 후 CheckRadioButton 함수를 호출하여 처음 선택될 라디오 버튼을 지정한다.
BOOL CheckRadioButton(HWND hDlg, int nlDLast, int nlDCheck);
첫 번째 인수는 라디오 버튼을 가지는 부모 윈도우(대화상자)의 핸들
두 번째와 세 번째 인수는 각각 그룹의 시작 버튼과 끝 버튼
네 번째 인수 선택될 버튼의 ID
WM_PAINT에서는 Color값에 따라 브러시를 만들어 선택하고 Graph값에 따라 도형을 그린다.
사용자가 라디오 버튼을 클릭하면 BN_CLICKED 통지 메시지가 전달되며 WM_COMMAND에서는 통지 메시지를 보낸 라디오 버튼 ID에 따라 Color값과 Graph값을 변경하고 InvalidateRect를 호출하여 화면을 다시 그린다.