关于#defined的问题error C2121: '#' : invalid character : possibly the result of a mac

zhangkaial 2010-01-23 02:47:44
我照着书上写的关于消息映射的宏定义代码,代码如下:
#define DECLARE_MESSAGE_MAP() \
struct MSGMAP_ENTRY _messageEntres[];\

#define BEGIN_MESSAGE_MAP() \
struct MSGMAP_ENTRY _messageEntres[]=\
{ \
#define ON_WM(messageID,msgFuc) \
messageID,msgFuc,
#define END_MESSAGE_MAP() \
};\


struct MSGMAP_ENTRY
{
UINT messageID;
void (*pfn)(HWND,UINT,WPARAM,LPARAM);
};

void lbuttondown(HWND,UINT,WPARAM,LPARAM);
void paint(HWND,UINT,WPARAM,LPARAM);
void destroy(HWND,UINT,WPARAM,LPARAM);

DECLARE_MESSAGE_MAP()

BEGIN_MESSAGE_MAP() //这里就是报错的第一个地方!
ON_WM(WM_LBUTTONDOWN,lbuttondown)
ON_WM(WM_PAINT,paint)
ON_WM(WM_DESTROY,destroy)
END_MESSAGE_MAP()

但是总有提示错误,错误如下
c:\documents and settings\administrator\桌面\消息映射\消息映射.cpp(28) : error C2121: '#' : invalid character : possibly the result of a macro expansion
c:\documents and settings\administrator\桌面\消息映射\消息映射.cpp(28) : error C2065: 'define' : undeclared identifier
c:\documents and settings\administrator\桌面\消息映射\消息映射.cpp(28) : error C2061: syntax error : identifier 'ON_WM'
c:\documents and settings\administrator\桌面\消息映射\消息映射.cpp(32) : error C2143: syntax error : missing ';' before '}'
c:\documents and settings\administrator\桌面\消息映射\消息映射.cpp(32) : error C2143: syntax error : missing ';' before '}'



请各位高手帮忙,提点一下!谢谢
...全文
650 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
水煮沉浮️ETF 2010-08-11
  • 打赏
  • 举报
回复
去掉注释和\前的空格

#include<Windows.h>

HINSTANCE hInst;
HWND hWnd;
MSG msg;
char lpszClassName[]="窗口";
char *ShowText;

//定义宏
#define DECLARE_MESSAGE_MAP()\
struct MSGMAP_ENTRY _messageEntres[];\

#define BEGIN_MESSAGE_MAP()\
struct MSGMAP_ENTRY _messageEntres[]=\
{\

#define ON_WM(messageID,msgFuc)\
messageID,msgFuc,
#define END_MESSAGE_MAP()\
};\

//定义消息映射表项结构******************************************
struct MSGMAP_ENTRY
{
UINT nMessage;
void (*pfn)(HWND,UINT,WPARAM,LPARAM);
};

//声明消息处理函数原型*****************************************
void On_LButtonDown(HWND,UINT,WPARAM,LPARAM);
void On_Paint(HWND,UINT,WPARAM,LPARAM);
void On_Destroy(HWND,UINT,WPARAM,LPARAM);

//声明消息映射表***********************************************
DECLARE_MESSAGE_MAP()

//实现消息映射表***********************************************
BEGIN_MESSAGE_MAP()
ON_WM(WM_LBUTTONDOWN,On_LButtonDown)
ON_WM(WM_PAINT,On_Paint)
ON_WM(WM_DESTROY,On_Destroy)
END_MESSAGE_MAP()

//窗口函数******************************************************
LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
int i;
int n=sizeof(_messageEntres)/sizeof(_messageEntres[0]);
for(i=0;i<n;i++)
{
if(message==_messageEntres[i].nMessage)
(*_messageEntres[i].pfn)(hWnd,message,wParam,lParam);
}
return DefWindowProc(hWnd,message,wParam,lParam);
}
//鼠标左键单击消息处理函数的实现******************************************************************
void On_LButtonDown(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
ShowText="Hello !";
InvalidateRect(hWnd,NULL,1);
}
//重绘窗口用户区消息处理函数的实现**************************************************************
void On_Paint(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;
hdc=BeginPaint(hWnd,&ps);
TextOut(hdc,50,50,ShowText,6);
EndPaint(hWnd,&ps);
}
//销毁窗口消息处理函数的实现************************************************************************
void On_Destroy(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
PostQuitMessage(0);
}
ATOM MyRegisterClass(HINSTANCE hInstance);//注册窗口函数
BOOL Create(HINSTANCE,int);//程序实例初始化函数
int Run();//消息循环函数

int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
MyRegisterClass(hInstance);
Create(hInstance,nCmdShow);
ShowWindow(hWnd,nCmdShow);
UpdateWindow(hWnd);
return Run();
}

//注册窗口函数的实现
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASS wc;
wc.style=0;
wc.lpfnWndProc=WndProc;
wc.cbClsExtra=0;
wc.cbWndExtra=0;
wc.hInstance=hInstance;
wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wc.hCursor=LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName=NULL;
wc.lpszClassName=lpszClassName;
return RegisterClass(&wc);
}

//创建窗口函数的实现
BOOL Create(HINSTANCE hInstance,int nCmdShow)
{
hWnd=CreateWindow(lpszClassName,
"Windows",
WS_OVERLAPPEDWINDOW,
400,300,180,160,
NULL,
NULL,
hInstance,
NULL);
return TRUE;
}

//消息循环函数的实现
int Run()
{
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
zhangkaial 2010-01-23
  • 打赏
  • 举报
回复
好了,谢谢3#,4#
zhangkaial 2010-01-23
  • 打赏
  • 举报
回复
2# 我改了还是不行啊
mstlq 2010-01-23
  • 打赏
  • 举报
回复
还漏了一个

#define DECLARE_MESSAGE_MAP() \
struct MSGMAP_ENTRY _messageEntres[];/*这里别有“\”*/

#define BEGIN_MESSAGE_MAP() \
struct MSGMAP_ENTRY _messageEntres[]=\
{ /*这里别有“\”*/
#define ON_WM(messageID,msgFuc) \
messageID,msgFuc,
#define END_MESSAGE_MAP() \
};/*这里别有“\”*/



//DECLARE_MESSAGE_MAP()这句也没有必要出现吧?
耍宝王 2010-01-23
  • 打赏
  • 举报
回复
补充一个
#define DECLARE_MESSAGE_MAP() \ 
struct MSGMAP_ENTRY _messageEntres[];

#define BEGIN_MESSAGE_MAP() \
struct MSGMAP_ENTRY _messageEntres[]=\
{ /*这里应该也不要“\”*/
#define ON_WM(messageID,msgFuc) \
messageID,msgFuc,
#define END_MESSAGE_MAP() \
};
mstlq 2010-01-23
  • 打赏
  • 举报
回复
这是一个可能的解决方案,我不确定是否可行,请楼主尝试一下^_^
#define DECLARE_MESSAGE_MAP() \ 
struct MSGMAP_ENTRY _messageEntres[];/*这里别有“\”*/

#define BEGIN_MESSAGE_MAP() \
struct MSGMAP_ENTRY _messageEntres[]=\
{ \
#define ON_WM(messageID,msgFuc) \
messageID,msgFuc,
#define END_MESSAGE_MAP() \
};/*这里别有“\”*/
tstongtai 2010-01-23
  • 打赏
  • 举报
回复
一起等待高手回答

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧