클래스간 데이터 전달을 하는 방법이 무엇이 있을까.
출처 : http://hatti.tistory.com/entry/MFC-SendMessage
1. 전역변수
2. 헤더 include 후 변수 접근
3. SendMessage
SendMessage를 이용하면
클래스간 데이터 전달이 용이함을 알고, 사용해보았다(몇번의 삽질과 함께...)
1
2
3
4
5
6
7
8
9
10
11
12
|
LRESULT SendMessage( UINT message, WPARAM wParam = 0, LPARAM lParam = 0 ) throw (); static LRESULT SendMessage( HWND hWnd, UINT message, // 메시지 이름 WPARAM wParam, // 정수형 포인터 전달인자 LPARAM lParam // 실수형 포인터 전달인자 ) throw (); |
주로 static을 쓰게
될텐데...
선언해주어야 하는 파트는
3파트.
1. 메시지
등록
-
'이런 메시지를 쓰겠습니다.' 하는 부분
- 메시지 등록은
이 메시지를 받을 곳 메시지 맵에 등록을 한다. 던져줬는데 받는놈이 뭔지 모르면 그건 스팸일테니... 매시지 맵의 역할에 대해서는 따로
공부..
ex) BEGIN_MESSAGE_MAP(CsendMessageDlg, CDialog)
ON_MESSAGE(메시지
구별자, 처리함수)
END_MESSAGE_MAP()
2. 처리함수
정의
-
위의 처리함수를 정의하는 부분.
3. 메시지
전달
-
메시지를 전달하는 부분
ex) ::SendMessage(전달
받을 곳의 핸들(받는사람) , 메시지 구별자, 전달인자1, 전달인자2);
흐름
SendMessage - 받는
핸들 찾음 - 처리 함수 호출
#sendMessageDlg.cpp // 부모 Dialog
#Modaless.h
#Modaless.cpp // 자식 Dialog
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
BEGIN_MESSAGE_MAP(CsendMessageDlg, CDialog) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() //}}AFX_MSG_MAP ON_BN_CLICKED(IDOK, &CsendMessageDlg::OnBnClickedOk) ON_BN_CLICKED(IDC_BUTTON1, &CsendMessageDlg::OnBnClickedButton1) ON_MESSAGE(UM_TEST_SENDMESSAGE, &CsendMessageDlg::sets) // 1. 메시지 등록 END_MESSAGE_MAP() LRESULT CsendMessageDlg::sets( WPARAM wParam, LPARAM lParam) // 2. 처리함수 정의 { CString *data = (CString*)lParam; // 이렇게 받아옴. 왜냐하면 lParam 은 포인터니까!! CString을 넘긴 주소를 가리키고 있다. ::MessageBox(NULL, _T( "asdf" ), ( LPCWSTR )data, MB_OK); // 이건 그냥 확인용 } |
#Modaless.h
1
|
#define UM_TEST_SENDMESSAGE WM_USER +1 // 메시지 구별자 등록 |
#Modaless.cpp // 자식 Dialog
1
2
3
4
5
6
7
8
9
10
11
|
BOOL CModaless::OnInitDialog() { CDialog::OnInitDialog(); CString *str = new CString( "asdf" ); ::SendMessage(((CSendMessageDlg*)GetParent())->GetSafeHwnd(), UM_TEST_SENDMESSAGE, 0, ( LPARAM )str); // ((CSendMessageDlg*)GetParent())->GetSafeHwnd() : 상위 Dialog의 핸들을 가져옴 // 만약 하위 Dialog에게 보내려면 하위 Dialog의 객체에 sendMessage를 던져주면된다. // 그땐 주소(hWnd가 필요없다. :D) // 3. 메시지 전달 return TRUE; } |
여기에서 보면 가장 중요한 부분이
SendMessage 부분인것 같다.
첫번째 전달인자는 받을 클래스의
핸들러가 들어간다. 즉, 받는사람 주소인 셈.
나는 부모 다이얼로그에
전달하기위해서 getparent를 이용해서 핸들러를 받아왔다.
전달인자는 WPARAM 과
LPARAM.
둘다 dword 형으로
WPARAM은 UINT,
LPARAM은 LONG 형으로 각각 정수형, 실수형 포인터이다.
끗.
PS. 위 내용은 단순히 라이브러리를 어떻게 쓰는지에 대한 방법을
적은 것이다.
후에 꼭, SendMessage와
PostMessage에 대한 이해를 하는것이 중요하다.
라이브러리를 쓰는 개발자보다는
라이브러리를 만들 수 있는 개발자가 되자.
출처 : http://hatti.tistory.com/entry/MFC-SendMessage
'컴퓨터 > 언어,프로그래밍' 카테고리의 다른 글
[VB/.NET] Common Dialog Box(공용 대화 상자) (0) | 2012.08.31 |
---|---|
[HTML] META Tag의 종류와 사용방법 (0) | 2012.04.10 |
[MSDN] Virtual-Key Codes (가상키코드) (0) | 2011.12.24 |
[MFC Dialog] PreTranslateMessage (0) | 2011.12.24 |
[MFC Dialog] OnKeyDown message (0) | 2011.12.24 |