[英]How to reopen the winapi window?
我有带有菜单的 WinAPI 应用程序。 我单击“图形”并选择打开或绘制。 究竟是什么并不重要。 然后我关闭子 window。 当我尝试再次打开它时,它不起作用。 也许我应该把 ShowWindow(hWnd, SW_HIDE) 放在某个地方。 但我不明白,它应该在哪里。 也许还有另一种解决方案
在这里,我将放置我的代码:
回调,我使用
LRESULT CALLBACK DrawProcedure(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
switch (msg)
{
case WM_PAINT:
{
...
}
case WM_LBUTTONDOWN:
{
...
}
}
return DefWindowProc(hWnd, msg, wp, lp);
}
LRESULT CALLBACK GraphProcedure(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
switch (msg)
{
case WM_PAINT:
{
...
}
break;
case WM_CREATE:
...
case WM_SIZE:
...
}
return DefWindowProc(hWnd, msg, wp, lp);
}
LRESULT CALLBACK SoftwareMainProcedure(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
switch (msg)
{
case WM_COMMAND:
switch (wp)
{
case draw_plot:
GraphClass.style = CS_HREDRAW | CS_VREDRAW;
GraphClass.lpfnWndProc = DrawProcedure;
GraphClass.hInstance = hInst;
GraphClass.lpszMenuName = NULL;
GraphClass.lpszClassName = L"graphics";
if (!RegisterClassW(&GraphClass))
{
return -1;
}
gr_draw = CreateWindow(L"graphics", L"DRAW", WS_VISIBLE | WS_BORDER | WS_MAXIMIZE | WS_HSCROLL | WS_VSCROLL | WS_OVERLAPPEDWINDOW, 0, 0, 800, 700, NULL, NULL, hInst, NULL);
break;
case open_plot:
GraphClass.style = CS_HREDRAW | CS_VREDRAW;
GraphClass.lpfnWndProc = GraphProcedure;
GraphClass.hInstance = hInst;
GraphClass.lpszMenuName = NULL;
GraphClass.lpszClassName = L"graphics";
if (!RegisterClassW(&GraphClass))
{
return -1;
}
gr_open = CreateWindow(L"graphics", L"OPEN", WS_VISIBLE | WS_BORDER | WS_MAXIMIZE | WS_OVERLAPPEDWINDOW, 0, 0, 800, 700, NULL, NULL, hInst, NULL);
break;
case OnExitSoftware:
PostQuitMessage(0);
break;
default:
break;
}
break;
case WM_SIZE:
{
...
}
break;
case WM_CREATE:
MainWndAddMenus(hWnd);
MainWndAddWidgets(hWnd);
break;
case WM_DESTROY: // close mainwindow
ExitSoftware();
break;
default:
return DefWindowProc(hWnd, msg, wp, lp);
}
}
您每次都在注册 window class。 第二次失败,因为 class 已经注册,并且您的 window 过程返回 -1 而不打开 window。
相反,您可以只在第一次注册它,或者您可以在程序启动时注册所有 window 类。
您还应该修改报告错误的方式。 为什么程序没有告诉你“注册graph_class 失败”? 如果您弹出了一个消息框(例如),您已经知道 RegisterClassEx 是问题所在,并且如果您在该消息框中包含错误代码,您就会知道这是因为 class 已经注册。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.