導致CreateWindow創建窗口失敗的一種原因

導語:在封裝一個基本的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來處理,並返回其處理後的結果。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章