2012-08-03 27 views
-1

我嘗試做我的WinMain出了問題。我在Windows C++編程中完全禁用,我嘗試學習。我遵循tutoriel來幫助我。但看起來不行! 這裏是我的代碼..我開始學習WINAPI和C++,但有什麼不對嗎?

#include <Windows.h> 

LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); 

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

    HWND hWnd; 
    WNDCLASSEX wc; 

    ZeroMemory(&wc, sizeof(WNDCLASSEX)); 

    wc.cbSize = sizeof(WNDCLASSEX); 
    wc.style = CS_HREDRAW | CS_VREDRAW; 
    wc.lpfnWndProc = WindowProc; 
    wc.hInstance = hInstance; 
    wc.hCursor = LoadCursor(NULL, IDC_ARROW); 
    wc.hbrBackground = (HBRUSH)COLOR_WINDOW; 
    wc.lpszClassName = "WindowClass1"; 

    RegisterClassEx(&wc); 

    hWnd = CreateWindowEx(NULL, "WindowClass1", "Our First Windowed app", WS_OVERLAPPEDWINDOW, 300, 300, 500, 400, NULL, NULL, hInstance, NULL); 

    ShowWindow(hWnd, SW_SHOW); 

    MSG msg; 

    while(GetMessage(&msg, NULL, 0, 0)) 
    { 
     TranslateMessage(&msg); 

     DispatchMessage(&msg); 
    } 

    return msg.wParam; 


    //return 0; 
} 

LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 

    switch(message) 
    { 
    case WM_DESTROY: 
     { 
      PostQuitMessage(0); 
      return 0; 
     } break; 

    } 
} 

當我編譯,我沒有錯誤,但是當我運行應用程序時,我在我的任務欄,僅此而已只有應用程序圖標。在任務管理器中,我看到了2個應用程序實例。

什麼和我在哪裏錯了?

非常感謝您的幫助!

+0

我會說,當我開始學習WinAPI時,我發現它絕對是非常挑剔的。除非每個細節都完全正確,否則代碼不起作用,並且沒有有意義的錯誤消息。 – 2012-08-03 19:08:34

+2

正常的操作過程是調試。跟蹤您的程序,查看API函數返回的值。 RegisterClassEx()是成功還是失敗?是'CreateWindowEx()'?你的窗口過程是否被調用?將來,在StackOverflow上詢問之前,嘗試調試自己。 – 2012-08-03 19:10:54

+0

塞瓦,就像我說的。我開始學習。對不起,如果它不是我們學習時發佈問題的地方..我已經嘗試自行調試,但我的知識是有限的。所以,抱歉不要再發佈一個問題! :D – neimad 2012-08-03 19:16:19

回答

7

在你的窗口過程,DefWindowProc永遠不會被調用,因此你不處理都沒有被處理的消息。這包括讓您的窗口出現並像普通窗口一樣行事的必要條件。一個好地方,這是在default情況下,交換機的,具有該消息的必要的返回值所有其他情況:

switch (message) { 
    case SOME_MESSAGE: 
     //... 
     return 0; 

    case SOME_OTHER_MESSAGE: 
     //... 
     return 1; //not all messages should return 0; check each one's docs 

    default: //all unhandled messages 
     return DefWindowProc(hWnd, message, wParam, lParam); 
} 

調高你的警告級別。你應該得到以下(海合會至少,我敢肯定,MSVC有類似的東西):

警告:控制到達非void函數結束[-Wreturn型]

+0

exacly ..大聲笑我的教程從來沒有告訴我有關defwindowproc ..哇!我需要改變教程!呵呵 – neimad 2012-08-03 19:13:52

+0

@neimad,http://winprog.org/tutorial爲我工作。我不確定在積分榜上的位置,但這是我個人開始的地方。 – chris 2012-08-03 19:15:22

+0

這是一個PDF的朋友給我!它假設得到我們需要用C++ WinAPI開始的所有東西!是的!嘿嘿 – neimad 2012-08-03 19:19:08

4

你在WindowProc中遺漏的返回值。不要忽視編譯器的警告...

return ::DefWindowProc(hWnd, message, wParam, lParam); 
+0

謝謝..就像我說的..我的教程糟透了..從來沒有談過這個回報..是的,現在一切正常!再次感謝! – neimad 2012-08-03 19:14:24