当消息到来时MFC在链表中寻找消息处理函数,但它是如何把实参传给消息处理函数的呢?举例如下:
在.H文件中把原来void OnLButtonDown(UINT nFlags,CPoint point);的声明
改为
void OnLButtonDown(UINT nFlags,CPoint point,char k,int m,char p);
即任意改变消息处理函数中的参数个数或类型,在CPP文件中也作了相应改变,但无论怎么更改均能通过编译,其实消息映射宏只把函数指针(函数名)加入了消息映射表,消息映射表并没有记录函数参数等信息。
我的疑问是:MFC怎么知道我的消息处理函数的参数个数和类型?
哪位大虾详细回答一下,谢谢!
在.H文件中把原来void OnLButtonDown(UINT nFlags,CPoint point);的声明
改为
void OnLButtonDown(UINT nFlags,CPoint point,char k,int m,char p);
即任意改变消息处理函数中的参数个数或类型,在CPP文件中也作了相应改变,但无论怎么更改均能通过编译,其实消息映射宏只把函数指针(函数名)加入了消息映射表,消息映射表并没有记录函数参数等信息。
我的疑问是:MFC怎么知道我的消息处理函数的参数个数和类型?
哪位大虾详细回答一下,谢谢!
解决方案 »
- 求中值出现错误,求指教
- 请教个静态成员变量的问题
- 如何修改“控制面板”==〉“区域和语言选项”==〉“高级”中的语言??setLocale(),以后再加分
- vc多线程中new的指针在另一个线程中如何正确释放?
- CRichEditCtrl控件出错啊……急……
- 谁能提供<MFC Visual C++ 6.0编程技术内幕>这本书的配送CD的下载?
- 如何把了窗口加在WINDOWS的任务栏中
- 请教高手:怎样取出多行文档中的内容?
- 如何向IE连接加密站点时,弹出的需要用户名和密码的输入框中添加数据。
- [非技术贴]求教,本人学校C++已有2年,目前很迷茫不知道应该向哪个方向发展,怎样继续提高自己
- 请问.net 2.0 如何使用CXIMAGE类?
- 如何产生真正的随机数?
最好别修改WM消息的默认行为
可自定义消息自己响应,如
#define WM_MYMSG WM_APP+1000
===========================
这个没有原因吧? 它特定的消息响应特定的函数,有特定的参数和类型,一般情况下不要重载消息函数 如果需要对其进行另外的修改的话 就象 一楼朋友所说的 自定义一个消息函数比较好
传递的就是MSG结构体,其成员就包括窗口处理函数的各个参数。
传递的就是MSG结构体,其成员就包括窗口处理函数的各个参数。
=====================================
但消息处理函数的参数被我大大地改动了,MFC怎么还懂得如何调用?调用一个函数时肯定参数要一致才能通过编译。但MFC好似总能知道消息处理函数的参数。
我知道自定义消息等操作,但就是不明白MFC如何把实参传给消息处理函数而不管消息处理函数的参数被改成什么样子。
传递的就是MSG结构体,其成员就包括窗口处理函数的各个参数。这里不讲清了吗?在消息被响应时,会带MSG结构啊,当然只识别这结构里的相同参数了啦,如带了wParam, lParam的响应函数,会被传进去啊..通过编译,是因为C++支持重载啊
传递的就是MSG结构体,其成员就包括窗口处理函数的各个参数。这里不讲清了吗?在消息被响应时,会带MSG结构啊,当然只识别这结构里的相同参数了啦,如带了wParam, lParam的响应函数,会被传进去啊..通过编译,是因为C++支持重载啊
====================================================
我新增的参数呢?MSG结构体里肯定没有,当MFC调用消息处理函数只传了wParam, lParam等实参,那函数的其它参数呢?虽然C++支持重载,但调用函数总要参数一致吧?
如果你的参数个数比MFC要求的多,那么多出来的参数的值是什么?随机的?
http://blog.csdn.net/jiangsheng/archive/2004/01/05/3797.aspx
=====================================
通过函数指针调用一个函数时参数要匹配,而我修改了参数,问题是MFC怎么还能调用我的函数?
改为
void OnLButtonDown(UINT nFlags,CPoint point,char k,int m,char p);
后在vs2005下编译没通过,不知道楼主是那个版本的,应该是编译器的问题
error C2440: 'static_cast' : cannot convert from 'void (__thiscall CMFCTestSingleView::* )(UINT,CPoint,char,int,char)' to 'void (__thiscall CWnd::* )(UINT,CPoint)'
==========================================
蒋大侠,VC6.0不检查函数类型?不可能吧?再说就算它不检查函数类型,那MFC怎么匹配地调用一个函数?
ON_WM_CREATE()
其实在这类宏出现的时候,函数类型已经确定
请查看AFX_MSGMAP_ENTRY的成员nSig,
但MFC如何将原函数指针转换成与nSig匹配的类型,就是union MessageMapFunctions的功劳了。