【发布时间】:2016-10-25 16:21:10
【问题描述】:
我正在主窗口 (hwnd) 中制作一个按钮,当您单击一个按钮时,它会打开可由主窗口控制的新窗口 (hwndSec)!
当我点击一个按钮时,hwndSec 出现了!当我点击其他按钮时,它可以被修改......但是当我关闭它并尝试再次重新打开它时,它没有响应!所以按钮变得没用了!
这是一个简单的示例,一个按钮只是打开窗口然后尝试再次打开它。
我为 hwndSec 设置的设置:
wincl.hInstance = hInstance;
wincl.lpszClassName = "HwndSecClass";
wincl.lpfnWndProc = WindowProcedureSec;
wincl.style = CS_DBLCLKS;
wincl.cbSize = sizeof (WNDCLASSEX);
/* Use default icon and mouse-pointer */
wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
wincl.lpszMenuName = NULL;
wincl.cbClsExtra = 0;
wincl.cbWndExtra = 0;
wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
if (!RegisterClassEx (&wincl))
return 0;
hwnd = CreateWindowEx (
0,
wincl.lpszClassName,
_T("Window 2"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
500,
500,
HWND_DESKTOP,
NULL,
hInstance,
NULL
);
我做了两个窗口程序:
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK WindowProcedureSec (HWND, UINT, WPARAM, LPARAM);
当我点击一个按钮时,我调用这个函数:
ShowWindow(hwndSec,SW_SHOW);
然后第二个窗口正常出现,当我关闭窗口时它不会再次出现。
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message) /* handle the messages */
{
case WM_CREATE:
CreateWindow("BUTTON",
"open",
WS_CHILD | WS_VISIBLE ,
200,100,
100,50,
hwnd,
(HMENU) ID_BUTTON,
NULL,
NULL);
break;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case ID_BUTTON :
//printf("%s",(char*)GetLastError());
ShowWindow(hwndSec,SW_SHOW);
break;
}
break;
case WM_DESTROY:
PostQuitMessage (0);
break;
default:
return DefWindowProc (hwnd, message, wParam, lParam);
}
return 0;
}
LRESULT CALLBACK WindowProcedureSec (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
switch (message)
{
case WM_DESTROY:
PostMessage(hwnd, WM_CLOSE, 0, 0);
break;
default:
return DefWindowProc (hwnd, message, wParam, lParam);
}
return 0;
}
【问题讨论】:
-
它已关闭。没有了。它已经不复存在了。它已经过期,已经去见它的制造商了。这是一只死鹦鹉。您必须再次调用 CreateWindow()。
-
或者您可以隐藏该窗口并使用 ShowWindow 再次显示它
-
代码显示出大量缺乏洞察力。您确实需要重新开始,并首先了解基础知识。买一本好书,比如 Petzold 的Programming Windows®, Fifth Edition。
-
WindowProcedureSec()是无限递归等待发生。