2014-12-05 60 views
0

這個作品使用CreateWindow的創建MDI子窗口

mcs.szTitle = L"untitled"; 
mcs.szClass = childClassName; 
mcs.hOwner = GetModuleHandle(NULL); 
mcs.x = mcs.cx = CW_USEDEFAULT; 
mcs.y = mcs.cy = CW_USEDEFAULT; 
mcs.style = WS_HSCROLL; 
hChild = (HWND)SendMessage(hMDIClient, WM_MDICREATE, 0, (LONG)&mcs); 

,但我不能一個指針發送到具有WndProc的對象我想使用(見here在結束了的WndProc班)這樣

hChild = CreateWindow(childClassName, L"", WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, 400, 250, hMDIClient, NULL, GetModuleHandle(NULL), this); 

但是做這樣會導致與WINDO錯誤,也不會有zlose,沒有最小化,沒有最大化,我無法調整它,如果我創建另一個MDI子窗口,前一個將被取消選擇。

是否可以使用SendMessage或CreateWindow,傳遞這個指針並仍然創建一個工作的MDI子窗口?

回答

0

我做這個

hChild = CreateMDIWindow(childClassName, L"", WS_EX_WINDOWEDGE, 49, 50, 51, 52, hMDIClient, GetModuleHandle(NULL), (LPARAM)this); 

,然後在靜態的WndProc解決它

LRESULT CALLBACK CWindowHandler::MsgRouter(HWND hwnd, UINT message, 
              WPARAM wparam, LPARAM lparam) 
{ 
    CREATESTRUCT* wnd = 0; 
    MDICREATESTRUCT* mdiStruct = 0; 
    CMDIChildWindowBase* wndBase; 

    if(message == WM_NCCREATE) 
    { 
     wnd = (CREATESTRUCT*)(lparam); 
     mdiStruct = (MDICREATESTRUCT*)wnd->lpCreateParams; 
     wndBase = (CMDIChildWindowBase*)mdiStruct->lParam; 
     SetWindowLongPtr(hwnd, GWLP_USERDATA, reinterpret_cast<LONG_PTR>(wndBase)); 

     // save window handle 
     wndBase->SetHWND(hwnd); 
    } 
    else 
     wndBase = reinterpret_cast<CMDIChildWindowBase *>(::GetWindowLong(hwnd, GWL_USERDATA)); 

    // call the windows message handler 
    if(wndBase) 
     return wndBase->WndProcs(message, wparam, lparam); 
    return DefWindowProc(hwnd, message, wparam, lparam); 
} 

所以創建一個MDIChild時,LPARAM中的WndProc將指向一個CREATESTRUCT,其lpCreateParams會成爲MIDICREATESTRUCT,其lParam將成爲您的對象的指針。

phew。

+0

當你傳遞'MDICREATESTRUCT'到'WM_MDICREATE',則可以提供在'MDICREATESTRUCT.lParam對象指針'。 – 2014-12-14 22:04:45

0

在您通過MDICREATESTRUCTWM_MDICREATE,可以提供對象指針在MDICREATESTRUCT.lParam字段:

mcs.szTitle = L"untitled"; 
mcs.szClass = childClassName; 
mcs.hOwner = GetModuleHandle(NULL); 
mcs.x = mcs.cx = CW_USEDEFAULT; 
mcs.y = mcs.cy = CW_USEDEFAULT; 
mcs.style = WS_HSCROLL; 
mcs.lParam = (LPARAM) this; // <-- here 

hChild = (HWND) SendMessage(hMDIClient, WM_MDICREATE, 0, (LPARAM)&mcs);