VC SDK中关于WM_PAINT的新手问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VC SDK中关于WM_PAINT的新手问题相关的知识,希望对你有一定的参考价值。

我只有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消息
这就可以达到效果了,试试吧!
参考技术A 高手。

以上是关于VC SDK中关于WM_PAINT的新手问题的主要内容,如果未能解决你的问题,请参考以下文章

工作中关于合作开发的一些思考

vc里面拦截WM_PAINT,并在钩子过程函数里面增自绘的SetWindowsHookEx的第一个参数指定为哪一个?

Unity中关于AnimationEvent.Time的问题

关于CEdit控件的透明(重绘)

在TC和VC中关于字符处理的区别!这里我们把字符型的数字转换成整形数字!

iOS 5 SDK 中关于使用不兼容的指针类型初始化的新编译器警告