窗口消息:WM_CREATE和WM_NCCREATE之间有什么不同?

bil*_*oon 11 c++ windows

我试图在WM_NCCREATE消息中创建按钮(子窗口),并且它的位置似乎被创建为尊重屏幕坐标,而不是客户端坐标.起初,我认为WM_CREATE和WM_NCCREATE为我们提供了与窗口相同的句柄,但这似乎是不真实的.因此,任何人都可以解释WM_CREATE和WM_NCCREATE消息之间的区别吗?另外WM_CREATE和WM_NCCREATE中窗口句柄的区别是什么?

Dav*_*nan 12

WM_NC消息用于非客户区域,即窗口边界和标题.根据您的需求,您对这些非客户端消息不感兴趣.

  • 正在努力获得NC所代表的东西.谢谢! (3认同)

Chr*_*cke 10

WM_NCCREATE是正在进行的军备竞赛的一个例子.它似乎已被引入到需要在那里DefWindowProc函数(或常用的子类窗口的基础窗口过程)需要执行一些初始化WM_CREATE进行处理或许之前(或弥补的事实,许多窗口实现直接处理WM_CREATE和返回TRUE而不是将其传递给DefWindowProc).

因此,WM_NCCREATE是您应该响应的消息,如果您正在实现默认窗口过程,需要在用户窗口proc处理WM_CREATE消息之前执行初始化.WM_NCCREATE也必须被传递到适当的DefWindowProc函数,你做你自己的处理可能之前为窗口的一些较低级别方面显然处于未初始化状态WM_NCCREATE处理之前.

如果试图保证第一拍处理是不是你的考虑,那么WM_CREATE是执行你的窗口初始化的适当位置:可能有JIST即时通过WM_NCCREATE设置已经完成所有其他层,窗口处于稳定状态,如非客户指标,屏幕位置等.

或者:如果您不知道为什么要在WM_CREATE上使用W​​M_NCCREATE,那么您不应该使用WM_NCCREATE.

  • 是的,当我"处理"`WM_NCCREATE`时(我唯一做的就是通过`SetWindowLognPtr`将`this`设置为`GWLP_USERDATA`并返回`TRUE`)我看到创建窗口没有标题集.但是,当我跳过`return`并允许'DefWindowProc`来处理它时,我看到标题出现了.所以我把`this`设置为`WM_CREATE`并停止处理`WM_NCCREATE`更清洁. (3认同)

Ton*_*ion 5

每个MSDN:

WM_NCCREATE:

首次创建窗口时,在WM_CREATE消息之前发送.

返回值:

如果应用程序处理此消息,则应返回TRUE以继续创建窗口.如果应用程序返回FALSE,则CreateWindow或CreateWindowEx函数将返回NULL句柄.

WM_CREATE:

当应用程序通过调用CreateWindowEx或CreateWindow函数请求创建窗口时发送.(在函数返回之前发送消息.)新窗口的窗口过程在创建窗口之后但在窗口变为可见之前接收到此消息.

返回值:

如果应用程序处理此消息,则应返回零以继续创建窗口.如果应用程序返回-1,则窗口将被销毁,CreateWindowEx或CreateWindow函数将返回NULL句柄.