VC SDK中关于WM_PAINT的新手问题
2013-08-16
展开全部
如果想在窗口一创建就让窗口过程接收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消息
这就可以达到效果了,试试吧!
至于原因,有点麻烦,简单说说:
当你调用CreateWindow()创建窗口时,发送WM_CREATE消息给窗口过程。当窗口过程接收后,由于你在WM_CREATE消息里,又调用SendMessage()函数,该函数的特点是:直到发送的消息被窗口过程处理才返回!所以,虽然你发送的WM_PAINT消息被窗口过程接收并处理了,但这时你要注意,你还一直停留在CreateWindow()函数里!它一直没有返回!因此,它身后的ShowWindow()函数也一直没被调用!因此,这时窗口根本就还没出现!换句话说,你应该在窗口先出现之后,再发送WM_PAINT消息!而你那么做刚好反了,成了先发送WM_PAINT消息,再显示窗口——自然什么也看不到了——因为当你看到窗口时,那条消息已经被发送了。
所以,你应该先使用ShowWindow()函数让窗口出现,再发送WM_PAINT消息让图片显示出来!因此要这么做:
hwnd=CreateWindow(…);
ShowWindow();//显示窗口
UpdateWindow…);//发送WM_PAINT消息
这就可以达到效果了,试试吧!
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询