0

我正在制作一款井字游戏作为我的第一个 win32 应用程序,并且进展顺利。在第一轮结束之前,我已经完成了所有工作,井字游戏板上的每个方块都是一个按钮,当点击它时,它会根据轮到谁变成 X 或 O。当一个玩家赢得比赛时,我在井字棋盘下方显示了一个小窗口,上面写着“玩家 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;}

那是处理逻辑部分(我知道它很混乱,这是我第一次尝试)。因此您可以看到,当“determinewinner”函数返回 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 函数,但这当然也不起作用。

我怎样才能关闭窗口?谢谢!

编辑*所以我忘了说当我运行它时,它在单击 NEW GAME 按钮之前一直很好,它说 hwndb 尚未初始化,这对于 switch 语句的特定部分当然是正确的,所以我'显然做错了。我怎样才能做到正确?

4

1 回答 1

1

由于“hwndb 尚未初始化”-错误,我会说您尚未声明:

HWND hwndb; //Global variable

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

于 2013-06-27T21:14:58.357 回答