티스토리 뷰

Visual Studio 2012 사용


비슷한 작동을 하는 컨트롤들을 하나의 함수로 묶어서 사용해보자.

예) 계산기 숫자 버튼..


ON_CONTROL_RANGE를 몰랐다면 각각의 컨트롤에 버튼클릭 이벤트 함수를 만들어 사용해야 했지만,

이제는 한개의 함수로 제어가 가능하다.


1~4의 숫자에 해당되는 버튼을 만들어 버튼 클릭시 해당 숫자가 EditBox에 표현되는 프로그램을 만들어보자.


1. 준비

1) ON_CONTROL_RANGE 원형(MSDN)

ON_CONTROL_RANGE(
wNotifyCode
, 
id1
, 
id2
, 
memberFxn )

wNotifyCode: 메시지 핸들러를 입력하면 된다.(BN_CLICKED 같은..)

id1: 함수에 적용할 첫번째 컨트롤의 ID를 입력한다. 

id2: 함수에 적용할 마지막 컨트롤의 ID를 입력한다. 

memberFxn: 매핑할 함수 명을 입력한다.


2) MFC 윈폼 프로젝트 생성

대화상자 기반 프로젝트 생성 후에 Editbox 1개와 버튼을 4개 만든다.

(예시 프로젝트 이름: ControlRange)

ON_CONTROL_RANGE에 사용할 컨트롤 ID는 연속적으로 이어진 컨트롤이어야 하기에

버튼 컨트롤들을 아래와 같이 연속성있게 만들어준다.


Resource.h

#define IDC_EDIT1                       1000
#define IDC_BUTTON1                     1001
#define IDC_BUTTON2                     1002
#define IDC_BUTTON3                     1003
#define IDC_BUTTON4                     1004


2. 선언

아래와 같이 각 함수를 선언한다.


ControlRangeDlg.cpp

BEGIN_MESSAGE_MAP(CControlRangeDlg, CDialogEx)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_CONTROL_RANGE(BN_CLICKED, IDC_BUTTON1, IDC_BUTTON4, OnNumberBtnClick)
END_MESSAGE_MAP()

Visual Studio에서 제공해주는 클래스 위자드로는 설정 할 수 없어서 직접 저 위치에 코딩했다.

OnNumberBtnClick이란 함수이름을 정해 아래의 헤더에도 선언해주자.


ControlRangeDlg.h

class CControlRangeDlg : public CDialogEx
{
...
// 구현입니다.
	void OnNumberBtnClick(UINT ctrlID);
	DECLARE_MESSAGE_MAP()
...
}

컨트롤 ID는 UINT로 처리하기 때문에 파라미터를 UINT형으로 만들었다.


3. 활용


ControlRangeDlg.cpp

void CControlRangeDlg::OnNumberBtnClick(UINT ctrlID)
{
	CString strTmp;
	int value = ctrlID-1000;

	strTmp.Format(_T("%d"), value);
	SetDlgItemText(IDC_EDIT1,strTmp);
}


위와 같이 코딩된 후에 테스트 하면 각 버튼을 클릭할때마다 IDC_EDIT1 EditBox에 해당 숫자가 표현이 된다.


로직

1) 버튼이 클릭될 경우, ctrlID의 해당 버튼 컨트롤 ID가 전달이 된다.

2) int형 value를 만들어 해당 버튼의 숫자를 파악한다.

(IDC_BUTTON1 의 경우 1001이기 때문에 -1000을 하게 되면 value는 1이된다.)

3) 해당 value를 CString으로 전환하여 EditBox에 표현한다.


끝!

댓글