首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Windows重新打开关闭的窗口

如何使用Windows重新打开关闭的窗口
EN

Stack Overflow用户
提问于 2016-10-25 16:21:10
回答 1查看 877关注 0票数 0

我在主窗口( hwnd )中做了一个按钮,当你点击一个按钮时,它会打开新窗口( hwndSec ),这个窗口可以被主窗口控制!当我点击一个按钮,hwndSec出现了!当我点击其他按钮时,它可以被修改.但是,当我关闭它并试图再次重新打开它时,它将不会响应!所以按钮就没用了!

这是一个简单的例子,一个按钮只是打开窗口,然后尝试再次打开它。

我为hwndSec设置的设置:

代码语言:javascript
复制
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                
       );

我做了两个窗口程序:

代码语言:javascript
复制
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK WindowProcedureSec (HWND, UINT, WPARAM, LPARAM);

当我点击一个按钮时,我称之为这个字体:

代码语言:javascript
复制
ShowWindow(hwndSec,SW_SHOW);

然后第二个窗口正常出现,当我关闭窗口时,它就不会再出现了。

代码语言:javascript
复制
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;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-25 18:32:30

当一个窗口被关闭时,它会收到一条WM_CLOSE消息。如果将该消息传递给DefWindowProc(),则默认行为是销毁窗口

应用程序可以在销毁窗口之前提示用户确认,方法是处理WM_CLOSE消息,并在用户确认选择的情况下调用DestroyWindow函数。 默认情况下,DefWindowProc 函数调用 DestroyWindow 函数来销毁窗口.

这一点将在MSDN上进一步讨论:

关窗

因此,每次您想在关闭后显示辅助窗口时,都必须使用CreateWindow/Ex()重新创建它:

代码语言:javascript
复制
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    ...
    case WM_COMMAND:
        switch (LOWORD(wParam))
        {
        case ID_BUTTON :
            if (!hwndSec)
            {
                hwndSec = CreateWindowEx(
                    0,
                    _T("HwndSecClass"),
                    _T("Window 2"),
                    WS_OVERLAPPEDWINDOW,
                    CW_USEDEFAULT,
                    CW_USEDEFAULT,
                    500,
                    500,
                    HWND_DESKTOP,
                    NULL,
                    hInstance,
                    NULL
                );
            }
            ShowWindow(hwndSec, SW_SHOW);
            break;
        }
        break;
    ...
    }

    return 0;
}

LRESULT CALLBACK WindowProcedureSec (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_DESTROY:
        hwndSec = NULL;
        break;
    }

    return DefWindowProc(hwnd, message, wParam, lParam);
}

如果不想这样做,则需要使辅助窗口处理WM_CLOSE消息,而不是将其传递给DefWindowProc()。例如,调用ShowWindow(SW_HIDE),然后您可以在需要时调用ShowWindow(SH_SHOW)

代码语言:javascript
复制
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    ...
    case WM_COMMAND:
        switch (LOWORD(wParam))
        {
        case ID_BUTTON :
            ShowWindow(hwndSec, SW_SHOW);
            break;
        }
        break;
    ...
    }

    return 0;
}


LRESULT CALLBACK WindowProcedureSec (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_CLOSE:
        ShowWindow(hwnd, SW_HIDE);
        break;

    default:
        return DefWindowProc(hwnd, message, wParam, lParam);
    }

    return 0;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40245006

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档