[MFC] Spin Control (스핀 컨트롤)

오늘은 Spin Control에 대해서 알아보겠습니다.

보통 Edit Box 같이 사용하는데 마우스로 클릭해서 값을 변경하기 위해 사용합니다. 아래와 같이 Edit Box와 Spin Control을 추가합니다.

Edit Box의 속성에서 ID는 IDC_EDIT_TEST, Number는 TRUE로 변경합니다. ( Number는 선택 사항 )

그런 다음 Edit Box를 우클릭 -> 변수 추가를 한 뒤 변수 이름에 m_edTest를 입력합니다.
Spin Control 속성에서 ID는 IDC_SPIN_TEST, Alignment는 Right Align, Auto Buddy는 TRUE로 설정합니다. ( Auto Buddy 는 선택 사항 )

Spin Control을 우클릭 -> 변수 추가를 한 뒤 변수 이름에 m_spTest를 입력합니다. 그런 다음 OnInitDialog에 아래와 같이 컨트롤 초기화 구문을 입력합니다.

m_edTest.SetWindowText(_T("0")); // 초기값 0으로 설정

m_spTest.SetRange(0, 10); // 0 ~ 10 범위
m_spTest.SetPos(0); // 초기값 0으로 설정

이 상태에서 실행 시키고 확인해 보시면 Spin Control을 눌러도 값이 변하지 않습니다.

Spin Control을 우클릭 -> 이벤트 처리기 추가를 선택 하시고, 아래 그림과 같이 UDN_DELTAPOS를 선택하신 후 추가 및 편집을 선택합니다.

이 이벤트는 Spin Control 위치 값이 변경 되기 전 값이여서 연산을 좀 해줘야 합니다.

아마도 범위 설정 때문에 그런거 같은데 암튼… Visual Studio에서 설명해주는건 아래와 같습니다.

그렇기 때문에 값이 변하기 전에 변한 뒤 값을 연산해줘서 아래와 같이 Spin Control 이벤트 처리 시 Edit Box에 값이 표시되게 입력 합니다.

void CMFCApplication1Dlg::OnDeltaposSpinTest(NMHDR *pNMHDR, LRESULT *pResult)
{
	LPNMUPDOWN pNMUpDown = reinterpret_cast<LPNMUPDOWN>(pNMHDR);

	int iVal = pNMUpDown->iPos + pNMUpDown->iDelta; // 값 = 현재값 + 증/감

	if ((0 <= iVal) && (iVal <= 10))
	{
		CString sValue;
		sValue.Format(_T("%d"), iVal);
		m_edTest.SetWindowText(sValue);
	}
	*pResult = 0;
}

그리고 실행해 보면 아래와 같이 설정한 범위 만큼 작동 합니다.

이상으로 Spin Control에 대해 알아보았습니다.