2016-03-29 168 views
0

我正在使用directX應用程序,我試圖設置一個窗口。但問題是我的窗口沒有顯示出來,而是顯示了我在窗口無法創建時彈出的窗口。我多次製作窗戶,現在不能工作。在我的例程中,唯一改變的是我將應用程序切換到64位應用程序而不是32位應用程序。我有一臺64位電腦,它應該工作。Win32窗口不顯示

的main.cpp

#include "Render\window.h" 

int CALLBACK WinMain(HINSTANCE appInstance, HINSTANCE prevInstance, LPSTR cmdLine, int cmdCount) 
{ 
    Window window("Program", 800, 600); 

    MSG msg = { 0 }; 
    while (true) 
    { 
     if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) 
     { 
      TranslateMessage(&msg); 
      DispatchMessage(&msg); 

      if (msg.message == WM_QUIT) break; 
     } 
    } 

    return 0; 
} 

在window.h

#pragma once 

#include <Windows.h> 

class Window 
{ 
private: 
    const char* const m_Title; 
    const int m_Width; 
    const int m_Height; 
    HWND m_Handler; 
public: 
    Window(const char* title, int width, int height); 

    inline HWND GetHandler() const { return m_Handler; } 
private: 
    void Init(); 
}; 

window.cpp

#include "window.h" 

LRESULT CALLBACK WinProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) 
{ 
    if (msg == WM_DESTROY || msg == WM_CLOSE) 
    { 
     PostQuitMessage(0); 
     return 0; 
    } 
    return DefWindowProc(hwnd, msg, wparam, lparam); 
} 

Window::Window(const char* title, int width, int height) 
    : m_Title(title), m_Width(width), m_Height(height) 
{ 
    Init(); 
} 

void Window::Init() 
{ 
    WNDCLASS windowClass; 
    windowClass.style = CS_OWNDC; 
    windowClass.lpfnWndProc = WinProc; 
    windowClass.hCursor = LoadCursor(nullptr, IDC_ARROW); 
    windowClass.lpszClassName = L"MainWindow"; 
    RegisterClass(&windowClass); 

    m_Handler = CreateWindow(L"MainWindow", (LPCWSTR)m_Title, WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE, 100, 100, m_Width, m_Height, nullptr, nullptr, nullptr, nullptr); 
    if (m_Handler == 0) 
    { 
     MessageBox(nullptr, L"Problem with creating window!", L"Error", MB_OK); 
     exit(0); 
    } 
} 
+1

你也知道這是一個「處理」而不是「處理程序」? –

回答

4

WNDCLASS結構包含未初始化的數據。你忽略了編譯器警告嗎?致電RegisterClass時,您不會檢查錯誤。很可能RegisterClass失敗,你不管。

確保WNDCLASS結構被初始化:

WNDCLASS windowClass = { 0 }; 

並檢查錯誤,只要你調用Win32 API函數。在這裏,檢查RegisterClass返回的值。文件告訴你它的含義。

爲了您的功勞,您至少檢查了由CreateWindow返回的值。但文件告訴你,如果發生故障,請致電GetLastError找出呼叫失敗的原因。你沒有那樣做?我懷疑你最大的問題是你沒有詳細閱讀文檔。

當您撥打CreateWindow時,您試圖通過m_Title作爲窗口文本參數。編譯器反對類型不匹配錯誤。你抑制這個錯誤與此投:

(LPCWSTR)m_Title 

現在,m_Titleconst char*。它不是const wchar_t*。沒有數量的鑄造使它如此。不要丟棄類型不匹配錯誤。通過正確的類型。

要麼撥打電話CreateWindowA,要麼通過m_Title,或將m_Title更改爲const wchar_t*類型。如果你選擇後者,你需要傳遞一個寬的文字L"Program"而不是"Program"

+0

大聲笑,初學者錯誤我不知道爲什麼沒有錯誤或警告顯示。 – CPlusPlusProgrammer