При нажатии на кнопку окно закрывается
Хочу написать код, который будет открывать копию своего же окна, при нажатии на кнопку. Но При нажатии на кнопку 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);
}
Источник: Stack Overflow на русском