关于“用户自定义的消息”我有些不清楚

rfit 2000-04-17 06:37:00
在VC中我们可以有两种方式发送windows消息:
1. CWnd::SendMessage()

2. CWnd::PostMessage()

对于这两个函数的用法我有些不清楚(调用设置我了解,主要是在什么地方调用),
我看过MSDN了,在什么情况下需要用上面的消息函数,请举例说明。

是不是只要定义了消息后,在定义处理函数,就可以了。
请大侠多多指点!

我前几天请教的问题 “在对话框内绘图为什么要用OnPaint()成员函数” 只有两三
位大侠指点我,虽然帮助很大,但还有一点不明白。请各位高手去看看。
《〈 在第 4 或 5 页  〉》 感激万分
...全文
198 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
RiverHill 2000-04-23
  • 打赏
  • 举报
回复
SendMessage()与PostMessge()是有区别,而且区别是非常重要的。
SendMessage()是发送消息,要等待他返回。
PostMessage()是发送消息,但是不要等待他返回。
举例说明,
PostMessage()是派一人去银行取钱,他在去银行取钱期间,你什么都可以干,不用专坐在哪儿等他返回来,你可以去红灯区泡妞,如果那人回来,他会抠你或者打你手机,然后,你接到消息后,可以让他把钱送到你处,结清服务费。多爽!
而SendMessage()也是派一人去银行取钱,他在去银行取钱期间,你什么都不能干,专坐在哪儿等他返回来,你干瞪眼,也没办法!

这两种机制,其实是非常有实用价值的。
1、发送消息在一定要等待消息返回时,必须用SendMessage()发送,尤其是消息函数中是处理指针变量的。
2、用PostMessage()发送消息不用等待消息返回,比如在View类中的InitUpdate()就需要发送消息,此消息是在状态栏中显示进度条,如果用SendMessage()发送,进度条还未完成,而用户关闭此窗口,此时,程序会引发异常。
若改为PostMessage()就不会了,当然,显示进度条的函数还需要有一个称之为PeekAndPump()函数。
LHX 2000-04-23
  • 打赏
  • 举报
回复
区别在于使一条WM_MESSAGE到达一个窗口过程的方法不同,一种是(SendMessage())直接跳到其处理函数(立即类型,虽不恰当但有助于理解),另一种是通过系统的消息队列处理(PostMassage())(随机等待类型,消息排队,先进先出,但WM_PAINT除外)...是不是有点说废话的感觉?
对于PostMessage()最典型的应用是关闭窗口,PostMessage(hwnd,WM_QUIT,0,0)
开个玩笑,你想过在你SendMessage()的处理函数中再向同一窗口发送同一消息会是什么结果吗?^O^...如果你感兴趣可以再试试用PostMessage()...比较跟踪一下结果,会加深你对二者区别的理解...不过由此引起的一切后果嘛...请自负^O^
ren20 2000-04-23
  • 打赏
  • 举报
回复
ha ha
rfit 2000-04-17
  • 打赏
  • 举报
回复
lifei 大侠 写的SendMessage(AAA,WM_CLOSE,NULL,NULL);是win32函数,
还是MFC函数?


Mike777 2000-04-17
  • 打赏
  • 举报
回复
定义自定义消息时用:
#define WM_MYMESSAGE WM_USER+??
其中??为任意正整数。
处理时在WinProc的switch(message)中加入:
WM_MYMESSAGE:
//处理代码
.
.
break;
再用SendMessage()或PostMessage()发送消息就行了!
zzh 2000-04-17
  • 打赏
  • 举报
回复
SendMessage()向窗口发送一条Windows消息。直接调用窗口过程,直到该窗口过程返回这条消息后才返回(相比PostMessage函数而言)
PostMessage()在窗口的队列中放置一条消息,且不等待有关窗口处理该消息,便返回。函数可以访问其它应用程序。
lifei 2000-04-17
  • 打赏
  • 举报
回复
SendMessage()
首先你要获取接受该消息的窗体或控件的ID.对于窗体可以用FindWindow(),该FUNCTION根据窗体名称即标题栏查找窗体,其返回值即WINDOW的ID,NOW 你可以向该WINDOW发送消息(dbclick or close),
HWND AAA;
AAA=FindWindow(NULL,"notepad");//
SendMessage(AAA,WM_CLOSE,NULL,NULL);
即为关闭NOTEPAD

16,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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