При нажатии на кнопку окно закрывается

Рейтинг: 0Ответов: 1Опубликовано: 10.08.2023

Хочу написать код, который будет открывать копию своего же окна, при нажатии на кнопку. Но При нажатии на кнопку create окно закрывается.

#include <Windows.h>
#include "resource.h"
#include "Header.h"





HINSTANCE hInstance;
RECT ClientArea;
HBITMAP pattern;



int nCmdShow;
LRESULT CALLBACK foo(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

int NewSony(int nCmdShow, HWND hParent, const WNDPROC foo);

LRESULT CALLBACK foo(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {

    case WM_CREATE:
    {
        HMENU men = CreateMenu();
        AppendMenu(men, MF_STRING, 10, L"create");
        SetMenu(hwnd, men);

    }
    return 0;
    case WM_PAINT:
    {
        GetClientRect(hwnd, &ClientArea);
        PAINTSTRUCT ps;
        HDC dc = BeginPaint(hwnd, &ps);
        HPEN NewPen = CreatePen(PS_SOLID, 5, RGB(0, 32, 255));
        HBRUSH newBrush = CreatePatternBrush(pattern);
        HGDIOBJ oldBrush = SelectObject(dc, newBrush);
        HGDIOBJ oldPen = SelectObject(dc, NewPen);
        Rectangle(dc, ClientArea.left + 10, ClientArea.top + 10, ClientArea.right - 10, ClientArea.bottom - 10);
        
        SelectObject(dc, NewPen);
        SelectObject(dc, oldBrush);
        
        DeleteObject(NewPen);
        DeleteObject(oldBrush);
        EndPaint(hwnd, &ps);
    }
    return 0;

    case WM_COMMAND:
    {

        switch (LOWORD(uMsg))
        {
        case 10:
        {
            NewSony(nCmdShow,hwnd, foo);
        }
        return 0;
        }
    }
    case WM_DESTROY:
    {
        PostQuitMessage(EXIT_SUCCESS);
        
        
    }
    return 0;
    default:
        return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }
}

class Windows
{
private:

    std::vector<HWND> windi{};
public:
    int id;
    void addWin(HWND hwnd)
    {
        windi.push_back(hwnd);
        NewSony(nCmdShow, nullptr, foo);
        id += 1;
    }


};

Windows ad;

int NewSony(int nCmdShow,HWND hParent, const WNDPROC foo)
{
    pattern = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAP1));
    MSG msg{};
    HWND hWnd{};
    WNDCLASSEX wc{ sizeof(WNDCLASSEX) };
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hbrBackground = reinterpret_cast<HBRUSH>(GetStockObject(WHITE_BRUSH));
    wc.hCursor = LoadCursor(nullptr, IDC_ARROW);
    wc.hIcon = LoadIcon(nullptr, IDI_APPLICATION);
    wc.hIconSm = LoadIcon(nullptr, IDI_APPLICATION);

    wc.lpfnWndProc = foo;

    wc.hInstance = hInstance;
    wc.style = CS_VREDRAW | CS_HREDRAW;
    wc.lpszClassName = (LPWSTR)ad.id;
    ad.addWin(hWnd);
    wc.lpszMenuName = nullptr;
    if (!RegisterClassEx(&wc))
        return EXIT_FAILURE;
    if (hWnd = CreateWindow(wc.lpszClassName, (LPWSTR)ad.id, WS_OVERLAPPED, 500, 500, 500, 500, hParent, nullptr, nullptr, nullptr); hWnd == INVALID_HANDLE_VALUE)
        return EXIT_FAILURE;
    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);
    while (GetMessage(&msg, nullptr, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return static_cast<int>(msg.lParam);
}

int CALLBACK wWinMain(HINSTANCE hInstance, HINSTANCE, LPWSTR szCmdLine, int nCmdShow)
{
    

    pattern = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAP1));
    MSG msg{};
    HWND hWnd{};
    WNDCLASSEX wc{ sizeof(WNDCLASSEX) };
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hbrBackground = reinterpret_cast<HBRUSH>(GetStockObject(WHITE_BRUSH));
    wc.hCursor = LoadCursor(nullptr, IDC_ARROW);
    wc.hIcon = LoadIcon(nullptr, IDI_APPLICATION);
    wc.hIconSm = LoadIcon(nullptr, IDI_APPLICATION);

    wc.lpfnWndProc = foo;

    wc.hInstance = hInstance;
    wc.style = CS_VREDRAW | CS_HREDRAW;
    wc.lpszClassName = L"LPL";
    wc.lpszMenuName = nullptr;
    if (!RegisterClassEx(& wc))
        return EXIT_FAILURE;
    if (hWnd = CreateWindow(wc.lpszClassName, L"SISO", WS_OVERLAPPEDWINDOW, 500, 500, 500, 500, nullptr, nullptr, wc.hInstance, nullptr); hWnd == INVALID_HANDLE_VALUE)
        return EXIT_FAILURE;
    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);
    while (GetMessage(&msg, nullptr, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return static_cast<int>(msg.lParam);
}

Ответы

▲ 2Принят

После обработчика WM_COMMAND код проваливается в обработчик WM_DESTROY, при этом в самом обработчике LOWORD извлекается из кода сообщения:

case WM_COMMAND:
{
    auto const id{LOWORD(wParam)};
    switch (id)
    {
        case 10:
        {
            NewSony(nCmdShow,hwnd, foo);
            break;
        }
    }
    return 0;
}

Цикл сообщений должен быть только один, и правильно реализованный А еще в NewSony и addWin бесконечная рекурсия, в обработчике WM_PAINT перепутаны дескрипторы, и куча других проблем...