使用父窗口控件打开的新窗口

时间:2015-06-12 20:25:28

标签: c++ winapi

对不起英国屠杀但我找不到任何相关内容。

我正在尝试使用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);
}

1 个答案:

答案 0 :(得分:3)

"LoginNavigationController"

不,这还不够。重要的不是名称,这只是一个选择器。它是传递给RegisterClassEx()的WNDCLASSEX结构的内容。并且尤其是 lpfnWndProc成员。 Windows通过使用不同的窗口过程主要表现不同。例如,您的新窗口不应该同样处理VBTN消息。

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

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

失去了(WNDPROC)施放顺便说一句,这是邪恶的。