标题:一个困扰我很久的问题(WM_CREATE)?
只看楼主
q345918550q
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2010-3-28
结帖率:30%
已结贴  问题点数:10 回复次数:5 
一个困扰我很久的问题(WM_CREATE)?
网上是这样解释的:当一个应用程序创建窗口时,会通过消息处理函数。但是这个消息在 CreateWindow 函数返回之前被送到消息处理函数。
  首先问题是这样引出来的,在CreateWindow函数没返回之前,CreateWindow函数发送一个WM_CREATE消息,那这个WM_CREATE消息就到窗口过程中的WM_CREATE执行。但问题来了,WM_CREATE消息来得时候窗口还没建立好呢?到底windows系统什么时候给 应用程序 准备 消息队列的,不是窗口弹出来的时候才给应用程序准备 消息队列的吗?还有就是CreateWindow还没有返回时就可以在其他地方用hwnd?  尽量详细一点
搜索更多相关主题的帖子: CREATE 困扰 
2010-09-02 10:24
forever74
Rank: 12Rank: 12Rank: 12
来 自:CC
等 级:贵宾
威 望:49
帖 子:1636
专家分:3940
注 册:2007-12-27
得分:0 
首先,你得认识到CreateWindow是一个函数,它一旦执行起来,就不是一个时间点,而是一个时间段,尽管时间很短。
那么我们说它执行以后窗口就建立起来了,并不是说它返回之前窗口就没有建立起来。很显然是在它执行的过程中的某个时刻,窗口已经建立,消息队列已经建立,然后再发送一个WM_CREATE给队列,最后再返回的。
另外,窗口建立起来了和它出现在显示器上可不是一回事儿,所以肯定是有了消息队列之后窗口才会被ShowWindow弄到屏幕上去。
最后,hwnd的值肯定在CreateWindow在执行的早期就已经形成了,所以在CreateWindow没返回之前系统就把这个值传递给窗口过程也不意外。

对宇宙最严谨的描述应该就是宇宙其实是不严谨的
2010-09-02 14:27
do8do8do8
Rank: 10Rank: 10Rank: 10
来 自:沙滩
等 级:贵宾
威 望:17
帖 子:366
专家分:1845
注 册:2010-7-2
得分:0 
i like this.
我背一段给你听:
当启动windows程序的时候,windows系统就为之建立好了消息队列。

学C语言从底层开始,学编程从问题开始,一日学会C!!!
2010-09-02 14:42
do8do8do8
Rank: 10Rank: 10Rank: 10
来 自:沙滩
等 级:贵宾
威 望:17
帖 子:366
专家分:1845
注 册:2010-7-2
得分:0 
以下是引用do8do8do8在2010-9-2 14:42:11的发言:

i like this.
我背一段给你听:
当启动windows程序的时候,windows系统就为之建立好了消息队列。
   窗口过程函数在窗口被建立后和在窗口可见之前接受了WM_CREATE

   hwnd句柄的存在跟返回值有先后之分,建立了hwnd句柄在先,返回句柄在后,
   但是句柄的使用,在hwnd句柄建立后就可以了。

学C语言从底层开始,学编程从问题开始,一日学会C!!!
2010-09-02 14:59
do8do8do8
Rank: 10Rank: 10Rank: 10
来 自:沙滩
等 级:贵宾
威 望:17
帖 子:366
专家分:1845
注 册:2010-7-2
得分:0 
以下是引用forever74在2010-9-2 14:27:55的发言:

首先,你得认识到CreateWindow是一个函数,它一旦执行起来,就不是一个时间点,而是一个时间段,尽管时间很短。
那么我们说它执行以后窗口就建立起来了,并不是说它返回之前窗口就没有建立起来。很显然是在它执行的过程中的某个时刻,窗口已经建立,消息队列已经建立,然后再发送一个WM_CREATE给队列,最后再返回的。
另外,窗口建立起来了和它出现在显示器上可不是一回事儿,所以肯定是有了消息队列之后窗口才会被ShowWindow弄到屏幕上去。
最后,hwnd的值肯定在CreateWindow在执行的早期就已经形成了,所以在CreateWindow没返回之前系统就把这个值传递给窗口过程也不意外。
这楼说的不错啊,我的内容基本上和他重复了,真不该来抢分

学C语言从底层开始,学编程从问题开始,一日学会C!!!
2010-09-02 15:02
你们都要疼我哦
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:火星
等 级:贵宾
威 望:49
帖 子:1296
专家分:2746
注 册:2008-7-13
得分:10 
基本流程是这样的

GetModuleHandle-RtlZeroMemory-LoadCursor-RegisterClassEx-CreateWindowEx-
ShowWindow-UpdateWindow

其中CreateWindowEx是CreateWindow的32位扩展,用法相同 多了风格参数。

要理解窗口的建立并不是以CreateWindow或CreateWindowEx为开始的,在之前
还有不少步骤。建立并显示以后 ,还有消息循环等。

另外还要区别实例句柄hInstance和窗口句柄hWnd。因为一般都是以窗口来表示一个程序,所以很多时候就把hInstance和hWnd混淆了。实际是不同的。GetModuleHandle首先获取hInstance,CreateWindowEx完成以后,才有hWnd。

windows系统有系统消息队列,还给每个进程的每个线程维护一个消息队列。
windowS就是消息驱动的系统,理解消息还是很重要的。如果有兴趣 可以看看
那本经典的windows程序设计。

小妹,哥哥看你骨骼清奇,绝非凡人,将来必成大业,不如这样,你先把裤裤脱了,待哥哥为你开启灵窍,然后我们一起努力钻研如何
2010-09-02 20:26



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-317482-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015794 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved