天天看點

Windows GUI WM_PAINT消息一直發送的問題

    昨天折騰了一天,把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直接就寫成了上面的形式,結果就把自己坑了。果然,寫程式不能做這種表面功夫啊。

繼續閱讀