首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用CreateWindow创建MDI子窗口

使用CreateWindow创建MDI子窗口
EN

Stack Overflow用户
提问于 2014-12-05 23:04:21
回答 2查看 665关注 0票数 0

这是可行的

代码语言:javascript
复制
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的here )

代码语言:javascript
复制
hChild = CreateWindow(childClassName, L"", WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, 400, 250, hMDIClient, NULL, GetModuleHandle(NULL), this);

但是这样做会导致windo错误,没有zlose,没有最小化,没有最大化,我不能调整它的大小,如果我创建另一个MDI子窗口,前一个窗口将变得不可选。

有没有可能使用SendMessage或CreateWindow,传递一个this指针,然后仍然创建一个工作的MDI子窗口?

EN

回答 2

Stack Overflow用户

发布于 2014-12-06 01:18:48

我通过这样做解决了这个问题

代码语言:javascript
复制
hChild = CreateMDIWindow(childClassName, L"", WS_EX_WINDOWEDGE, 49, 50, 51, 52, hMDIClient, GetModuleHandle(NULL), (LPARAM)this);

然后在静态WndProc中

代码语言:javascript
复制
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将是指向对象的指针。

呼。

票数 0
EN

Stack Overflow用户

发布于 2014-12-15 06:08:16

MDICREATESTRUCT传递给WM_MDICREATE时,可以在MDICREATESTRUCT.lParam字段中提供对象指针:

代码语言:javascript
复制
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);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27318806

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档