使用父 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) 演员,那是邪恶的。