В моем классе 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
}
Точное исключение говорит: «Необработанное исключение в 0x00d191db в mfcRibbonTest.exe: 0xC0000005: Место чтения нарушения доступа 0x00000000» и разрывается в afxribbonbar.cpp: 964.
Я сделал несколько поисков, чтобы увидеть, можно ли поместить CMFCRibbonBar в диалог, но мои поиски были неокончательными.
Если вы посмотрите на 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, так что это проблема. Суть в том, что полосы ленты не предназначены для добавления в диалоги. Это не значит, что это невозможно делать, но, по крайней мере, это будет вовлеченный процесс.
Других решений пока нет …