2015-06-12 97 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