3

新しい CMFCToolBar のダイアログに CToolbar を追加する標準的な方法を試しました。しかし、うまくいきません。新しい実装に飛び込む前に、それが実際に可能かどうか知りたいですか?

4

3 に答える 3

8

「標準的な方法」とはどういう意味かわかりませんが、プログラムで確実に実行できます。

// In MyDlg.h
class CMyDlg : public CDialog
{
...
    CMFCToolBar m_ToolBar;
...
};

// In MyDlg.cpp
BOOL CMyDlg::OnInitDialog()
{
...
    if( m_ToolBar.Create( this, AFX_DEFAULT_TOOLBAR_STYLE, 100 ) )
    {
        m_ToolBar.SetPaneStyle( m_ToolBar.GetPaneStyle() 
            & ~(CBRS_GRIPPER | CBRS_SIZE_DYNAMIC | CBRS_BORDER_ANY) );

        m_ToolBar.InsertButton( CMFCToolBarButton( ID_APP_ABOUT, -1, _T("About") ) );
        m_ToolBar.InsertButton( CMFCToolBarButton( ID_APP_EXIT, -1, _T("Exit") ) );

        CSize   sizeToolBar = m_ToolBar.CalcFixedLayout( FALSE, TRUE );
        m_ToolBar.SetWindowPos( NULL, 0, 0, sizeToolBar.cx, sizeToolBar.cy,
            SWP_NOACTIVATE | SWP_NOZORDER );
    }
...
}
于 2009-06-30T20:19:18.950 に答える
1

ダイアログのみのコマンドのみを処理する必要がある場合の秘訣は、SetRouteCommandsViaFrameをFALSEに設定することです。次に、メインフレームの代わりに所有者(通常はダイアログ)がコマンドに使用されます。

于 2013-01-03T10:02:46.740 に答える
1

コマンドがダイアログのみのコマンドである場合を除いて、上記OnInitDialogはうまく機能します。

アプリケーションまたはメインフレーム ハンドラがない場合、ボタンは無効になり、ハンドラは呼び出されません。上記のコードは、ID_APP_ABOUTID_APP_EXITが既にCWinAppExハンドラーを持っているため、正しくルーティングされることに注意してください。

オーバーライドを伴わない回避策はOnCmdMsg、アプリケーションまたはメインフレーム レベルでハンドラーを追加することです。その後、ツールバーはアクティブなままになり、適切なダイアログ ハンドラへの道を正しく見つけます。単純な void ハンドラーを追加すると、CMainFrameこのトリックが実行されます (以下のサンプル コード)。void ハンドラは呼び出されません。

BOOL CMyDlg::OnInitDialog()                    
{                    
    ...  
    m_ToolBar.InsertButton( CMFCToolBarButton( **ID_DLG_COMMAND**, -1, _T("DlgCommand") ) ); 
    ...     
}    

//CMainFrame
BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWndEx)
...
    ON_COMMAND(**ID_DLG_COMMAND**, VoidHandler)
END_MESSAGE_MAP()

void CMainFrame::VoidHandler()
{
    assert(0);
}
于 2012-09-01T02:28:00.300 に答える