HANDLE_MSG宏展开的问题

来源:百度知道 编辑:UC知道 时间:2024/06/29 22:56:07
#define skyline_DefProc DefWindowProc
BOOL skyline_OnCreate(HWND hwnd,CREATESTRUCT FAR * IpCreateStruct);
void skyline_OnDestroy(HWND hwnd);
void skyline_OnPaint(HWND hwnd);这不是我写的~没有出错
void cao(HWND hwnd);这是我写的出错了~为什么我会出错~他都没有出错~郁闷

LRESULT CALLBACK WndProc(HWND hwnd,UINT Message,
WPARAM wParam,LPARAM lParam)
{
switch(Message)
{
HANDLE_MSG(hwnd,WM_CREATE,skyline_OnCreate);
HANDLE_MSG(hwnd,WM_DESTROY,skyline_OnDestroy);
HANDLE_MSG(hwnd,WM_PAINT,skyline_OnPaint);
HANDLE_MSG(hwnd,WM_PAINT,cao);出错

default:
return skyline_DefProc(hwnd,Message,wParam,lParam);
}
}

void cao(HWND hwnd)出错为什么会这样
{

char szchar[8];
sprintf(szchar,"%d",wParam);

MessageBox(hwnd,szchar,"ch",MB_OK);
}
请各位高手出手帮助~~

错误有两点:
第一、消息处理映射重复
HANDLE_MSG(hwnd,WM_PAINT,skyline_OnPaint);
HANDLE_MSG(hwnd,WM_PAINT,cao);
这两句将同一个WM_PAINT消息映射到不同函数处理。
第二、消息处理函数类型错误
WM_CREATE、WM_DESTROY等等都是Windows固定消息,具有固定的处理函数类型。
如果你想自定义一个消息进行映射处理的话,需要符合SDK或MFC的规则。
在MFC中,自定义窗口消息是用ON_MESSAGE宏来映射的,消息处理函数必须有如下形式:
afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);
此函数OnMyMessage是CWnd类派生类的成员函数,在宏展开时会自动添加当前窗口类的句柄。
依次类推,你的消息处理函数定义形式应该是
LRESULT cao(HWND hwnd, WPARAM wParam, LPARAM lParam);

HANDLE_MSG是你自定义的一个映射宏吧,最好展开看看内部结构如何。一般来说Windows标准消息和自定义消息不该用相同的宏进行映射的。

这是什么东西?