hyeonk lab

블로그 이미지

hyeonk

hello world! hyeonk lab.

[MFC] SendMessage

mfc & winAPI 2014. 1. 7. 16:28

클래스간 데이터 전달을 하는 방법이 무엇이 있을까.


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
?
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

저작자표시 (새창열림)

'mfc & winAPI' 카테고리의 다른 글

BOOL PreTranslateMessage(MSG* pMsg)  (0) 2014.03.21
분할 윈도우 중 하나에 접근하는 방법  (0) 2014.02.10
어플리케이션(MFC)에서 스레드 사용 및 주의사항 (필독!!)  (0) 2014.01.07
[MFC] MFC 팁 모음  (0) 2013.06.28
Win32Api에서 x64(64비트) Application을 개발할때의 주의점들  (0) 2013.04.15
Posted by hyeonk
블로그 이미지

hello world! hyeonk lab.

by hyeonk

공지사항

    최근...

  • 포스트
  • 댓글
  • 트랙백
  • 더 보기

태그

글 보관함

«   2025/09   »
일 월 화 수 목 금 토
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

링크

카테고리

전체 (44)
ios (1)
mfc & winAPI (17)
c & c++ (4)
java (1)
eclipse (1)
visual_studio (2)
javascript (3)
asp (1)
oracle (3)
개발이야기 (5)
윈도우 일반 (2)
etc (2)
reference (2)
personal_reference (0)

카운터

Total
Today
Yesterday
방명록 : 관리자 : 글쓰기
hyeonk's Blog is powered by daumkakao
Skin info material T Mark3 by 뭐하라
favicon

hyeonk lab

hello world! hyeonk lab.

  • 태그
  • 링크 추가
  • 방명록

관리자 메뉴

  • 관리자 모드
  • 글쓰기
  • 전체 (44)
    • ios (1)
    • mfc & winAPI (17)
    • c & c++ (4)
    • java (1)
    • eclipse (1)
    • visual_studio (2)
    • javascript (3)
    • asp (1)
    • oracle (3)
    • 개발이야기 (5)
    • 윈도우 일반 (2)
    • etc (2)
    • reference (2)
    • personal_reference (0)

카테고리

PC화면 보기 티스토리 Daum

티스토리툴바