繁体   English   中英

使用CreateWindow创建MDI子窗口

[英]using CreateWindow to create a MDI child window

这有效

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的对象的指针(请参见此处将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 Child窗口?

我这样做解决了

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的指针,CREATESTRUCT的lpCreateParams将是MIDICREATESTRUCT,其lParam将是指向对象的指针。

唷。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM