首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

下面的sendmessage 看了半年没看懂!没分清楚sendmessage和非MFC 的sendmessage解决思路

2012-05-01 
下面的sendmessage 看了半年没看懂!!!没分清楚sendmessage和非MFC 的sendmessage没分清楚sendmessage和非M

下面的sendmessage 看了半年没看懂!!!没分清楚sendmessage和非MFC 的sendmessage

没分清楚sendmessage和非MFC 的sendmessage
下面是哪种啊
#define WM_USER_SEND_INTDATA WM_USER+10
int data=10;
SendMessage(hwnd,WM_USER_SEND_INTDATA,(WPARAM)data,0); 

WM_USER_SEND_INTDATA是什么,如果是自定义的 ,那该怎么定义,为什么偏偏要 +10呢

对应的接受方 该在哪里处理 能贴点代码吗

那第3个参数是什么 ,最后个参数为什么是0


[解决办法]
::SendMessage()调用全局的,MFC封装了一下,一般情况下都是MFC的。
#define WM_USER_SEND_INTDATA WM_USER+10 这是自定义消息的一种方法,WM_USER+N,N是任取的,只要不自己冲突。
WM_USER_SEND_INTDATA 自定义消息的名称,你看一下消息映射表,会发现,一个消息对应一个函数。对应的函数有两个参数wParam,和lParam,你的消息实现功能需要的条件可以从这里传进来。
第三四个参数就是参数而已,你想要什么传什么就OK了。
[解决办法]
Win32 API中的SendMessage是全局的
MFC中的SendMessage是CWnd类的成员函数

#define WM_USER_SEND_INTDATA WM_USER+10
这里的WM_USER_SEND_INTDATA就是一个自定义消息类型,自定义消息类型的值要大于等于WM_USER,至于大多少是用户自己定义的,只要和其他的自定义分开就行

消息处理的简单点的可以用MFC的宏:
ON_MESSAGE(WM_USER_SEND_INTDATA, message_handler)
message_handler就是你定义的消息处理函数

message可以带2个参数,如果第二个不需要,那就传0好了
[解决办法]
1 2楼讲的很详细了,补充下吧:
WM_USER+10这个10是随意的,因为同时定义的消息可能很多,所以一般定义为
WM_USER+N N可以是从1开始的自然数这样就不会跟系统消息相冲突

至于用法 以响应左键按下为例
消息响应会在3处修改代码,1处是在头文件中,
{{AFX_MSG(CDrawView)
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
...
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
另一处是cpp文件的begin MessageMap和End MessageMap之间,
BEGIN_MESSAGE_MAP(CDrawView, CView)
//{{AFX_MSG_MAP(CDrawView)
ON_WM_LBUTTONDOWN()
//}}AFX_MSG_MAP
// Standard printing commands
END_MESSAGE_MAP()
最后是要有函数实现的代码。
void CDrawView::OnLButtonDown(UINT nFlags, CPoint point) 
{
//code....
CView::OnLButtonDown(nFlags, point);
}

[解决办法]

探讨
没分清楚sendmessage和非MFC 的sendmessage
下面是哪种啊
#define WM_USER_SEND_INTDATA WM_USER+10
int data=10;
SendMessage(hwnd,WM_USER_SEND_INTDATA,(WPARAM)data,0);

WM_USER_SEND_INTDATA是什么,如果是自定义的 ,那该怎么定义,为什么……

[解决办法]
mfc的sendmessage是在cwnd class的定义中。一般用mfc时候在这种符号名上右键一下,生成个bsr看下它的定义行就明白了。

cwndptr->sendmessage 是给目标cwnd class的窗口发送一个消息,则调用时不需要制定 hwnd参数了。

接收方是在 窗口例程里处理的,mfc的 cwnd把创建窗口时制定这个例程所用的函数的流程给包装了。因此直接的窗口例程实际上都是 cwnd class里的那个,但想要自己处理cwnd的消息时,可以重载class中的 PreTranslateMessage函数,这个函数是在一个窗口所必须的消息循环中的必须调用的一个函数例程,一个窗口的消息循环应该是这样的:
while (GetMessage (&msg, NULL, 0, 0))
{
if (hDlgModeless == 0 || !IsDialogMessage (hDlgModeless, &msg))
{
if (!TranslateAccelerator (hwnd, hAccel, &msg))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
}
}
PerTranslateMessage是在TranslateMessage之前调用到的,而dispatchmessage意为此消息已准备完毕,让系统可以调用窗口的消息处理函数了。由此可以重载PerTranslateMessage来添加自己对特定窗口消息的处理,判断BOOL PreTranslateMessage(MSG* pMsg);
pMsg->message 是否符合自己的特定定义(如 #define WM_USER_SEND_INTDATA WM_USER+10)即可。 

详细的mfc处理窗口消息的流程可以参看这个,是一个转帖,非常感谢原帖作者写出这么精彩的文章,不怎么友好的是我忘了他的ID:
http://blog.sina.com.cn/s/blog_5d123f940100k9p7.html

热点排行