weixin_44179323 2019-12-05 22:24 采纳率: 0%
浏览 271

把Duilib窗体作为子窗体嵌入到MFC窗体中时产生中断错误。

风格用UI_WNDSTYLE_CHILD会报错,用UI_WNDSTYLE_DIALOG/FRAME就不会。
窗体创建代码如下:

    // TODO: 在此添加额外的初始化代码

    if (m_dlgDuilib == NULL)
    {
        m_dlgDuilib.Create(this->m_hWnd, _T("DUIMainFrame1"), UI_WNDSTYLE_CHILD, 0, 0, 0, 800, 600);
        //NULL, UI_WNDSTYLE_DIALOG & (~(WS_BORDER | WS_CAPTION)), 0, 0, 0, 800, 600);
    }
    m_dlgDuilib.CenterWindow();
    m_dlgDuilib.ShowWindow(TRUE);

报错:UIBase.cpp


    void CWindowWnd::CenterWindow()
{
    ASSERT(::IsWindow(m_hWnd));
    ASSERT((GetWindowStyle(m_hWnd)&WS_CHILD)==0);
    RECT rcDlg = { 0 };
        ...
}

中断处:ASSERT((GetWindowStyle(m_hWnd)&WS_CHILD)==0);

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-07-29 02:49
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    在C++中,GetWindowStyle方法返回的是一个整数值,表示窗口的样式。如果窗口是对话框(Dialog)或框架(Frame),那么它将包含边框和标题栏。因此,在CenterWindow方法中,我们不能使用UI_WNDSTYLE_CHILD来设置窗口的样式。

    解决这个问题的方法是在调用Create方法之前先检查窗口是否已经存在。如果窗口已存在,我们可以直接使用SetWindowPos函数将其调整到中心位置,并设置其宽度和高度为800x600。

    以下是修改后的代码:

    if (m_dlgDuilib != NULL) // 如果窗口已存在,无需再次创建
    {
        SetWindowPos(m_dlgDuilib->hWnd, HWND_TOPMOST, 0, 0, 800, 600, SWP_NOMOVE | SWP_NOZORDER); // 设置窗口的位置和大小
        m_dlgDuilib->ShowWindow(SW_SHOWMAXIMIZED); // 展示窗口的最大化状态
    }
    else
    {
        m_dlgDuilib.Create(this->m_hWnd, _T("DUIMainFrame1"), UI_WNDSTYLE_DIALOG | UI_WNDSTYLE_FRAME, 0, 0, 0, 800, 600); // 创建新的窗口并设置样式
        m_dlgDuilib.CenterWindow(); // 调用CenterWindow方法
        m_dlgDuilib.ShowWindow(SW_SHOWMAXIMIZED); // 展示窗口的最大化状态
    }
    

    这段代码首先检查窗口是否存在,然后根据情况选择不同的创建方式。

    评论

报告相同问题?