gpt4 book ai didi

c++ - 使用父窗口的控件打开新窗口

转载 作者:行者123 更新时间:2023-11-28 00:15:08 25 4
gpt4 key购买 nike

抱歉英国屠杀,但我找不到任何相关信息。

我正在尝试使用 winapi 在 C++ 中打开一个空窗口,但使用父窗口控件打开的新窗口就像一个克隆。

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,但都没有用。

编辑:

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 主要通过具有不同的窗口过程而彼此不同。例如,您的新窗口不应同样对待 VBTN 消息。

最重要的是,它不应该以同样的方式处理 WM_CREATE 消息。看不到代码,但您可能正在创建子窗口。您不希望这种情况发生在您的新窗口中。因此它需要一个不同的窗口过程,一个不同的 WNDCLASSEX.lpfnWndProc 值。

窗口类是一个千篇一律的工具。您可以使用 CreateWindowEx() 多次标记它,它们看起来和味道都一样。 Windows 有一堆内置的 cookies 切割器,你已经知道它们,比如 EDIT 和 LISTBOX 等。但是如果你想烤出不同外观的 cookies ,那么你需要一个不同的 cookies 切割器。具有不同窗口过程的新窗口类。您已经知道如何为您创建的第一个窗口执行此操作。第二次再做一次。

顺便说一句,失去 (WNDPROC) 转换,那是邪恶的。

关于c++ - 使用父窗口的控件打开新窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30811640/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com