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