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

MFC ] 슬라이더 컨트롤 사용하기

by eteo 2022. 9. 10.

 

 

 

 

 

도구 상자 - Slider Control 생성하고 그 옆에 Edit Control을 만든다.

 

 

 

 

ID는 다음과 같이 변경했다.

 

 

 

에디트 컨트롤 속성의 숫자를 True로 하면 숫자만 입력되게끔 할 수 있다.

 

 

 

 

 

슬라이더 컨트롤은 범주 컨트롤로 변수 추가하고

 

 

 

 

 

 

에디트 컨트롤은 값 CString으로 변수를 추가한다.

 

 

 

 

 

 

OnInitDialog() 에 다음과 같이 추가한다.

 

BOOL CdeltaControlDlg::OnInitDialog()
{
	//...
	SliderInit(&m_sliderX);
	SliderInit(&m_sliderY);
	SliderInit(&m_sliderZ);
	m_strX.Format(_T("%d"), 0);
	m_strY.Format(_T("%d"), 0);
	m_strZ.Format(_T("%d"), -260);

	UpdateData(FALSE);
    //...
}
 
//...

void CdeltaControlDlg::SliderInit(CSliderCtrl* slider)
{
	if (slider->GetDlgCtrlID() == IDC_SLIDER_X || slider->GetDlgCtrlID() == IDC_SLIDER_Y) {
		slider->SetRange(-150, 150);	// 슬라이더 컨트롤의 최소/최대값 설정
		slider->SetPos(0);				// 슬라이더 컨트롤의 위치 설정

	}
	else if (slider->GetDlgCtrlID() == IDC_SLIDER_Z) {
		slider->SetRange(-380, -260);
		slider->SetPos(-260);

	}

	slider->SetTicFreq(1);				// 눈금 간격 설정, 속성의 눈금과 자동 눈금이 True 설정 시
	slider->SetLineSize(1);				// 키보드 방향키로 움직였을 때의 간격 설정

}

 

원래  OnInitDialog() 안에서 . 으로 멤버함수를 쓰면 되는데 슬라이더 컨트롤이 3개나 되서 함수화 해줬다. 

 

 

 

 

 

속성 또는 클래스 마법사에서 WM_HSCROLL 메시지 처리기를 추가한다.

만약 세로 슬라이더라면 WM_VSCROLL 을 사용하면 된다.

 

 

 

 

 

메시지 처리함수에 다음과 같이 추가한다.

 

전달된 파라미터 pScrollBar를 사용하여 어떤 슬라이더인지 검사 후 필요한 코드를 작성한다.

void CdeltaControlDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
	//CSliderCtrl* pSlidCtrl = (CSliderCtrl*)GetDlgItem(IDC_SLIDER_X);
    
	CSliderCtrl* pSlidCtrl = (CSliderCtrl*)pScrollBar;
	if (pSlidCtrl->GetDlgCtrlID() == IDC_SLIDER_X) {
		m_strX.Format(_T("%d"), pSlidCtrl->GetPos());	// .GetPos() 슬라이더의 위치값 읽기
	}
	else if (pSlidCtrl->GetDlgCtrlID() == IDC_SLIDER_Y) {
		m_strY.Format(_T("%d"), pSlidCtrl->GetPos());
	}
	else if (pSlidCtrl->GetDlgCtrlID() == IDC_SLIDER_Z) {
		m_strZ.Format(_T("%d"), pSlidCtrl->GetPos());
	}
	// 슬라이더 컨트롤의 위치가 변경될 때마다 에디트 컨트롤의 텍스트를 수정한다.
	UpdateData(FALSE);

	CDialogEx::OnHScroll(nSBCode, nPos, pScrollBar);
}