導語:在封裝一個基本的Frame顯示窗口時遇到CreateWindow函數調用成功,但是窗口總是不顯示。
CreateWindow返回NULL,GetLastError()返回0
經過網上搜集資料和單步調試發現問題
在程序調用CreateWindow函數之前會首先調用WndProc具體原因暫時不詳,(我的程序這裏好像是會調用三次WndProc,可能是系統發送的消息),然後會調用CreateWindow,所以當前幾次調用WndProc時需要返回TURE纔會成功創建window。
這是之前的WndProc函數代碼
LRESULT CALLBACK MYFrame::__WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
MYFrame *pObj = ( MYFrame *)::GetWindowLong( hWnd, GWL_USERDATA);
PAINTSTRUCT ps;
HDC hdc;
long xPos;
long yPos;
switch( uMsg )
{
case WM_PAINT:
hdc = ::BeginPaint(hWnd, &ps);
::EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
::PostQuitMessage(0);
break;
default:
::DefWindowProc(hWnd, uMsg, wParam, lParam);
}
return 0;
}
將
default:
::DefWindowProc(hWnd, uMsg, wParam, lParam);
改爲
default:
return ::DefWindowProc(hWnd, uMsg, wParam, lParam);
即可,修改後成功創建window的代碼爲
LRESULT CALLBACK MYFrame::__WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
MYFrame *pObj = ( MYFrame *)::GetWindowLong( hWnd, GWL_USERDATA);
PAINTSTRUCT ps;
HDC hdc;
long xPos;
long yPos;
switch( uMsg )
{
case WM_PAINT:
hdc = ::BeginPaint(hWnd, &ps);
::EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
::PostQuitMessage(0);
break;
default:
return ::DefWindowProc(hWnd, uMsg, wParam, lParam);
}
return 0;
}
將默認的消息傳給DefWindowProc來處理,並返回其處理後的結果。