0

在我的 CDialogEx 类中,我试图插入一个 CMFCRibbonBar,但我得到一个 NULL 指针异常(我的 try/catch 块没有捕获到):

BOOL CmfcRibbonTestDlg::OnInitDialog()
{
    CDialogEx::OnInitDialog();

    // Set the icon for this dialog.  The framework does this automatically
    //  when the application's main window is not a dialog
    SetIcon(m_hIcon, TRUE);         // Set big icon
    SetIcon(m_hIcon, FALSE);        // Set small icon

    // TODO: Add extra initialization here
    try
    {
        m_wndRibbonBar.Create(this);
        m_wndRibbonBar.LoadFromResource(IDR_RIBBON1);
    }
    catch( std::exception& exc )
    {
        this->MessageBoxA(exc.what(), "Couldn't create ribbon");
    }

    return TRUE;  // return TRUE  unless you set the focus to a control
}

确切的异常说:“mfcRibbonTest.exe 中 0x00d191db 处的未处理异常:0xC0000005:访问冲突读取位置 0x00000000”并在 afxribbonbar.cpp:964 中中断。

我进行了多次搜索以查看 CMFCRibbonBar 是否可以放置在对话框中,但我的搜索没有结果。

4

1 回答 1

0

如果您查看 afxribbonbar.cpp,第 964 行,您将看到:

LRESULT CMFCRibbonBar::OnPostRecalcLayout(WPARAM,LPARAM)
{
    GetParentFrame()->RecalcLayout();
    return 0;
}

这应该会提示您问题所在:GetParentFrame() 返回 NULL。通过查看http://msdn.microsoft.com/en-us/library/6f45sskz(v=vs.100).aspx上的文档,我们看到:“成员函数向上搜索父链,直到 CFrameWnd(或派生类)对象被发现。”

在您的情况下,没有任何 CFrameWnd,所以这就是问题所在。底线是功能区栏并非设计用于添加到对话框中。这并不意味着它不可能做到,但至少这将是一个涉及的过程。

于 2012-11-09T04:29:08.580 回答