2011-08-28 31 views
0

我開發一個Win32應用程序,其中應用程序啓動時的登錄窗口,然後在主窗口中打開無窗口出現在Visual C++程序

但是當我運行出現的程序沒有用戶登錄。

下面的代碼

HINSTANCE ghInstance; 
HWND hWnd; 

HWND hWndPopUp; 

LRESULT WINAPI PopUpWndProc(HWND hWnd2, UINT msg, WPARAM wParam, LPARAM lParam); 
LRESULT WINAPI MainWndProc(HWND hWnd , UINT msg , WPARAM wParam , LPARAM lParam); 

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

WNDCLASS wc; 
WNDCLASS wcPopUp; 
MSG msg; 
//HWND hWnd; 
BOOL bRet; 

if(!hPrevInstance) 
{ 

    wc.lpszClassName = L"MainAppClass" ; 

    wc.lpfnWndProc  = MainWndProc ; 

    wc.style   = CS_OWNDC | CS_VREDRAW | CS_HREDRAW ; 

    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.cbClsExtra  = 0 ; 

    wc.cbWndExtra  = 0 ; 

    RegisterClass(&wc) ; 

    wcPopUp.lpszClassName = L"PopUpAppClass" ; 

    wcPopUp.lpfnWndProc  = PopUpWndProc ; 

    wcPopUp.style   = CS_OWNDC | CS_VREDRAW | CS_HREDRAW ; 

    wcPopUp.hInstance  = hInstance ; 

    wcPopUp.hIcon   = LoadIcon(NULL, IDI_APPLICATION) ; 

    wcPopUp.hCursor   = LoadCursor(NULL, IDC_ARROW) ; 

    wcPopUp.hbrBackground = (HBRUSH)(COLOR_WINDOW+1) ; 

    wcPopUp.lpszMenuName  = NULL ; 

    wcPopUp.cbClsExtra  = 0 ; 

    wcPopUp.cbWndExtra  = 0 ; 

    RegisterClass(&wcPopUp); 

} 

ghInstance = hInstance; 

hWndPopUp = CreateWindowEx(WS_EX_CONTEXTHELP,       
         wcPopUp.lpszClassName,       
         L"Stock Ticker Login",       
         WS_OVERLAPPEDWINDOW, 
         0, 
         0, 
         CW_USEDEFAULT,       
         CW_USEDEFAULT,       
         NULL,       
         NULL,       
         hInstance,       
         NULL 
        ); 


bool show = ShowWindow(hWndPopUp, SW_MAXIMIZE ) ; 

UpdateWindow(hWndPopUp); 

hPE = NULL; 


/** While there is no WM_QUIT message in the Message Queue 
    Fetch Message from the queue and Dispatch it to WindowProc() 
**/ 
while((bRet = GetMessage(&msg, NULL, 0, 0)) != 0) 
{ 
    if (bRet == -1) 
    { 
     // handle the error and possibly exit 

     int nerror = GetLastError(); 

     MessageBox(hWnd,L"Window Error",L"Window error", MB_ICONERROR); 

     exit(1); 
    } 

    else { 

     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
    } 
} 

return (int)msg.wParam; 

} 

LRESULT WINAPI PopUpWndProc(HWND hWnd2, UINT msg, WPARAM wParam, LPARAM lParam){ 

HDC hdc; 
PAINTSTRUCT ps; 

RECT rc; 
GetClientRect(hWnd, &rc); 

int height = rc.bottom - rc.top; 
int width = rc.right -rc.left; 

switch(msg) 
{ 

    case WM_CREATE: 

     hWndStaticUsername = CreateWindowEx( 0 
              , L"static" 
              , L"Username" 
              , WS_CHILD | WS_VISIBLE 
              , rc.left + width/8 
              , rc.top + height/4 
              , 100 
              , 30 
              , hWnd2 
              , 0 
              , ghInstance 
              , 0 
            ); 

     hWndEditUsername = CreateWindowEx( WS_EX_CLIENTEDGE 
             , L"edit" 
             , L"" 
             , WS_CHILD | WS_VISIBLE 
             , rc.left + width/8 + 150 
             , rc.top + height/4 
             , 150 
             , 30 
             , hWnd2 
             , 0 
             , ghInstance 
             , 0 
           ); 
     hWndBtnLogin = CreateWindowEx( 0 
            , L"button" 
            , L"Login" 
            , WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON 
            , rc.left + width/8 
            , rc.top + height/4 + 80 
            , 50 
            , 30 
            , hWnd2 
            , 0 
            , ghInstance 
            , 0 
          ); 

     break; 

    case WM_COMMAND: 

     if(HIWORD(wParam)== BN_CLICKED && lParam==(LPARAM)hWndBtnLogin) 
     { 
      TCHAR* uname =new TCHAR; 
      Edit_GetText(hWndEditUsername, uname, 20); 

      if(wcscmp(uname,L"")==0) 

       return 0; 

      else 
      { 
       StartTicker(uname); 
       DestroyWindow(hWnd); 
      } 

     } 

     break; 

    case WM_DESTROY: 

     hWnd = CreateWindowEx(WS_EX_CONTEXTHELP,       
         L"MainAppClass",        
         L"Assignment 2",        
         WS_OVERLAPPEDWINDOW, 
         0, 
         0, 
         CW_USEDEFAULT,       
         CW_USEDEFAULT,       
         NULL,       
         NULL,       
         ghInstance,       
         NULL 
        ); 

     ShowWindow(hWnd, SW_MAXIMIZE) ; 

     UpdateWindow(hWnd); 

     break; 

    default: 

     return DefWindowProc(hWnd, msg, wParam, lParam); 
} 

return 0; 

} 

請幫我找到解決方案。

回答

3
return DefWindowProc(hWnd, msg, wParam, lParam); 

錯誤的窗口句柄,應該是hWnd2。

要提升這個職位超過了「調試我的代碼爲我的回答,有你就錯了,他們會得到你進入了很多麻煩的兩個基本方面:

  • 撿太草率好的變量名稱。你應該從來沒有有一個名爲「hWnd」的全局變量。這當然應該是hWndMain,你從來沒犯過這個錯誤。
  • 沒有錯誤檢查任何。如果你有任何問題,你很快就會發現CreateWindowEx()返回NULL,GetLastError()返回1400.沒有錯誤檢查,你只能看它錯誤,但從不診斷它。

使用原始winapi需要一絲不苟的注意這些小細節。考慮使用類庫來代替。

+0

謝謝您的深刻解答,您爲我節省了大量時間。是的,你是正確的Windows編程需要最大的關注,即使是一個小小的錯誤可能需要幾個小時才能解決。我剛開始使用win32 api,並且必須使用原始api,甚至不使用MFC。但是,我從這個錯誤中吸取了很多教訓。感謝您的幫助 –

+0

同樣的問題在GetClientRect(hWnd,&rc); –

1

怎麼來的,你在呼喚:

ShowWindow(hWnd, SW_MAXIMIZE) ; 
UpdateWindow(hWnd); 

後,才和範圍:case WM_DESTROY:

我會想象你打電話的ShowWindow在正常執行,而不是在distruction :)

+0

沒有那是不同的窗口,它應該在第一個窗口關閉後打開,但第一個(我在WINMAIN中創建並顯示的)沒有出現 –