직관적으로 만들기 위해 그룹 박스를 먼저 그려주고
그 위에 라디오 버튼을 만든다.
라디오 버튼을 MOVE, DELAY, PUMP 이렇게 3개를 만들었다.
내가 생성한 컨트롤에는 각 ID마다 #define으로 숫자값이 부여되는데 이건 Resource.h 에 정의되어 있다. 이 값이 1씩 증가해야 그룹지어 사용할 수 있다.
Ctrl+D 를 눌러 중간에 끼어드는 값 없이 번호가 순차적으로 부여되었는지 시각적으로 확인할 수도 있다.
각 라디오 버튼의 속성은 아래처럼 설정한다.
라디오 버튼은 그룹 True 부터 시작해서 다음 True를 만나기 전까지 하나의 그룹으로 묶인다.
이렇게 한 그룹으로 묶이면 클래스 마법사에서 확인해봤을 때 그룹의 첫번째 라디오 버튼만 뜨는 것을 확인할 수 있다.
-Dlg.h 파일에 체크된 라디오 버튼을 알아내기 위한 변수를 만든다.
int m_radio;
참고.
컨트롤에서 제어 변수 추가하는 방식으로 하지 않는게 낫다. DoDataExchange 에 등록되면 라디오 버튼이 체크시 변수가 업데이트 되지만 해당 변수의 값이 디폴트 라디오 버튼 체크 값이 되므로 UpdateData(FALSE); 할 때 마다 자동으로 그 값으로 이동한다.
메시지 맵에 다음과 같이 추가한다.
BEGIN_MESSAGE_MAP(CdeltaControlDlg, CDialogEx)
//...
ON_CONTROL_RANGE(BN_CLICKED, IDC_RADIO_MOVE, IDC_RADIO_PUMP, &CdeltaControlDlg::OnBnClickedRadio)
//...(BN_CLICKED, 그룹의 첫번째 라디오버튼, 그룹의 마지막 라디오 버튼, 이벤트 처리기 함수)
END_MESSAGE_MAP()
-Dlg.h 파일에 이벤트 처리 함수 원형을 선언한다.
afx_msg void OnBnClickedRadio(UINT id);
-Dlg.cpp 파일에 이벤트 처리 함수를 정의한다.
afx_msg void CdeltaControlDlg::OnBnClickedRadio(UINT id)
{
switch (id)
{
case IDC_RADIO_MOVE :
m_radio = 0;
// do something...
break;
case IDC_RADIO_DELAY:
m_radio = 1;
// do something...
break;
case IDC_RADIO_PUMP:
m_radio = 2;
// do something...
break;
default:
break;
}
}
파라미터로 들어오는 resource ID를 사용해 어느 버튼이 눌렸는지 알아낼 수 있다. switch case 분기 안에서 멤버 변수 m_radio의 값을 변경하면 다른 함수에서도 m_radio 변수를 활용하여 어떤 버튼이 체크된건지 알아낼 수 있다.
활용 예시)
afx_msg void CdeltaControlDlg::OnBnClickedRadio(UINT id)
{
switch (id)
{
case IDC_RADIO_MOVE :
GetDlgItem(IDC_EDIT_READ_X)->EnableWindow(true);
GetDlgItem(IDC_EDIT_READ_Y)->EnableWindow(true);
GetDlgItem(IDC_EDIT_READ_Z)->EnableWindow(true);
GetDlgItem(IDC_EDIT_DELAY)->EnableWindow(false);
GetDlgItem(IDC_RADIO_PUMP_ON)->EnableWindow(false);
GetDlgItem(IDC_RADIO_PUMP_OFF)->EnableWindow(false);
if (comport_state == TRUE) GetDlgItem(IDC_BT_READ)->EnableWindow(true);
break;
case IDC_RADIO_DELAY:
GetDlgItem(IDC_EDIT_DELAY)->EnableWindow(true);
GetDlgItem(IDC_BT_READ)->EnableWindow(false);
GetDlgItem(IDC_EDIT_READ_X)->EnableWindow(false);
GetDlgItem(IDC_EDIT_READ_Y)->EnableWindow(false);
GetDlgItem(IDC_EDIT_READ_Z)->EnableWindow(false);
GetDlgItem(IDC_RADIO_PUMP_ON)->EnableWindow(false);
GetDlgItem(IDC_RADIO_PUMP_OFF)->EnableWindow(false);
break;
case IDC_RADIO_PUMP:
GetDlgItem(IDC_RADIO_PUMP_ON)->EnableWindow(true);
GetDlgItem(IDC_RADIO_PUMP_OFF)->EnableWindow(true);
GetDlgItem(IDC_BT_READ)->EnableWindow(false);
GetDlgItem(IDC_EDIT_READ_X)->EnableWindow(false);
GetDlgItem(IDC_EDIT_READ_Y)->EnableWindow(false);
GetDlgItem(IDC_EDIT_READ_Z)->EnableWindow(false);
GetDlgItem(IDC_EDIT_DELAY)->EnableWindow(false);
break;
default:
break;
}
}
실행시 라디오버튼 그룹의 선택 초기값 지정하기
CButton* pCheck;
pCheck = (CButton*)GetDlgItem(IDC_RADIO_BT);
pCheck->SetCheck(TRUE);
'프로그래밍 > MFC (C++)' 카테고리의 다른 글
MFC ] 새 코드 요소를 반환하지 못했습니다. 구문 오류일 수 있습니다. 해결방법 (0) | 2022.09.18 |
---|---|
Warning: skipping non-radio button in group 경고 제거하는 법 (0) | 2022.09.14 |
MFC ] 리스트 컨트롤 첫번째 열 가운데 정렬하는 법 (0) | 2022.09.13 |
MFC ] 슬라이더 컨트롤 사용하기 (0) | 2022.09.10 |
MFC ] 윈도우 크기 조절 또는 고정하기, 최소/최대 사이즈 지정 (0) | 2022.08.28 |