在我的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是否可以放在对话框中,但我的搜索结果尚无定论。
答案 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,所以这就是问题所在。最重要的是,功能区栏不是设计用于添加到对话框中的。这并不意味着不可能这样做,但至少它将成为一个参与的过程。