【发布时间】:2020-11-19 00:03:43
【问题描述】:
我正在用 C++ 编写我的第一个 Win32 应用程序,我正在尝试创建 3 个窗口,根据用户单击的按钮在它们之间进行重定向。我将窗口 (window1,window2,window3) 初始化为主窗口 hwnd 的子窗口,并且仅将 window1 设置为可见。 window1 也有两个按钮,每个按钮都应该指向 window2 或 window3。
我试图隐藏 window1 并使用 ShowWindow() 函数显示我想要切换到的窗口。但是,它不起作用(单击按钮不会执行任何操作)。你能帮我理解为什么吗?
在我之前的另一段代码中,我没有创建 window1,按钮和其他两个窗口只是 hwnd 的子级,按下按钮确实显示了正确的窗口,但按钮仍然存在,即使它不属于那个窗口。
另外,有没有更有效的窗口切换方式(无需一次又一次地删除和创建它们?
谢谢!!!
编辑:我设法解决了我的问题。这是因为我将 Windows 1,2 和 3 声明为静态的。通过将它们声明在与 hwnd 相同的类下,我能够处理来自主 WindowProcedure() 下的按钮的消息。因为我的程序会很简单,所以我不需要为新窗口创建不同的程序,但是感谢 cmets,现在我也知道该怎么做了!
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_CREATE:
window1 = CreateWindow("STATIC","Window 1",WS_VISIBLE|WS_BORDER|WS_CHILD,0,0,600,600,hwnd,NULL,NULL,NULL);
window2 = CreateWindow("STATIC","Window 2",WS_BORDER|WS_CHILD,0,0,600,600,hwnd,NULL,NULL,NULL);
button2 = CreateWindow(
"BUTTON",
"SECOND WINDOW",
WS_CHILD | WS_VISIBLE | WS_BORDER,
350, 480,
200, 20,
window1, (HMENU) 2, NULL, NULL);
window3 = CreateWindow("STATIC","Window 3",WS_BORDER|WS_CHILD,0,0,600,600,hwnd,NULL,NULL,NULL);
button3 = CreateWindow(
"BUTTON",
"THIRD WINDOW",
WS_CHILD | WS_VISIBLE | WS_BORDER,
50, 480,
200, 20,
window1, (HMENU) 3, NULL, NULL);
break;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case 2:
ShowWindow(window1,SW_HIDE);
ShowWindow(window2,SW_SHOW);
break;
case 3:
ShowWindow(window1,SW_HIDE);
ShowWindow(window3,SW_SHOW);
break;
}
break;
case WM_DESTROY:
PostQuitMessage (0); /* send a WM_QUIT to the message queue */
break;
default: /* for messages that we don't deal with */
return DefWindowProc (hwnd, message, wParam, lParam);
}
return 0;
}
【问题讨论】:
-
我认为您应该检查通知代码。它在
wParam的高位词中,您正在寻找BM_CLICKED。这一切都在文档中进行了描述,我怀疑值得重新阅读:docs.microsoft.com/en-us/windows/win32/controls/button-messages -
我真的怀疑您的 wndproc 是否收到 WM_COMMAND 消息,因为按钮 2 和按钮 3 是窗口 1 的子级。
-
您的 switch 语句也缺少
break;如果它确实收到了消息,当您单击 2 的按钮时,它将显示窗口 2 和 3 -
@MaraPostolache 通知消息被发送到窗口的父窗口。
-
@MaraPostolache 要么主窗口必须是父窗口,要么您必须为 window1 编写窗口过程。
标签: c++ winapi window showwindow