반응형

 

 

사용자 지정 Message를 추가하는 방법이다.

 

 

 

1. 헤더에 Message ID define, Message 처리 함수 선언.

// xxx.h file...

#define WM_SHOW_IMAGE WM_USER+100

class XXX : public CWnd {

	/// 중략...
    
public:
	/// 중략...
	afx_msg LRESULT		OnShowResultImage(WPARAM wParam, LPARAM lParam);
    
};

 

 

2. cpp에 Message 처리 함수 정의

LRESULT XXX::OnShowResultImage(WPARAM wParam, LPARAM lParam) {
	auto item = (T_DATA*)lParam;
	
	if (item) {
    		printf("%d", item->a);
        	printf("%d", item->b);
        	printf("%d", item->c);
	}

	return 0;
}

 

함수의 기본형은 다음과 같다

LRESULT class_name::Func_name(WPARAM wParam, LPARAM lParam) {
	// TODO:...
    
	return 0;
}

 

 

3. cpp 상단에 Message 추가

BEGIN_MESSAGE_MAP(XXX, CWnd)
	ON_WM_CREATE()
	ON_WM_SHOWWINDOW()
	ON_WM_PAINT()
	ON_MESSAGE(WM_SHOW_IMAGE, OnShowResultImage)	// Message ID, Message Function
END_MESSAGE_MAP()

 

 

4. 이제 필요할 때 PostMessage 혹은 SendMessage를 통해 Message를 전달하면 된다.

::PostMessage(this->m_hWnd, WM_SHOW_IMAGE, (WPARAM)0, (LPARAM)0);

 

이때 WPARAM, LPARAM인자는 함수 OnShowResultImage(WPARAM wParam, LPARAM lParam)에 각각 전달된다.

 

  • WPARAM : WORD Parameter, 일반적으로 핸들 or정수를 받을 때 사용.
  • LPARAM : LONG Paramter, 포인터 값을 받을때 사용.

 

데이터를 넘길 때는 구조체를 만들고 LPARAM을 통해서 포인터로 넘기면 된다.

typedef struct {
	int a;
    int b;
    int c;
} T_DATA;
    
    
// 호출 부분...
	T_DATA* item = new T_DATA;
	item->a = 1;
	item->b = 2;
	item->c = 3;
    
	::PostMessage(this->m_hWnd, WM_SHOW_IMAGE, 0, (LPARAM)item);
// ...

 

 

PostMessage vs SendMessage

PostMessage는 Message를 전달 후 기다리지 않고 반환하여 그대로 진행하지만
SendMessage는 전달 후 Message를 처리할 때까지 반환하지 않고 기다린다.

 

 

 

 

 

끝.

반응형
woongs_93