对不起英国屠杀但我找不到任何相关内容。
我正在尝试使用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);
}
答案 0 :(得分:3)
"LoginNavigationController"
不,这还不够。重要的不是名称,这只是一个选择器。它是传递给RegisterClassEx()的WNDCLASSEX结构的内容。并且尤其是 lpfnWndProc成员。 Windows通过使用不同的窗口过程主要表现不同。例如,您的新窗口不应该同样处理VBTN消息。
最重要的是,它不应该以相同的方式处理WM_CREATE消息。看不到代码,但你可能正在创建子窗口。你不希望在新窗口中发生这种情况。因此,它需要一个不同的窗口过程,WNDCLASSEX.lpfnWndProc的值不同。
窗口类是一个cookie切割器。您可以使用CreateWindowEx()多次标记它们,它们看起来和味道都一样。 Windows有一堆内置的cookie切割器,你已经知道它们,比如EDIT和LISTBOX等。但是如果你想烘焙不同的cookie,那么你需要一个不同的cookie切割器。具有不同窗口过程的新窗口类。您已经知道如何为您创建的第一个窗口执行此操作。再做第二次。
失去了(WNDPROC)施放顺便说一句,这是邪恶的。