2013-06-27 75 views
0

我正在製作一個井字棋遊戲,作爲我第一次使用win32的應用程序,並且它相當不錯。我已經完成了所有工作,直到第一輪結束,每個棋盤上的每個方塊都是一個按鈕,當點擊成爲一個X或O時,它就是基於它的輪換。當一名球員贏得比賽時,我在井字遊戲板下方出現了一個小窗口,顯示「玩家1贏」。我還在屏幕底部製作了一個「新遊戲」按鈕,點擊後,所有X和O的棋子都被從棋盤上清除,遊戲重新開始。完成遊戲後重置屏幕win32 C++

所以,這裏是我的問題,當我點擊「新遊戲」按鈕,我不能讓窗口說「玩家1贏」離開一切,它只是呆在那裏。我希望它消失。這裏是我的一些代碼:

case WM_COMMAND: 
    wmId = LOWORD(wParam); 
    wmEvent = HIWORD(wParam); 

    // Parse the menu selections: 
    switch (wmId) 
    { 
    case IDM_LOC1: 
     click1++; 
     if(click1>1) 
     {break;} 
     else{ 
      playerobject++; 
     if(playerobject==1|playerobject==3|playerobject==5|playerobject==7|playerobject==9) 
     { SetDlgItemText(hWnd, IDM_LOC1, "X");     
      loc1 = 1; } 
     else 
     { SetDlgItemText(hWnd, IDM_LOC1, "O");     
      loc1 = 2; } 
     winner = determinewinner(); 
     if(winner==1) 
     {    
      hwndb = CreateWindowEx(WS_EX_OVERLAPPEDWINDOW,TEXT("STATIC"),TEXT("PLAYER 1 WINS!"),WS_CHILD|SS_CENTER|WS_VISIBLE,20,210,210,18,hWnd,HMENU(NULL),GetModuleHandle(NULL),NULL); 
     } 
     else if (winner==2) 
     { 
      hwndb = CreateWindowEx(WS_EX_OVERLAPPEDWINDOW,TEXT("STATIC"),TEXT("PLAYER 2 WINS!"),WS_CHILD|SS_CENTER|WS_VISIBLE,20,210,210,18,hWnd,HMENU(NULL),GetModuleHandle(NULL),NULL); 
     } 
     break;} 

這是處理邏輯部分(我知道它非常凌亂,它是我第一次去它)。所以你可以看到,當「判斷者」函數返回1時,窗口顯示說明玩家1已經贏了。 現在,這裏是代碼處理「新遊戲」按鈕:

case IDM_RESTART: 
     SetDlgItemText(hWnd, IDM_LOC1, ""); 
     SetDlgItemText(hWnd, IDM_LOC2, ""); 
     SetDlgItemText(hWnd, IDM_LOC3, ""); 
     SetDlgItemText(hWnd, IDM_LOC4, ""); 
     SetDlgItemText(hWnd, IDM_LOC5, ""); 
     SetDlgItemText(hWnd, IDM_LOC6, ""); 
     SetDlgItemText(hWnd, IDM_LOC7, ""); 
     SetDlgItemText(hWnd, IDM_LOC8, ""); 
     SetDlgItemText(hWnd, IDM_LOC9, ""); 
     playerobject = 0; 
     click1=0; 
     click2=0; 
     click3=0; 
     click4=0; 
     click5=0; 
     click6=0; 
     click7=0; 
     click8=0; 
     click9=0; 
     loc1=0,loc2=0,loc3=0,loc4=0,loc5=0,loc6=0,loc7=0,loc8=0,loc9=0; 
    DestroyWindow(hwndb); 
     break; 

現在我認爲這個問題是switch語句,因爲他們兩人都是WndProc中switch語句(該WM_COMMAND部分)下只是個案。我嘗試將hwndb窗口移到winmain函數中,然後在switch語句中執行ShowWindow函數,但這當然不起作用。

我怎樣才能讓窗戶關閉?謝謝!

編輯 *所以,我忘了說,當我運行它,它新的遊戲按鈕被點擊後,纔會很好,它說,hwndb尚未初始化,這當然是對特定真switch語句的一部分,所以我明顯做錯了。我該如何做對嗎?

+2

hwndb是一個全局變量嗎? –

+0

不,它不是一個全局變量,它只在WndProc函數中聲明,但是當我將它作爲一個全局變量時,它完美地工作,謝謝! – Riley

回答

1

由於的「hwndb尚未初始化」誤差,我會說你沒有宣稱:

HWND hwndb; //Global variable 

然而,如果你做這一個全局變量這個錯誤,因爲一個電話來存在的到IDM_LOC1之前的IDM_RESTART。這也意味着,如果你雙擊刷新按鈕,DestroyWindow函數將返回false。

+0

他在問題中說,它確實運行,所以顯然這個變量是在某個地方聲明的。 – HerrJoebob

+0

@HerrJoebob他說,它會一直運行,直到他按下游戲屏幕上的新遊戲按鈕時,它會引發此錯誤。他問他如何關閉「標籤」--Window,而不會出現此錯誤。 –

+1

因此,我已經在WndProc函數下的所有開關語句的頂部聲明瞭變量,我認爲這將足以處理它,但是當我將hwndb切換到全局變量時,它開始正常工作。謝謝! – Riley