完成游戏win32 c ++后重置屏幕

时间:2013-06-27 20:38:38

标签: winapi tic-tac-toe

我正在制作一个Tic-Tac-Toe游戏作为我的第一个win32应用程序,它的表现相当不错。我已经完成了所有工作,直到第一轮完成,tic tac toe board上的每个方块都是一个按钮,当点击它时会变成一个X或一个O,基于它转动它。当一名玩家赢得比赛时,我在一个tic tac toe board下面显示了一个小窗口,上面写着“玩家1胜利”。我还在屏幕底部制作了一个“新游戏”按钮,当点击时,所有的X和O都从棋盘上清除,游戏重新开始。

所以这就是我的问题,当我点击“新游戏”按钮时,我无法让“PLAYER 1 WINS”的窗口像其他一切一样消失,它只是停留在那里。我希望它消失。以下是我的一些代码:

   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;}

那是处理逻辑部分(我知道它非常混乱,它是我的第一个去)。所以你可以看到当“determinwinner”函数返回1时,窗口显示说明玩家1赢了。 现在这里是处理“NEW GAME”按钮的代码:

    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语句的特定部分当然是正确的,所以我显然做错了。我该怎么办呢?

1 个答案:

答案 0 :(得分:1)

由于“hwndb尚未初始化” - 我会说你还没有声明:

HWND hwndb; //Global variable

但是,如果您已将此设为全局变量,则可能由于在IDM_LOC1之前调用IDM_RESTART而发生此错误。这也意味着如果您双击刷新按钮,DestroyWindow函数将返回false。