使用父 window 的控件的新 window 打开
New window opening with parent window's controls
抱歉英国屠杀,但我找不到任何相关信息。
我正在尝试使用 winapi 在 C++ 中打开一个空的 window,但是新的 window 像克隆一样使用父 window 的控件打开。
case VBTN:
{
vsa1 = CreateWindowEx(NULL,
L"Window Class",
L"Test",
WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX,
CW_USEDEFAULT, CW_USEDEFAULT,
350, 275,
HWND_MESSAGE,
NULL,
GetModuleHandle(NULL),
NULL);
ShowWindow(vsa1, 10);
}
我在 hwndParent 中尝试了 WS_CHILD 样式和 HWND_MESSAGE,但其中 none 有效。
编辑:
LRESULT CALLBACK WinProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
HWND hWnd, vsa1;
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nShowCmd)
{
WNDCLASSEX vnWind;
WNDCLASSEX vnEk;
ZeroMemory(&vnWind, sizeof(WNDCLASSEX));
ZeroMemory(&vnEk, sizeof(WNDCLASSEX));
vnWind.cbClsExtra = NULL;
vnWind.cbSize = sizeof(WNDCLASSEX);
vnWind.cbWndExtra = NULL;
vnWind.hbrBackground = (HBRUSH)COLOR_WINDOW;
vnWind.hCursor = LoadCursor(NULL, IDC_ARROW);
vnWind.hIcon = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(V_ICON_32));
vnWind.hIconSm = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(V_ICON_16));
vnWind.hInstance = hInst;
vnWind.lpfnWndProc = (WNDPROC)WinProc;
vnWind.lpszClassName = L"Window Class";
vnWind.lpszMenuName = NULL;
vnWind.style = CS_HREDRAW | CS_VREDRAW;
//same as vnWind ...
vnEk.lpszClassName = L"vnTest";
//same as vnWind ...
if(!RegisterClassEx(&vnWind))
{
MessageBox(NULL, L"Reg hatalı", L"Reg", NULL);
return 1;
}
if(!RegisterClassEx(&vnEk))
{
MessageBox(NULL, L"Reg1 hatalı", L"Reg", NULL);
return 1;
}
hWnd = CreateWindowEx(NULL,
L"Window Class",
L"Test Window*",
WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX,
CW_USEDEFAULT, CW_USEDEFAULT,
270, 80,
NULL,
NULL,
hInst,
NULL);
ShowWindow(hWnd, nShowCmd);
MSG msg;
ZeroMemory(&msg, sizeof(msg));
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
LRESULT CALLBACK WinProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
//...
case VBTN:
{
vsa1 = CreateWindowEx(NULL,
L"Window Class",
L"Test",
WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX,
CW_USEDEFAULT, CW_USEDEFAULT,
350, 275,
HWND_MESSAGE,
NULL,
GetModuleHandle(NULL),
NULL);
ShowWindow(vsa1, 10);
}
//...
}
return DefWindowProc(hWnd, msg, wParam, lParam);
}
//same as vnWind ...
vnEk.lpszClassName = L"vnTest";
不,这还不够。重要的不是名称,这只是一个选择器。重要的是传递给 RegisterClassEx() 的 WNDCLASSEX 结构的内容。 尤其是 lpfnWndProc 成员。 Windows 主要是因为具有不同的 window 程序而彼此表现不同。例如,您的新 window 不应同样对待 VBTN 消息。
最重要的是,它不应该以同样的方式对待 WM_CREATE 消息。看不到代码,但您可能正在创建子 windows。您不希望这种情况发生在您的新 window 中。因此,它需要不同的 window 程序,WNDCLASSEX.lpfnWndProc 的不同值。
A window class 是个千篇一律的人。您可以使用 CreateWindowEx() 多次标记它,它们看起来和味道都一样。 Windows 有一堆内置的饼干模具,你已经知道它们了,比如 EDIT 和 LISTBOX 等。但是如果你想烤出不同外观的饼干,那么你需要一个不同的饼干模具。具有不同 window 程序的新 window class。您已经知道如何为您创建的第一个 window 执行此操作。第二次再做一次。
顺便说一句,失去 (WNDPROC) 演员,那是邪恶的。
抱歉英国屠杀,但我找不到任何相关信息。
我正在尝试使用 winapi 在 C++ 中打开一个空的 window,但是新的 window 像克隆一样使用父 window 的控件打开。
case VBTN:
{
vsa1 = CreateWindowEx(NULL,
L"Window Class",
L"Test",
WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX,
CW_USEDEFAULT, CW_USEDEFAULT,
350, 275,
HWND_MESSAGE,
NULL,
GetModuleHandle(NULL),
NULL);
ShowWindow(vsa1, 10);
}
我在 hwndParent 中尝试了 WS_CHILD 样式和 HWND_MESSAGE,但其中 none 有效。
编辑:
LRESULT CALLBACK WinProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
HWND hWnd, vsa1;
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nShowCmd)
{
WNDCLASSEX vnWind;
WNDCLASSEX vnEk;
ZeroMemory(&vnWind, sizeof(WNDCLASSEX));
ZeroMemory(&vnEk, sizeof(WNDCLASSEX));
vnWind.cbClsExtra = NULL;
vnWind.cbSize = sizeof(WNDCLASSEX);
vnWind.cbWndExtra = NULL;
vnWind.hbrBackground = (HBRUSH)COLOR_WINDOW;
vnWind.hCursor = LoadCursor(NULL, IDC_ARROW);
vnWind.hIcon = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(V_ICON_32));
vnWind.hIconSm = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(V_ICON_16));
vnWind.hInstance = hInst;
vnWind.lpfnWndProc = (WNDPROC)WinProc;
vnWind.lpszClassName = L"Window Class";
vnWind.lpszMenuName = NULL;
vnWind.style = CS_HREDRAW | CS_VREDRAW;
//same as vnWind ...
vnEk.lpszClassName = L"vnTest";
//same as vnWind ...
if(!RegisterClassEx(&vnWind))
{
MessageBox(NULL, L"Reg hatalı", L"Reg", NULL);
return 1;
}
if(!RegisterClassEx(&vnEk))
{
MessageBox(NULL, L"Reg1 hatalı", L"Reg", NULL);
return 1;
}
hWnd = CreateWindowEx(NULL,
L"Window Class",
L"Test Window*",
WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX,
CW_USEDEFAULT, CW_USEDEFAULT,
270, 80,
NULL,
NULL,
hInst,
NULL);
ShowWindow(hWnd, nShowCmd);
MSG msg;
ZeroMemory(&msg, sizeof(msg));
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
LRESULT CALLBACK WinProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
//...
case VBTN:
{
vsa1 = CreateWindowEx(NULL,
L"Window Class",
L"Test",
WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX,
CW_USEDEFAULT, CW_USEDEFAULT,
350, 275,
HWND_MESSAGE,
NULL,
GetModuleHandle(NULL),
NULL);
ShowWindow(vsa1, 10);
}
//...
}
return DefWindowProc(hWnd, msg, wParam, lParam);
}
//same as vnWind ...
vnEk.lpszClassName = L"vnTest";
不,这还不够。重要的不是名称,这只是一个选择器。重要的是传递给 RegisterClassEx() 的 WNDCLASSEX 结构的内容。 尤其是 lpfnWndProc 成员。 Windows 主要是因为具有不同的 window 程序而彼此表现不同。例如,您的新 window 不应同样对待 VBTN 消息。
最重要的是,它不应该以同样的方式对待 WM_CREATE 消息。看不到代码,但您可能正在创建子 windows。您不希望这种情况发生在您的新 window 中。因此,它需要不同的 window 程序,WNDCLASSEX.lpfnWndProc 的不同值。
A window class 是个千篇一律的人。您可以使用 CreateWindowEx() 多次标记它,它们看起来和味道都一样。 Windows 有一堆内置的饼干模具,你已经知道它们了,比如 EDIT 和 LISTBOX 等。但是如果你想烤出不同外观的饼干,那么你需要一个不同的饼干模具。具有不同 window 程序的新 window class。您已经知道如何为您创建的第一个 window 执行此操作。第二次再做一次。
顺便说一句,失去 (WNDPROC) 演员,那是邪恶的。