我正在制作一个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语句的特定部分当然是正确的,所以我显然做错了。我该怎么办呢?
答案 0 :(得分:1)
由于“hwndb尚未初始化” - 我会说你还没有声明:
HWND hwndb; //Global variable
但是,如果您已将此设为全局变量,则可能由于在IDM_LOC1之前调用IDM_RESTART而发生此错误。这也意味着如果您双击刷新按钮,DestroyWindow函数将返回false。