'컨트롤'에 해당되는 글 1건

  1. 2006.10.09 컨트롤 묶어서 제어하기... 6




컨트롤 묶어서 제어하기

계산기의 숫자버튼 등은 수치만 바뀌고, 하는 역할은 동일하다.

이런것을 단순히 BN_CLICKED 메시지를 이용 각각의 버튼에 대해 핸들러 함수를 만들어 줄수는 있지만 코드도 길어지고 비효율적이다.

이럴때 "ON_CONTROL_RANGE" 매크로를 이용하면 리소스ID를 이용해서 함수 한곳에서 여러개의 컨트롤을 제어할 수 있다...

예제 프로그램을 보면 버튼이 총 9개 있는데 "Resource.h" 파일에서 각 버튼의 리소스ID를 보면 아래와 같다.

#define IDC_BUTTON1                     1001
#define IDC_BUTTON2                     1002
#define IDC_BUTTON3                     1003
#define IDC_BUTTON4                     1004
#define IDC_BUTTON5                     1005
#define IDC_BUTTON6                     1006
#define IDC_BUTTON7                     1007
#define IDC_BUTTON8                     1008
#define IDC_BUTTON9                     1009
위의 예제를 보면 ID값이 순서데로 나온것을 알수 있는데 이것은 컨트롤을 만든 순서와 같다...중복을 피해서 임의로 수정이 가능하지만 쉽게 사용하기 위해서 컨트롤을 배치할 때 부터 사용할 순서데로 만드는게 좋은듯하다...

다음으로는 각 컨트롤을 제어할 함수를 만들어야 한다...

일단 헤더파일에 다음과 같이 코딩을 한다...함수명은 임의로 정하고 인자값으로 UINT형 값이 하나 들어가는데 이곳에 리소스 ID가 들어간다...
//{{AFX_MSG(CRangeDlg)
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
afx_msg void ControlRange(UINT ID);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()

다음으로 가장 중요한것으로 메시지맵에 "ON_CONTROL_RANGE" 매크로를 삽입해준다...
BEGIN_MESSAGE_MAP(CRangeDlg, CDialog)
//{{AFX_MSG_MAP(CRangeDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_CONTROL_RANGE(BN_CLICKED, IDC_BUTTON1, IDC_BUTTON9, ControlRange)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
"ON_CONTROL_RANGE" 매크로의 각 인자를 대략적으로 설명하면 "IDC_BUTTON1~IDC_BUTTON9" 사이의 리소스ID에 대해서 "BN_CLICKED" 즉 버튼 클릭에 대한 이벤트가 발생하면 "ControlRange" 함수를 호출하라는 의미이다...

마지막으로 소스파일로 가서 아래와 같이 각 컨트롤을 제어할 함수를 작성한후, 함수내에서 매개변수로 넘어온 리소스ID를 if문이나 switch~case등을 이용해서 실제적인 코딩을 한다...
void CRangeDlg::ControlRange(UINT ID)
{
    // 실제적인 코딩...
}

아래는 이 매크로의 원형과 매개변수에 대한 MSDN의 문서이다.
- 원형 -
ON_CONTROL_RANGE(
wNotifyCode
, id1, id2, memberFxn )

- 매개변수 -
wNotifyCode : The notification code to which your handler is responding.

id1 : Command ID at the beginning of a contiguous range of control IDs.

id2 :
Command ID at the end of a contiguous range of control IDs.

memberFxn :
The name of the message-handler function to which the controls are mapped.
(사용언어 및 제작툴 : MFC / VC++ 6.0)
Posted by Gungume
,