CDialogEx中的CMFCRibbonBar

时间:2012-11-07 20:44:46

标签: c++ mfc dialog ribbon

在我的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是否可以放在对话框中,但我的搜索结果尚无定论。

1 个答案:

答案 0 :(得分: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,所以这就是问题所在。最重要的是,功能区栏不是设计用于添加到对话框中的。这并不意味着不可能这样做,但至少它将成为一个参与的过程。