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