繁体   English   中英

如何重新打开 winapi window?

[英]How to reopen the winapi window?

我有带有菜单的 WinAPI 应用程序。 我单击“图形”并选择打开或绘制。 究竟是什么并不重要。 然后我关闭子 window。 当我尝试再次打开它时,它不起作用。 也许我应该把 ShowWindow(hWnd, SW_HIDE) 放在某个地方。 但我不明白,它应该在哪里。 也许还有另一种解决方案

主 window

在这里,我将放置我的代码

回调,我使用

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM