消息值,托管字符串,扰乱代码及其它
2006-07-20 11:39:33 来源:WEB开发网本文示例源代码或素材下载
许多 C++ 爱好者已经对我最近的专栏中渗入了太多关于C#的内容表示关注。我承认这一点!我唯一的辩解是:由于 Microsoft® .NET Framework 已经获得广泛的认同,给我发送关于C#问题的读者越来越多,同时因为C# 和 C++ 如此类似,所以我就回答了一部分他们的问题。这不是我有意疏远 C++ 爱好者——上帝知道,我就是他们中的一员啊!不管怎样,为了突出重点,从这个月开始的 C++ 专栏将更多地专注于 C++ 的内容,包括托管扩展以及 MFC 这样的传统内容。因此提出你的 C++ 问题吧!我特别鼓励你提出关于托管 C++ 的问题。你使用它的时候有些什么体会?
在你 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 年之前,我不应该对下一个十年的消息范围妄加评论!
更多精彩
赞助商链接