티스토리 뷰

사용자 정의 클래스에 메시지(이벤트) 맵 추가하기

OS에서 메시지(이벤트)를 받을 수 있는 대상은 윈도우 뿐이다. 그래서 사용자 정의 클래스에서 메시지를 받으려면 반드시 윈도우 관련 클래스를 상속 받아야만 한다.

가. 가장 쉬운 방법은 클래스 마법사에서 MFC 클래스를 추가할때 기본 클래스를 CWnd 로 지정하면 관련 코드가 자동으로 추가된다.

나. 사용자가 직접 코드에서 추가하는 방법 (이미 만들어진 클래스에 이벤트 처리기 추가 가능)

요약하면>
1. CWnd 클래스를 public 으로 상속받는다.
2. 메시지 맵 매크로를 추가한다.
3. 메시지 처리 함수를 추가한다.
4. 클래스 생성자에서 윈도우 클래스 등록과 윈도우를 만든다.
5. 다른 윈도우에서 메시지를 보낸다.

여기서는 사용자정의 소켓 클래스를 예로 든다.

보통 윈속 프로그래밍에서 서버 소켓은 CAsyncSock을 클라이언트 소켓은 CSocket 을 상속받아야 하므로 기본 클래스로 보통 윈도우 관련 클래스를 지정하지 않게된다.

여기서 코드를 보면 아래와 같다.

- C클라이언트소켓.h 기본 코드

1
2
3
4
5
6
class C클라이언트소켓 : public CSocket
{
public:
    C클라이언트소켓();
    virtual ~C클라이언트소켓();
};
cs

- C클라이언트소켓.cpp 기본 코드

1
2
3
4
5
6
7
8
C클라이언트소켓::C클라이언트소켓()
{
}
 
C클라이언트소켓::~C클라이언트소켓()
{
}
 
cs

이때 클라이언트소켓 클래스에 이벤트 처리기를 추가하고 싶은 경우 CWnd를 다중 상속받게 지정한다.

- C클라이언트소켓.h 변경된 코드

1
2
3
4
5
6
7
8
9
class C클라이언트소켓 : public CSocket, public CWnd
{
public:
    C클라이언트소켓();
    virtual ~C클라이언트소켓();
    afx_msg LRESULT OnComm(WPARAM, LPARAM);
protected:
    DECLARE_MESSAGE_MAP() // 메시지 맵 매크로
};
cs

7행 이벤트 처리함수 반환형은 LRESULT 로 해주고, 사용되지 않는다고 인수 WPARAM 과 LPARAM을 빼면 아래 cpp 코드의 4행에서 매크로정의 에러가 나니 반드시 WPARAM과 LPARAM 인수를 넣어줘야 한다.

- C클라이언트소켓.cpp 변경된 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#define WM_COMM WM_USER+100
 
BEGIN_MESSAGE_MAP(C클라이언트소켓, CWnd)
    ON_MESSAGE(WM_COMM, &C클라이언트소켓::OnComm)
END_MESSAGE_MAP()
 
C클라이언트소켓::C클라이언트소켓()
{
    // 윈도우를 안 만들면 메시지를 받지 못함
    CString str윈도클래스명 = AfxRegisterWndClass(0);
    CWnd::CreateEx(0, str윈도클래스명, NULL0, CRect(0000), NULLNULL);
}
 
C클라이언트소켓::~C클라이언트소켓()
{
}
 
LRESULT C클라이언트소켓::OnComm(WPARAM wParam, LPARAM lParam)
{
    AfxMessageBox(TEXT("C클라이언트소켓 메시지..."));
    return 0L;
}
cs

10행 클라이언트소켓 윈도우는 특별한 모양이 없어 '0' 만 지정했으나 스타일 등 지정 가능하다. 

- View에서 마우스 왼쪽 버튼을 클릭하면 C클라이언트소켓에 WM_COMM 메시지를 전송한다.

1
2
3
4
5
6
7
8
9
#include "C클라이언트소켓.h"
#define WM_COMM WM_USER+100
void CMFCApplication3View::OnLButtonDown(UINT nFlags, CPoint point)
{
    C클라이언트소켓 client;
    ::SendMessage(client.m_hWnd, WM_COMM, 00);
 
    CView::OnLButtonDown(nFlags, point);
}
cs

프로그램을 실행해서 마우스 왼쪽 버튼을 누르면 WM_COMM 메시지가 전달되어 아래와 같이 메시지 박스를 보여준다.

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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