Windows GUI WM_PAINT消息一直发送的问题

来源:互联网 发布:黑贞手办淘宝 编辑:程序博客网 时间:2024/05/29 19:47
    昨天折腾了一天,把Direct 11的初始化,给捣腾了一遍。本来一切看似正常,结果在用D3D设备描述表 清空背景(用的绿色),并用交换链把后台缓冲区和前台缓冲区对调以后,仍然显示的是,窗口类的背景颜色。于是,好好看了一下是不是,初始化或者绘制方面出了什么问题。自己比较了一下,发现并没有问题,和书上的程序比较了一下,模式也是基本一样的。但是书上并没出问题,无奈只能单步调试找原因了。

  调试以后,发现了一个非常奇怪的地方。

while(msg.message != WM_QUIT){// If there are Window messages then process them.if(PeekMessage( &msg, 0, 0, 0, PM_REMOVE )){TranslateMessage( &msg );DispatchMessage( &msg );}// Otherwise, do animation/game stuff.else{if( KEYDOWN(VK_ESCAPE) ){SendMessage(g_hWnd,WM_CLOSE,0,0);break;}DrawScreen();}}


       这是,程序的主循环,单步调试的时候,每次循环都进入if中,而不会进入else中。 这让我相当的想不明白,按理说,需要每层循环中,都要有消息处理才会一直进入if中,那这个消息究竟是什么那? 通常情况下,系统不可能一直发送消息的吧? 后来,看到msg的消息ID是 0x000f去查了一下。结果发现,竟然是WM_PAINT,也就是说,这个程序不断地发送WM_PAINT消息,然后再不断地处理。后来查了一下,BAIDU才发现,原来被自己薄弱的WIN32基础给坑了。

罪魁祸首,是WM_PAINT的处理代码:

case WM_PAINT:    return;  


      本来是不需要用到WM_PAINT的,但是,不想让WndProc空着,于是塞了个WM_PAINT和WM_DESTORY消息的处理进去。为了图方便,WM_PAINT直接就写成了上面的形式,结果就把自己坑了。果然,写程序不能做这种表面功夫啊。


原创粉丝点击