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 に答える