VC SDK中关于WM_PAINT的新手问题

来源:百度知道 编辑:UC知道 时间:2024/04/28 12:43:15
我只有10分了 望前辈帮忙
我想知道我们通过手动改变窗口所导致系统发出的WM_PAINT消息和我们通过SendMessage函数发出的WM_PAINT消息有什么不同?
我在WM_PAINT消息的相应下设置了一个图片显示,可是这个图片要在窗口被刷新以后才会显示出来,可是我想它在窗口一创建出来就被显示,所以我在WM_CREATE消息相应下设置了一个SendMessage函数发送WM_PAINT消息妄图通过这种手段来达成目的,我知道我错了,所以想问为什么?

如果想在窗口一创建就让窗口过程接收WM_PAINT消息,应该在ShowWindow()函数后面,再调用UpdateWindow()函数,就可以像窗口过程发送一条WM_PAINT消息了。不必在WM_CREATE消息里再向自身发送WM_PAINT消息。

至于原因,有点麻烦,简单说说:
当你调用CreateWindow()创建窗口时,发送WM_CREATE消息给窗口过程。当窗口过程接收后,由于你在WM_CREATE消息里,又调用SendMessage()函数,该函数的特点是:直到发送的消息被窗口过程处理才返回!所以,虽然你发送的WM_PAINT消息被窗口过程接收并处理了,但这时你要注意,你还一直停留在CreateWindow()函数里!它一直没有返回!因此,它身后的ShowWindow()函数也一直没被调用!因此,这时窗口根本就还没出现!换句话说,你应该在窗口先出现之后,再发送WM_PAINT消息!而你那么做刚好反了,成了先发送WM_PAINT消息,再显示窗口——自然什么也看不到了——因为当你看到窗口时,那条消息已经被发送了。
所以,你应该先使用ShowWindow()函数让窗口出现,再发送WM_PAINT消息让图片显示出来!因此要这么做:
hwnd=CreateWindow(………………);
ShowWindow(……);//显示窗口
UpdateWindow(……);//发送WM_PAINT消息
这就可以达到效果了,试试吧!

高手。