2 Pluspunkte 0 Minuspunkte

Ich habe diesen Code um bei einem Klick auf einen Button ein neues Fenster zu öffnen.

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

HWND hwnd;

void CreateChildWindow() {

    HWND hNewWindow = CreateWindow(
        _T("SimpleWindowClass"),
        _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;
}

Das Problem ist aber wenn ich das neue Fenster mit dem X Button rechts oben schliessen möchte beendet sich das ganze Programm also auch das erste Fenster in dem der Button war.

von  

1 Antwort

1 Pluspunkt 0 Minuspunkte

Du verwendest zweimal die Window Klasse "SimpleWindowClass". Die geänderte Funktion CreateChildWindow erstellt ein neues Fenster der Klasse "OtherSimpleWindowClass". Wenn der Button geklickt wird, ruft sie CreateChildWindow auf, aber jetzt mit hInstance als Argument.

#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;
}
von