[MFC] 색상 슬라이드 프로그램 작성 2

  • 최초 작성일: 2022년 2월 9일 (수)

목차

[TOC]

목적

다음의 조건으로 프로젝트를 완성하라.

  1. 프로젝트 이름은 ‘SlideEx’로 한다.
  2. 1개의 수평 슬라이드(Orientation :Horizontal)와 1개의 수직 슬라이드(Orientation: Vertical)를 생성한다.
  3. 각각의 범위는 수평 슬라이드는 0 ~ 100, 수직 슬라이드는 -100 ~ +100 사이의 값을 가진다.


실습

프로젝트 생성

다이얼로그 기반으로 mfc App 프로젝트를 새로 생성한다. 프로젝트명은 ‘SlideEx’로 한다.


다이얼로그 편집/디자인

우선, 다이얼로그를 편집하자. 아래와 같이 Resource View에서 해당 다이얼로그를 더블클릭하고, 다이얼로그에 있는 컨트롤들을 모두 삭제한다. (Ctrl + A) + Delete 하면 된다.

그런 다음, Toolbox를 통해 컨트롤과 속성을 아래와 같이 설정한다.

이때, Edit Control과 Slider Control만 변수명을 임의로 지정해주었고, 나머지는 신경 안써도된다. (Slider Control의 속성에서 Orientation 설정을 바꾸면 수직, 수평을 정할 수 있다.)

image


변수 추가

그러면 이제 멤버 변수를 생성해주자.

[메뉴]-[프로젝트]-[클래스 마법사] 를 클릭하거나 [Ctrl + Shift + X] 키를 눌러 [클래스 마법사]를 실행한다.

그러면, 아래 이미지처럼 창이 뜨는데, Class Name을 고르고 [멤버 변수] 탭에서 각각의 변수명을 클릭한 후 ‘Add Variable (변수 추가)’ 버튼을 눌러 다음과 같이 설정한다.

image


메시지 추가

수직, 수평 슬라이더에서 마우스가 움직일 때 그 값을 알아내기 위해 ‘WM_HSCROLL’ (수평) 및 ‘WM_VSCROLL’ (수직) 메시지를 더블클릭하여 ‘OnHScroll()’ 함수와 ‘OnVScroll()’ 함수를 다음과 같이 추가한다.

image


코드 작성

그럼, 이제 코드를 삽입해보자.

우선, 슬라이더 컨드롤 범위를 설정해주자. 앞에서 말한 조건대로 수평 슬라이더는 0 ~ 100, 수직 슬라이더는 -100 ~ +100 으로 설정한다.

image


이제, 앞서 생성했던 메시지 함수인 OnHScroll()과 OnVScroll() 함수에 코드를 삽입해준다.

슬라이더의 포지션 정보를 읽어와 해당 정보를 EDIT Control 창에 띄워준다.

void CSlideExDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
	// TODO: Add your message handler code here and/or call default

	CRect rect;
	GetDlgItem(IDC_EDIT_HORIZONTAL)->GetWindowRect(&rect);
	
	int nH = m_sldH.GetPos();
	

	if ((pScrollBar == (CScrollBar*)&m_sldH))
	{
		int nPosH = m_sldH.GetPos();
		
		m_nH = nPosH;

		UpdateData(FALSE);
		InvalidateRect(&rect);
	}
	else
		CDialogEx::OnHScroll(nSBCode, nPos, pScrollBar);
}


void CSlideExDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
	// TODO: Add your message handler code here and/or call default
	CRect rect;
	GetDlgItem(IDC_EDIT_VERTICAL)->GetWindowRect(&rect);
	int nV = m_sldV.GetPos();
	CDialogEx::OnVScroll(nSBCode, nPos, pScrollBar);

	if ((pScrollBar == (CScrollBar*)&m_sldV))
	{
		int nPosV = m_sldV.GetPos();

		m_nV = nPosV;

		UpdateData(FALSE);
		InvalidateRect(&rect);
	}
	else
		CDialogEx::OnHScroll(nSBCode, nPos, pScrollBar);
}

실행 결과 1