我有一个按钮,想在按下按钮时打开一个新窗口。
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;
}
子窗口按预期弹出,但是当我尝试关闭子窗口时,基本窗口也会关闭并且应用程序退出。如何只关闭新创建的窗口而不关闭基本窗口?
编辑我已经添加了完整的示例。
感谢@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;
}