2013-07-23 119 views
2

我是新來學習使用C++創建一個Win32程序,但是,當我按照一本書的指示,試圖製作我的第一個程序,我遇到以下問題需要幫助的基本Windows的C

#include <windows.h> 

const char g_szClassName[] = "myWindowClass"; 

//Step 4: the Window Procedure 
LRESULT CALLBACK WndProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) 
{ 
switch(msg) 
{ 
    case WM_CLOSE:DestroyWindow(hwnd); break; 
    case WM_DESTROY:PostQuitMessage(0); break; 
    deafult: 
     return DefWindowProc(hwnd, msg, wParam, lParam); 
} 
return 0; 
} 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) 
{ 
WNDCLASSEX wc; 
HWND hwnd; 
MSG Msg; 

//Step 1: Registering the Window Class 
wc.cbSize  =sizeof(WNDCLASSEX); 
wc.style  =0; 
wc.lpfnWndProc =WndProc; 
wc.cbClsExtra =0; 
wc.cbWndExtra =0; 
wc.hInstance =hInstance; 
wc.hIcon  =LoadIcon(NULL, IDI_APPLICATION); 
wc.hCursor  =LoadCursor(NULL, IDC_ARROW); 
wc.hbrBackground=(HBRUSH)(COLOR_WINDOW+1); 
wc.lpszMenuName =NULL; 
wc.lpszClassName=g_szClassName; 
wc.hIconSm  =LoadIcon(NULL, IDI_APPLICATION); 

if(!RegisterClassEx(&wc)) 
{ 
    MessageBox(NULL, "Window Registration Failed!", "Error!", MB_ICONEXCLAMATION | MB_OK); 
    return 0; 
} 

//Step 2: Creating the Window 
hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, g_szClassName, "The title of my window", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 240, 120, NULL, NULL, hInstance, NULL); 
if(hwnd == NULL) 
{ 
    MessageBox(NULL, "Window Creation Failed!", "Error!", MB_ICONEXCLAMATION | MB_OK); 
    return 0; 
} 

ShowWindow(hwnd, nCmdShow); 
UpdateWindow(hwnd); 

//Step 3: The Message Loop 
while(GetMessage(&Msg, NULL, 0, 0) > 0) 
{ 
    TranslateMessage(&Msg); 
    DispatchMessage(&Msg); 
} 
return Msg.wParam; 
} 

,但它一直返回「窗口創建失敗!」,我不知道它有什麼問題,並且我做了很多校對。請幫幫我!

+2

查看'CreateWindowEx'的文檔,如果調用失敗,您會看到一個有用的提示,使用'GetLastError'獲取更多信息。習慣使用該功能並告訴我們錯誤代碼。 – chris

回答

11
case WM_CLOSE:DestroyWindow(hwnd); break; 
case WM_DESTROY:PostQuitMessage(0); break; 
deafult: 
    return DefWindowProc(hwnd, msg, wParam, lParam); 

這可能是很難看到,這是殘酷的,它編譯,因爲它是一個正常的標籤(雖然我從-Wunused-label警告),但你拼錯default。這導致WM_NCCREATE不被處理,這會導致您的窗口創建失敗。

值得一提的是,您的處理方式與DefWindowProc相同,只需撥打DestroyWindow即可處理WM_CLOSE。你可以忽略這種情況,當你的窗戶關閉時,仍然會發生同樣的事情。

+1

+1:真棒調試,我敢肯定每個人都跳過這個功能。 – dans3itz

+0

但WM_CREATE甚至不會調用,因爲WM_NCCREATE將返回0(FALSE),並且CreateWindowEx將失敗。 (對於WM_CREATE被接受返回0 - 對於失敗的WM_CREATE必須返回-1)。 – user1837009

+0

+1令人印象深刻。它需要多大的視線才能找到這樣的錯誤.. :) – lulyon