使用CreateWindow创建MDI子窗口

时间:2014-12-05 15:04:21

标签: c++ win32gui mdichild

这是有效的

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,传递一个this指针并仍然创建一个工作的MDI子窗口?

2 个答案:

答案 0 :(得分:1)

我这样解决了它

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时,WndProc中的lparam将是一个指向CREATESTRUCT的指针,其lpCreateParams将是一个MIDICREATESTRUCT,其lParam将是指向对象的指针。

表示不快。

答案 1 :(得分:0)

当您将MDICREATESTRUCT传递给WM_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);