2012-06-03 66 views
0

我有一個在調試時工作正常的Win32程序(桌面應用程序)(由F5開始),但它不會繪製窗口,也不會繪製窗口運行時不帶調試的標題(Ctrl + F5)。這怎麼可能?我正在使用VS 2010.當調試器沒有運行時,我的窗口沒有正確繪製

編輯:在Release版本中,代碼可以正常工作而不需要調試,但它不在調試器中,這與Debug版本中發生的情況完全相反。

新編輯:

多小時這方面的工作後,我發現,這個問題在某種程度上是關係到其復位()成員函數的靜態的std :: auto_ptr的對象的初始化。

請記住我上面所說的,窗口標題沒有顯示在應用程序窗口上,並且在WM_CREATE消息處理結束時使用SetWindowText(hwnd,L「Any Title」)設置此標題。然後我開始在WM_CREATE中向後移動這個函數調用,以確切地查看它未能展示窗口標題的位置。

class A{}; 

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, UINT wParam, LONG lParam) 
{ 
    static std::auto_ptr<A> a; 
    switch (message) 
    { 
     case WM_CREATE: 
     { 
      ... 
      a.reset(new A); 
      SetWindowText(hwnd, L"Any Title"); 
      ... 
     } 
     break; 

     case WM_PAINT: 

     ... 

     break; 

     case WM_DESTROY: 

     PostQuitMessage(0); 
     break; 

     default: 

     return DefWindowProc(hwnd, message, wParam, lParam); 
    } 
    return 0; 
} 

這意味着,如果我的變量a的初始化之前調用SetWindowText函數(),窗口的標題是:和如下面的僞代碼的靜態的std :: auto_ptr的對象的第一個初始化後發生正確顯示,雖然它不顯示任何文本在客戶區域,當窗口被繪。我知道窗戶正在被塗漆,因爲我在WM_PAINT中插入了MessageBeep(-1),我可以聽到聲音。

有趣的是,WM_PAINT中打印的所有東西都來自class A分配在堆上的對象,其地址被封裝在std::auto_ptr對象中。

當然,所有這些都是在執行代碼時發生的,按Ctrl + F5。當程序啓動時,F5一切工作正常。

新編輯:

我改變了std::auto_ptr變量unique_ptr無濟於事。問題仍在繼續。

+1

你是如何處理這個事件的? – chris

+0

你是什麼意思?哪個事件? – Belloc

+0

我的意思是按F5與Ctrl-F5。根據你的解釋,應該有一個F5的處理程序,它正在做某些事情來禁止F5,而處理程序的意思是'WM_KEYDOWN'或類似的消息。這也有助於瞭解它是如何「與F5合作」的。 – chris

回答

0

這可能是一個時間問題(可能是什麼,但無法解釋的行爲往往不是某種競爭條件)。在相關事件/覆蓋上添加調試跟蹤以查看發生了什麼。

+0

我只有一個執行線程,我沒有在這個程序中使用任何定時器,我注意到一件事情:在paint程序中插入MessageBeep()後,我可以聽到聲音,這意味着窗口是被屏蔽,但字符不顯示 – Belloc

+0

另一個奇怪的是:我在WM_CREATE中爲SetWindowTitle(hwnd,L「Any Title」)創建了一個窗口的新標題,但標題沒有顯示出來。這怎麼可能發生? – Belloc

+0

我打算說SetWindowText(hwnd,L「Any Title」),而不是SetWindowTitle(hwnd,L「任何標題」) – Belloc