用户自定义的消息问题
对消息映射还不是很熟悉
为什么要在源文件开头加入
#define WM_MYMESSAGE WM_USER+1
这样的一行才能正确用自定义的消息 WM_MYMESSAGE? 用MSDN查了一下WM_USER,好像是个很特别的东西呵。没有#define WM_MYMESSAGE WM_USER+1为什么就不能直接用WM_MYMESSAGE?
问题点数:30、回复次数:10Top
1 楼hiiiiiijiang(等待毕业)回复于 2005-04-03 16:46:23 得分 5
没有什么不可以,只是为了不和系统预定义的消息值冲突
你同样可以
#define WM_MYMESSAGE 0x111;
这样Top
2 楼surstar(我要写个操作系统出来……)回复于 2005-04-03 17:01:53 得分 0
都可以~Top
3 楼Featured(我握着爱情的门票静静排队……)回复于 2005-04-03 17:02:30 得分 5
>>没有#define WM_MYMESSAGE WM_USER+1为什么就不能直接用WM_MYMESSAGE?
你试试看,会提示WM_MYMESSAGE未定义的!
其实,这个仅仅是定义一个标识,当程序把它从消息队列中取出来时好辨认。
另外,最好定义在1024之上。(因为WM_USER是1024;0-1024的有系统消息占用了,虽然这个消息不一定出现在你的程序里,但总归不太舒服。)Top
4 楼fanqing(火影忍者+28%(准备学习进程/线程))回复于 2005-04-03 17:37:28 得分 5
1.消息其实就是一个数值
2. 如hiiiiiijiang(还差两个星期升到▲▲▲▲) 的方法是可以的,但是为什么不用呢?可能你使用的数值已经被使用于一般的系统定义的消息.避免冲突.
Top
5 楼xuzheng318(忧郁王子)回复于 2005-04-03 17:40:14 得分 0
消息都是一一对应一个数值!Top
6 楼oyljerry(【勇敢的心】→ ㊣提拉米苏√㊣)回复于 2005-04-03 18:35:18 得分 0
避免和系统自定义的消息冲突就好了Top
7 楼gyj_china(透明)回复于 2005-04-03 20:01:20 得分 10
#define WM_MYMESSAGE WM_USER+1
这是消息声明,我们都知道C++的习惯是先声明后使用.定义消息之前我们习惯定义1024以外的,因为1024以前的一般留给系统使用.
所以WM_USER以外的都可以留给用户使用
如WM_USER+100Top
8 楼kugou123(酷狗)(彪悍的人生,不需要解释 www.xiaozhou.net)回复于 2005-04-03 20:49:37 得分 0
那是为了不和现有的消息冲突,所以预留了一个WM_USER消息,此消息及其以上的值,都可以拿来当作自定义消息。Top
9 楼AnnLiu(Ann)回复于 2005-04-04 00:22:44 得分 0
自定义声明要大于1024Top
10 楼jiangsheng(蒋晟.Net[MVP])回复于 2005-04-04 04:07:22 得分 5
MSDN杂志 2004年7月 C++ Q&A
消息值,托管字符串,扰乱代码及其它
Paul DiLascia
在你 2004 年 3 月 的专栏中,你通过重定义 WM_USER+1 实现 了 CMyOpenDlg 的初始化。我认为在通常意义上你误用了 WM_USER 的范围(它是保留给所有 RegisterClass 使用者的),此外还错在 WM_USER+1 已经 是一个预定义的对话框消息 DM_SETDEFID。你不应该再对这个消息用不同的值了吧?
Jeff Partch
你说得完全正确!WM_USER 是为所有实现窗口类的人保留的——无论是你,还是友好的 Redmondtonians(译注:Microsoft), 仰或是 Gleepoid 行星上的叛逆者。Figure 1 展示了正式的 Windows 消息值的细目分类,对此每个人都应该至少每十年复习一次。WM_USER 到 0x7FFF 是为私有窗口类保留的。你可以将这个范围 认为是在特定的窗体类中有意义的专用消息。举个例子,状态栏控件的 SB_SETTEXTA 使用 WM_USER+1。同时正如你所指出的一样, 对话框的 DM_GETDEFID 和 DM_SETDEFID 使用 WM_USER+0 和 WM_USER+1。我在 2004 年 3 月的专栏中使用 WM_USER+1 是与 DM_GETDEFID 相冲突的。
想要定义其自己消息的应用程序应该使用 WM_APP。WM_APP 是确保不会与系统(WM_CREATE 等等)或类/特定控件消息如 DM_GETDEFID 相冲突的。Windows 定义 的 WM_APP 如下:
#if (WINVER >= 0x0400)
#define WM_APP 0x8000
#endif
正如每个 Windows 极客(Geek)所知道的那样,WINVER 0x0400 是指 Windows 95、Windows 98 和 Windows NT。所以 WM_APP 的使用还不到十年,这解释了为什么我没注意到它——在 2005 年之前,我不应该对下一个十年的消息范围妄加评论!
摘自小刀人的译文
http://www.vckbase.com/document/viewdoc/?id=1276Top




