티스토리 뷰
메시지 반사 (Message Reflection)
스스로 통지 메시지를 처리하는 독립적인 컨트롤 클래스를 제작할 수 있도록 한다.
부모 윈도우가 처리하지 않는 통비 메시지를 컨트롤 자신이 처리하는 개념이다. 이를 클래스 수준에서 본다면, 기존의 컨트롤 클래스로부터 새로운 클래스를 만들고 자신의 통지 메시지를 처리하도록 함수를 추가 하기만 하면 된다는 뜻이다.
메시지 반사를 사용하지 않을 경우, 컨트롤의 통지 메시지를 처리하는 코드를 매번 부모 윈도우쪽에서 작성해야 하므로 불필요한 코드 중복이 생기게 된다. 반면 메시지 반사를 사용할 경우, 컨트롤 클래스를 이용하여 컨트롤을 생성하기만 하면 부모 윈도우가 통지 메시지를 처리하지 않더라도 자신의 통지 메시지에 대해 스스로 반응하므로 매우 편리하며 코드 중복도 막을 수 있다.
<메시지 반사를 사용할때 주의점>
부모 윈도우가 통지 메시지를 처리하지 않을 경우에만 컨트롤이 자신의 통지 메시즐ㄹ 처리할 수 있다는 점이다. 즉, 부모 윈도우가 통지 메시지 처리에 있어서 우선권을 가진다는 것이다.
(통지 메시지 : 컨트롤에 변경이 있어 컨트롤 스스로 부모윈도우에게 알려주는 메시지, 예로, 편집 컨트롤에서 키 입력을 받은 경우)
1. CListBox를 상속받는 CMyListBox 클래스를 클래스 마법사로 추가한다.
2. 리스트 박스 컨트롤 항목을 더블 클릭하면 더블 클릭 메시지 처리를 뷰(부모 윈도우)가 아닌 CMyListBox 클래스(CListBox 컨트롤을 상속받은 컨트롤) 자신이 직접 처리하는거니 CMyListBox 클래스에 LBN_DNLCLK 메시지 핸들러를 추가한다.
이래 코드와 같이 부모 윈도우는 CMyListBox 컨트롤(CListBox컨트롤을 상속받은것)의 리스트 항목을 추가하는 기능밖에 없다.
컨트롤의 메시지처리를 자신이 처리 한다. 이것이 메시지 반사
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 |
class CMyListBox : public CListBox
{
DECLARE_DYNAMIC(CMyListBox)
public:
CMyListBox();
virtual ~CMyListBox();
protected:
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnLbnDblclk();
}
BEGIN_MESSAGE_MAP(CMyListBox, CListBox)
ON_CONTROL_REFLECT(LBN_DBLCLK, &CMyListBox::OnLbnDblclk)
END_MESSAGE_MAP()
void CMyListBox::OnLbnDblclk()
{
CString str;
GetText(GetCurSel(), str);
MessageBox(str);
}
class CMFCApplication5View : public CFormView
{
...
public:
CMyListBox m_list;
};
void CMFCApplication5View::OnInitialUpdate()
{
...
m_list.AddString(L"사과");
m_list.AddString(L"포도");
m_list.AddString(L"참외");
m_list.AddString(L"수박");
} |
cs |