2015-06-12 75 views
0

对不起英文版的屠宰,但是我找不到任何关于这方面的内容。用父窗口的控件打开新窗口

我想打开一个空的窗口在C++与WINAPI但新窗口打开父窗口的控制像一个克隆。

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); 
} 

我试图WS_CHILD风格和HWND_MESSAGE在hwndParent,但他们都没有工作。

编辑:

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

我的水晶球说你的WM_CREATE消息处理程序执行此操作。所以你应该再次调用RegisterClassEx()来注册另一个窗口类,它被命名为“Window class”以外的其他名称。 –

+0

我改变了新的类'lpszClassName,但它仍然打开相同。 – Polkakorowakurwa

+0

http://stackoverflow.com/help/mcve –

回答

3
//same as vnWind ... 
vnEk.lpszClassName = L"vnTest"; 

不,这还不够。这不是重要的名字,这只是一个选择。它是传递给RegisterClassEx()的WNDCLASSEX结构的内容。并且尤其是的lpfnWndProc成员。 Windows主要通过具有不同的窗口过程而表现出不同的行为。例如,您的新窗口不应该将VBTN消息视为相同。

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

窗口类是一个饼干。你可以使用CreateWindowEx()多次贴图,它们的外观和品味都一样。 Windows有一堆内置曲奇,你已经知道它们,比如EDIT和LISTBOX等等。但是如果你想烤一个不同的曲奇,那么你需要一个不同的曲奇。一个具有不同窗口过程的新窗口类。您已经知道如何为您创建的第一个窗口执行此操作。第二次再做一次。

丢失(WNDPROC)投了顺位,这是邪恶的。

+0

最后感谢它的作品 – Polkakorowakurwa