2014-12-05 215 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);