单击关闭按钮时子窗口关闭应用程序

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

我有一个按钮,想在按下按钮时打开一个新窗口。

HWND hwnd;

void CreateChildWindow() {

    HWND hNewWindow = CreateWindow(
        _T("OtherSimpleWindowClass"),
        _T("Neues Fenster"),
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, 400, 300,
        0,
        0,
        (HINSTANCE)GetWindowLongPtr(hwnd, GWLP_HINSTANCE),
        0);
        
    ShowWindow(hNewWindow, SW_SHOWNORMAL);

}

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch(uMsg)
    {
        case WM_CLOSE:
            PostQuitMessage(0);
            return 0;
        case WM_COMMAND:
            if (LOWORD(wParam) == 1) {
                CreateChildWindow();
            }
            break;
        default:
            return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    WNDCLASS wc = {};
    wc.lpfnWndProc = WindowProc;
    wc.hInstance = hInstance;
    wc.lpszClassName = _T("SimpleWindowClass");

    RegisterClass(&wc);

    hwnd = CreateWindowEx(
        0,
        _T("SimpleWindowClass"),
        _T("Button"),
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, 800, 600,
        0,
        0,
        hInstance,
        0);

    ShowWindow(hwnd, nCmdShow);

    HWND hButton = CreateWindow(
        _T("BUTTON"),
        _T("Klick mich"),
        WS_CHILD | WS_VISIBLE,
        50, 50, 100, 30,
        hwnd,
        (HMENU)1, // Der Identifier des Buttons ist 1
        hInstance,
        NULL
    );

    MSG msg = {};
    while(GetMessage(&msg, 0, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return 0;
}

子窗口按预期弹出,但是当我尝试关闭子窗口时,基本窗口也会关闭并且应用程序退出。如何只关闭新创建的窗口而不关闭基本窗口?

编辑我已经添加了完整的示例。

c windows hwnd
1个回答
0
投票

感谢@Raymond Chen,我想出了这个解决方案。

#include <windows.h>
#include <tchar.h>

HWND hGwnd;

void CreateChildWindow(HINSTANCE hInstance) {

    WNDCLASS wcChild = {};
    wcChild.lpfnWndProc = DefWindowProc; // Hier verwenden wir eine einfache Window Procedure
    wcChild.hInstance = hInstance;
    wcChild.lpszClassName = _T("OtherSimpleWindowClass");

    RegisterClass(&wcChild);

    HWND hNewWindow = CreateWindow(
        _T("OtherSimpleWindowClass"),
        _T("Neues Fenster"),
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, 400, 300,
        0,
        0,
        hInstance,
        0);
        
    ShowWindow(hNewWindow, SW_SHOWNORMAL);

}

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch(uMsg)
    {
        case WM_CLOSE:
            if (hGwnd == hwnd) { 
                PostQuitMessage(0);
            } else {
                DestroyWindow(hwnd);
            }
            return 0;
        case WM_COMMAND:
            if (LOWORD(wParam) == 1) {
                CreateChildWindow((HINSTANCE)GetWindowLongPtr(hwnd, GWLP_HINSTANCE)); // hInstance übergeben
            }
            break;
        default:
            return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    WNDCLASS wc = {};
    wc.lpfnWndProc = WindowProc;
    wc.hInstance = hInstance;
    wc.lpszClassName = _T("SimpleWindowClass");

    RegisterClass(&wc);

    hGwnd = CreateWindowEx(
        0,
        _T("SimpleWindowClass"),
        _T("Button"),
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, 800, 600,
        0,
        0,
        hInstance,
        0);

    ShowWindow(hGwnd, nCmdShow);

    HWND hButton = CreateWindow(
        _T("BUTTON"),
        _T("Klick mich"),
        WS_CHILD | WS_VISIBLE,
        50, 50, 100, 30,
        hGwnd,
        (HMENU)1, // Der Identifier des Buttons ist 1
        hInstance,
        NULL
    );

    MSG msg = {};
    while(GetMessage(&msg, 0, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.