为什么它不能创建子窗口?

时间:2015-04-06 08:58:40

标签: c++ winapi childwindow

有谁能告诉我为什么无法创建子窗口? 我正在使用伪造者win32api指南,但我无法弄清楚是什么问题。

当程序开始运行时,我拥有所有控件,但是当我点击“新”菜单项时,我收到错误消息。这是在winmain之后。

其他内容如menuitems,工具和状态栏,打开或保存文件都可以。

**HWND CreateNewMDIChild(HWND hMDIClient)
{
    MDICREATESTRUCT mcs;
    HWND hChild;
    mcs.szTitle = "[Untitled]";
    mcs.szClass = g_szChildClassName;
    mcs.hOwner  = GetModuleHandle(NULL);
    mcs.x = mcs.cx = CW_USEDEFAULT;
    mcs.y = mcs.cy = CW_USEDEFAULT;
    mcs.style = MDIS_ALLCHILDSTYLES;
    hChild = (HWND)SendMessage(hMDIClient, WM_MDICREATE, 0, (LONG)&mcs);

    if(!hChild)
    {
        MessageBox(hMDIClient, "MDI Child creation failed.", "Oh Oh...",
            MB_ICONEXCLAMATION | MB_OK);
    }
    return hChild;

}**

1 个答案:

答案 0 :(得分:1)

这是sample code中的一个不幸的错误,它阻止它在64位Windows上运行。 SendMessage的最后一个参数是LPARAM类型(LONG_PTR的别名)。将其转换为LONG会将其截断为4个字节,对于64位指针来说还不够(请参阅Data Type Ranges)。

更改以下行

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

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

并且代码应按预期运行。