我有一個在調試時工作正常的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
無濟於事。問題仍在繼續。
你是如何處理這個事件的? – chris
你是什麼意思?哪個事件? – Belloc
我的意思是按F5與Ctrl-F5。根據你的解釋,應該有一個F5的處理程序,它正在做某些事情來禁止F5,而處理程序的意思是'WM_KEYDOWN'或類似的消息。這也有助於瞭解它是如何「與F5合作」的。 – chris