当消息到来时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怎么知道我的消息处理函数的参数个数和类型?
哪位大虾详细回答一下,谢谢!
解决方案 »
- 组合框问题
- 请问什么是宽基线图像,什么是窄基线图像?
- vs2008用ATL写一个简单对象,如何返回GDI+里的Bitmap对象
- hook API的问题~为什么就是钩不到?高手指点一下,错误到底在哪儿?钩send函数!谢谢
- listview的刷新问题
- 请问怎么得到所打开的文件的名字啊?
- rename(...)的问题!!!!!
- CreateWaitableTimer函数需要什么样的头文件?
- 当我单击ListView中的一个文本栏,如何取的该文本栏同列的标题栏的文本?
- 在那儿能看见COM函数CoGetClassObject的源代码?
- 请问.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的功劳了。