2014-10-02 1 views
-4

CreateWindowEx 메서드는 항상 null을 반환합니다.CreateWindowEx가 null을 반환하면 : 창을 만들 수 없습니다.

뭐가 잘못 됐는지 모르겠지만 창을 만들 수 없습니다.

내 창 프로 시저가 다른 클래스에서 정의 된 정적 메서드 인 BaseWndApplication :: WndProc이므로 문제가 발생하는지 확실하지 않습니다. 내 WNDCLASSEX 구조체를 성공적으로 등록 할 수 있기 때문에 확실합니다.

안녕하세요!

int WINAPI WinMain(
    HINSTANCE hInstance, 
    HINSTANCE hPrevInstance, 
    LPSTR lpCmdLine , 
    int nCmdShow 
    ) 
{ 

const char * WINDOW_CLASS_NAME = "D2DAppClass"; 
HRESULT hr; 
{ 
    // Register the window class. 
    WNDCLASSEX wcex = { sizeof(WNDCLASSEX) }; 
    wcex.style = CS_HREDRAW | CS_VREDRAW; 
    wcex.lpfnWndProc = BaseWndApplication::WndProc; 
    wcex.cbClsExtra = 0; 
    wcex.cbWndExtra = 0; 
    wcex.hInstance = hInstance; 
    wcex.hbrBackground = NULL; 
    wcex.lpszMenuName = NULL; 
    wcex.hCursor = LoadCursor(NULL, IDI_APPLICATION); 
    wcex.lpszClassName = WINDOW_CLASS_NAME; 

    if (!RegisterClassEx(&wcex)) 
     return E_FAIL; 

    HWND m_hWnd = CreateWindowEx(WS_EX_CLIENTEDGE, 
     WINDOW_CLASS_NAME, 
     "Direct2D Demo App", 
     WS_OVERLAPPEDWINDOW, 
     CW_USEDEFAULT, 
     CW_USEDEFAULT, 
     static_cast<UINT>(ceil(640.f)), 
     static_cast<UINT>(ceil(480.f)), 
     NULL, 
     NULL, 
     hInstance, 
     NULL 
     ); 

    hr = m_hWnd ? S_OK : E_FAIL; 
    if (SUCCEEDED(hr)) 
    { 
     ShowWindow(m_hWnd, SW_SHOWNORMAL); 
     UpdateWindow(m_hWnd); 
    } 
} 

return 0; 

}

+3

'GetLastError()가'그것에 대해 무슨 말을해야합니까? 일반적인 실패 원인은 [documentation] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms632680%28v=vs.85%29.aspx)를 참조하십시오. –

+0

그것은 "작업 완료 successflly"라고 생각하는 오류 코드 0을 반환합니다. – revolutionary

+0

static_cast (ceil (640.f))'의 목적은 무엇입니까? 왜 '640'이 아닌가? 스텁 WndProc과'ceil' 넌센스가없는 코드는 잘 작동합니다. –

답변

2

그것은 내 콜백 방식에 문제가 있었다. 0을 반환하도록 설정되었습니다. 다음과 같이

나는 그것을 변경하고 일했다 :

static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    return DefWindowProc(hWnd, message, wParam, lParam); 
} 
+3

특히 ['WM_NCCREATE'] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms632635.aspx) 메시지에 대해'0' /'FALSE'를 반환하면 윈도우 생성이 종료됩니다. 결국'CreateWindow [Ex]'호출은'NULL' 핸들을 리턴 할 것입니다. 아무 것도 실제로 기록되지 않았기 때문에 오류도 기록되지 않습니다. – IInspectable

+1

나는 사람들이 질문을 투표하는 이유를 모르겠다. 나는 똑같은 문제를 겪고 있었고, C++을 배우기 때문에 같은 문제에 대한 해결책을 찾기가 어려웠다. 당신의 대답은 제가 필요로하는 바로 그 수정이었고, @ IInspectable은 그 이유를 설명했습니다. 지금 나는 그것을 위해 조금 나아졌다! 감사합니다. –

+0

@AaronMurray : OP가 요청한 정보를 제공하기를 거부했기 때문에이 질문에 대한 찬성 투표가있었습니다. 문제는 창 프로 시저의 버그로 인해 발생하므로 해당 창 프로 시저를 질문에 포함시켜야합니다. – IInspectable

관련 문제