반응형
사용자 지정 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를 처리할 때까지 반환하지 않고 기다린다.
끝.
반응형
'언어 | Framework > MFC' 카테고리의 다른 글
[MFC] ntdll.dll error (0) | 2022.04.27 |
---|---|
[MFC] OnPaint, OnDraw, 자식 클래스에서 부모 클래스 WM_PAINT Message 처리하기. (0) | 2022.04.26 |