본문 바로가기
프로그래밍/MFC (C++)

MFC ] 라디오 버튼 그룹 지정하여 사용하기 + 초기값 지정하기

by eteo 2022. 9. 13.

직관적으로 만들기 위해 그룹 박스를 먼저 그려주고

 

 

 

그 위에 라디오 버튼을 만든다.

 

 

 

 

 

 

 

 

라디오 버튼을 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);