2012-10-17 28 views
2

我有這樣的代碼,是我創造,將有多個窗口添加代碼在WNDCLASSEX WndProc中回調打破代碼

bool UISystem::HandleMessage(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) 
{ 
    UIWindow* target = NULL; 
    for(vector<UIWindow*>::iterator it = windowList.begin(); it < windowList.end(); it++) 
    { 
     if((*it)->windowHandle == hwnd) 
     { 
      target = *it; 
      break; 
     } 
    } 

    if(target == NULL) 
    { return false; } 

    switch(msg) 
    { 
    case WM_DESTROY: 

     return true; 

    case WM_PAINT: 

     return true; 

    default: 
     return false; 
    } 
} 

LRESULT WINAPI UISystem::WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) 
{ 
    /*if(UISYSTEM->HandleMessage(hwnd, msg, wParam, lParam)) 
    { 
    }*/ 
    return DefWindowProc(hwnd, msg, wParam, lParam); 
} 

當該代碼被執行,因爲它是我的用戶界面系統的一部分,包括UISystem :: WndProc中的註釋塊,但是一個窗口顯示正確,但是,如果我在UISystem :: WndProc中取消註釋該塊,那麼從CreateWindow返回一個無效句柄,任何幫助將不勝感激,因爲這真是令我困惑,我試過了調用DefWindowProc之前,我做任何其他代碼在UISystem :: WndProc但我所有的嘗試失敗

這是一個UIWindow的構造:

UIWindow::UIWindow(int x, int y, int width, int height, string & text) 
{ 

    int frameWidth = GetSystemMetrics(SM_CXSIZEFRAME); 
    int frameHeight = GetSystemMetrics(SM_CYSIZEFRAME); 
    int menuHeight = GetSystemMetrics(SM_CYMENU); 
    int windowXPos = (GetSystemMetrics(SM_CXSCREEN) - width)/2; 
    int windowYPos = (GetSystemMetrics(SM_CYSCREEN) - height)/2; 
    int windowWidth = width + frameWidth * 2; 
    int windowHeight = height + frameHeight * 2 + menuHeight; 

    bounds.X = x; 
    bounds.Y = y; 
    bounds.Width = width; 
    bounds.Height = height; 
    title = text; 

    MSG msg; 

    WNDCLASSEX wc = {sizeof(WNDCLASSEX), CS_VREDRAW|CS_HREDRAW|CS_OWNDC, 
     &UISystem::WndProc, 0, 0, hInstance, NULL, NULL, (HBRUSH)(COLOR_WINDOW + 1), 
     NULL, "AurousWindow", NULL}; 

    RegisterClassEx(&wc); 


    windowHandle = CreateWindow("AurousWindow", title.c_str(), WS_OVERLAPPEDWINDOW, windowXPos, windowYPos, windowWidth, windowHeight, NULL, NULL, hInstance, NULL); 
    SetWindowRgn(windowHandle, CreateRectRgn(0, 0, width, height), TRUE); 
    ShowWindow(windowHandle, nShow); 
    UpdateWindow(windowHandle); 

    //RECT rec = {0, 0, width, height}; 

    while(GetMessage(&msg, NULL, 0, 0)) 
    { 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
    } 
} 
+3

作爲一個附註,與其維護所有窗口的全局列表,您可以通過使用GWL_USERDATA調用SetWindowLong將用戶數據存儲在窗口中:http://msdn.microsoft.com/zh-cn/library/windows/桌面/ ms633591(v = vs.85).aspx – avakar

回答

1

不知道這是否是問題的根源,但有一件事你應該修改是取消:

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

來自:

UIWindow::UIWindow(int x, int y, int width, int height, string & text) 

這而只要窗口存在就會循環,並會阻止UIWindow被正確構建。這個對象(UIWindow)實際上是在裏面訪問的:UISystem :: HandleMessage,但是由於它的構造函數永遠不會結束,所以它可能是NULL或者處於未定義狀態。

+0

luskan,那麼如何在不關閉整個應用程序的情況下爲每個窗口保留消息泵? – user1754209

+1

請在此處查看:http://msdn.microsoft.com/en-us/library/windows/desktop/ms644936%28v=vs.85%29.aspx,每個線程應該有一個消息循環,只需將其放入你main()函數,它會好的。初始化在此循環之前執行。 – marcinj

+0

我想我可能會意外刪除您的評論luskan,對不起! 這是怎麼回事? http://pastebin.com/K9sFnJ3E – user1754209