-1

編集- 元々含まれていなかった m_hWndClient と WndProc を処理するコードを追加しました。簡潔にするために、私はそれが無関係であると誤って想定していました.

以下が実行された後

HWND m_hWndFrame;
HWND m_hWndClient; // added in Edit2
...
m_hWndFrame = CreateWindowEx(...)

m_hWndFrameは NULL でありGetLastError、「エラー 1400 - 無効なウィンドウ ハンドル」が表示されますが、これは正常に機能します。

HWND m_hWndFrame = NULL;
HWND m_hWndClient = NULL; // added in Edit2
...
m_hWndFrame = CreateWindowEx(...)

WndProcはこのように見えます:

LRESULT CALLBACK ProgramManager::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    CLIENTCREATESTRUCT  clientCreate;
    HINSTANCE hInstance = GetModuleHandle(NULL);
    RECT clientRect;

    switch (uMsg)
    {
    case WM_CREATE:           
        clientCreate.hWindowMenu  = NULL;
        clientCreate.idFirstChild = IDM_FIRSTCHILD ;
        GetClientRect(hwnd,&clientRect);

        s_instance->m_hWndClient = CreateWindowEx(WS_EX_CLIENTEDGE, TEXT ("MDICLIENT"), NULL,
            WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, 0, 0, clientRect.right,
            clientRect.bottom, hwnd, (HMENU)ID_MDI_CLIENT, hInstance, 
            (LPVOID)&clientCreate); 

        return 0 ;

    case WM_CLOSE:
        DestroyWindow(hwnd);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    }

    return DefFrameProc(hwnd,m_hWndClient,uMsg,wParam,lParam);
}

私のプロジェクトは(多くの髪を引き裂いた後)動作するようになりましたが、戻り値を保持するためだけに使用される変数の初期化が重要である理由がわかりません。

明らかに、初期化せずに変数が NULL または 0 であると想定してから、コンテンツ (たとえばif (!m_unitialisedVariable)) を使用またはテストすると、惨事に終わることになりますが、この場合、なぜそれが問題になるのでしょうか? 「CreateWindowEx」を呼び出す前に特に何かを含める必要はありませんm_hWndFrame(少なくとも VS2010 のヘルプによると) では、なぜ「CreateWindowEx」の結果に影響するのでしょうか?

4

1 に答える 1