如何在不关闭父窗口的情况下关闭子窗口?

问题描述 投票:0回答:3

我有一个有 5 个子窗口的窗口。如何在不关闭父窗口的情况下关闭子窗口?

c++ winapi window
3个回答
5
投票

想必您有子窗口的句柄?如果是这样,那么就使用

DestroyWindow

编辑:

您应该在主“窗口”中定义一个 WndProc 方法来处理来自子窗口的回调。您可以使用它来定义要对每条消息执行的操作。在你的情况下,你想调用 destroyWindow。

类似这样的:

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
        case WM_CLOSE:
            DestroyWindow(hwnd);
        break;
        default:
            return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}

0
投票

这件事就发生在我身上。我在为子窗口注册的窗口过程中添加了一个案例

WM_DESTROY
。这导致我的整个应用程序退出。删除后,一切正常。


0
投票

我遇到了同样的问题,所以我这样做来解决它:

  1. 创建一个全局句柄变量,它将用作主父窗口的引用。

    HWND mainHwnd;
    
  2. 在首先创建父窗口的程序的主函数中,我这样做了:

    mainHwnd = CreateWindowW( /* your window setup here */ );
    
  3. 然后,在 LRESULT 方法中我这样做了:

    LRESULT CALLBACK AboutWindowProcedure(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam){
    
        switch(msg){
    
        case WM_COMMAND:{
            switch(wParam){
    
            case BTN_ABOUT_CLOSE:
                EnableWindow(mainHwnd, true); // => THIS IS THE SOLUTION
                DestroyWindow(hWnd);
                break;
    
            }
            break;
        }
    
        case WM_CREATE:{
            // WHATEVER HAPPENS HERE...
            break;
        }
    
        case WM_CLOSE:{
            EnableWindow(mainHwnd, true); // => AND HERE TOO, IN CASE USER CLOSES THE WINDOW USING THE X BUTTON
            DestroyWindow(hWnd);
            break;
        }
        default:{
            return DefWindowProcW(hWnd, msg, wParam, lParam);
        }
    }
    
    return 0;
    
    }
    

我希望它有帮助。快乐编码!

© www.soinside.com 2019 - 2024. All rights reserved.