- 此问题在此处已有答案**:
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案例中工作。
2条答案
按热度按时间wixjitnu1#
你说(在问题的代码注解中)。
new_game_button
在Windows过程函数的开头被声明为类型HWND
,但未被初始化。每一个传入的消息都意味着对窗口过程的一个新调用。函数的局部变量在调用之间不保留它们的值,除非它们被标记为
static
。当窗口过程从处理
WM_CREATE
返回时,丢失了new_game_button
的值。当以后在处理WM_COMMAND
时尝试使用它时,它未初始化,并且程序通过将它传递给ShowWindow
而导致未定义行为。n53p2ov02#
每一条评论都帮助我解决了这个问题,我很感激。我太新了,不能悲伤地给予名声。
在我有了对话框的ID后,我可以使用GetDlgItem函数来显示或隐藏我喜欢的对话框。