无法在我的C++ Win32应用程序的主窗口中显示/隐藏按钮[duplicate]

l3zydbqr  于 2023-01-06  发布在  其他
关注(0)|答案(2)|浏览(229)
    • 此问题在此处已有答案**:

Access a variable from a different switch case (from WM_CREATE to WM_CTLCOLORSTATIC in the WinApi)(2个答案)
8小时前关门了。
我创建了一个基本按钮,以防:WM_CREATE在windows程序中执行以下操作。

/*The "new_game_button" is declared as type HWND at the 
start of the windows procedure function but not initialized.*/ 
new_game_button = CreateWindow ( "BUTTON", "New Game",
                                  WS_CHILD | WS_BORDER ,
                                  50, 50, 100, 100,
                                  hwnd, NULL, NULL, NULL);

我的目的是创建一个指令和"开始新游戏"按钮,作为我的简单tictactoe应用程序的第一件事。如果我给参数WS_VISIBLE,它会立即按预期显示。
在同样的情况下:WM_CREATE如果我使用行

if (!start_Game){ //global variable default is false
      ShowWindow( new_game_button, SW_SHOW);
}

按钮将按预期显示。
除了这两种情况,我不能让按钮显示在稍后阶段。
此外,如果我使用这两种方法中的一种来显示按钮,我永远无法让它消失

ShowWindow ( new_game_button, SW_HIDE);

一旦按钮显示,它将在程序执行期间一直显示。无论哪种情况。Command/Create/Paint
我试过用

if (start_Game){
      ShowWindow( new_game_button, SW_HIDE);
      UpdateWindow ( new_game_button );
      //UpdateWindow ( hwnd ); tried this as well 
}

在案例WM_CREATE中。
我还尝试了机箱内的相同SW_HIDE行:生成新游戏的WM_COMMAND(编译但不隐藏按钮)。
我试过在窗口过程函数中的WM_CREATE之外声明按钮子窗口。然后使用WM_CREATE来显示窗口-工作正常-但WM_COMMAND不会隐藏窗口。
我也尝试过在case:WM_PAINT中创建按钮窗口,它可以显示按钮,但不能删除它。我甚至尝试过DestroyWindow,但失败了。[返回0]
在试图理解按钮窗口的行为时-我发现我无法获得
ShowWindow( new_game_button, SW_SHOW);在WM_COMMAND案例中工作。

wixjitnu

wixjitnu1#

你说(在问题的代码注解中)。
new_game_button在Windows过程函数的开头被声明为类型HWND,但未被初始化。
每一个传入的消息都意味着对窗口过程的一个新调用。函数的局部变量在调用之间不保留它们的值,除非它们被标记为static
当窗口过程从处理WM_CREATE返回时,丢失了new_game_button的值。当以后在处理WM_COMMAND时尝试使用它时,它未初始化,并且程序通过将它传递给ShowWindow而导致未定义行为

n53p2ov0

n53p2ov02#

每一条评论都帮助我解决了这个问题,我很感激。我太新了,不能悲伤地给予名声。

case WM_CREATE:
{
      new_game_button = CreateWindow ("BUTTON", "New Game",
                                       WS_CHILD | WS_BORDER ,
                                       50, 50, 100, 100,
                                       hwnd, (HMENU) 1, NULL, NULL);
      if (!start_Game){
            ShowWindow( new_game_button, SW_SHOW);
      }

}
break;

在我有了对话框的ID后,我可以使用GetDlgItem函数来显示或隐藏我喜欢的对话框。

new_game_button = GetDlgItem (hwnd, 1);
ShowWindow( new_game_button, SW_HIDE);

相关问题