none
VS2008 SP1でRibbon内のコントロールを操作するには RRS feed

  • 質問

  •  

    プロジェクトウィザードで、Win32アプリケーションを作った時に最初からあるリボンの表示パネル中のステータスバーチェックボックス(CMFCRibbonButtonのCMFCRibbonCheckBox)ですが、このボタンを押した時の動作がわかりません。

    ON_COMMAND関連のmemberFxnをすべてブレークポイントで待ち伏せ設定してもヒットしませんでした。このボタンを押した後はどういう動きをしてステータスバーの表示非表示を実現しているのでしょうか。教えてください。

    2008年11月7日 11:21

回答

  • ポイントはCMainFrame::InitializeRibbon()でチェックボックスを作っている↓の
    Code Snippet

    CMFCRibbonButton* pBtnStatusBar = new CMFCRibbonCheckBox(ID_VIEW_STATUS_BAR, strTemp);

    引数にID_VIEW_STATUS_BARを指定しているところですね。
    これでチェックボックスとステータスバーが連携します。

    MFCをほとんど使ったことがないのでデバッガで追ってみた流れ。
    ・画面でクリック
    ・CWnd::WindowProcがWM_COMMANDを受ける
    ・AfxMDIFrameWndex.cppのCMDIFrameWndEx
    に↓の定義があり、CMDIFrameWndEx::OnPaneCheck表示/非表示の切り替え
    Code Snippet

    BEGIN_MESSAGE_MAP(CMDIFrameWndEx, CWnd)END_MESSAGE_MAP()
     ・・・省略・・・
    ON_UPDATE_COMMAND_UI(ID_VIEW_STATUS_BAR, &CMDIFrameWndEx::OnUpdatePaneMenu)

    ON_COMMAND_EX(ID_VIEW_STATUS_BAR, &CMDIFrameWndEx::OnPaneCheck)

     ・・・省略・・・

    END_MESSAGE_MAP()



    2008年11月8日 13:35

すべての返信

  • ポイントはCMainFrame::InitializeRibbon()でチェックボックスを作っている↓の
    Code Snippet

    CMFCRibbonButton* pBtnStatusBar = new CMFCRibbonCheckBox(ID_VIEW_STATUS_BAR, strTemp);

    引数にID_VIEW_STATUS_BARを指定しているところですね。
    これでチェックボックスとステータスバーが連携します。

    MFCをほとんど使ったことがないのでデバッガで追ってみた流れ。
    ・画面でクリック
    ・CWnd::WindowProcがWM_COMMANDを受ける
    ・AfxMDIFrameWndex.cppのCMDIFrameWndEx
    に↓の定義があり、CMDIFrameWndEx::OnPaneCheck表示/非表示の切り替え
    Code Snippet

    BEGIN_MESSAGE_MAP(CMDIFrameWndEx, CWnd)END_MESSAGE_MAP()
     ・・・省略・・・
    ON_UPDATE_COMMAND_UI(ID_VIEW_STATUS_BAR, &CMDIFrameWndEx::OnUpdatePaneMenu)

    ON_COMMAND_EX(ID_VIEW_STATUS_BAR, &CMDIFrameWndEx::OnPaneCheck)

     ・・・省略・・・

    END_MESSAGE_MAP()



    2008年11月8日 13:35
  • 仕組みがわかりました。はじめてソリューションエクスプローラ内以外のファイルを見ました。

    こんなところも見ないといけないのですね。

    デバッガで追うというのがわからずエクスプローラでAfxMDIFrameWndex.cppを検索して解読し、応用できるようになりました。

    ありがとうございました。

    2008年11月8日 16:07
  •  Sonar_fisx さんからの引用

    デバッガで追うというのがわからずエクスプローラでAfxMDIFrameWndex.cppを検索して解読し、応用できるようになりました。

    折角なので私の行ったデバッガでの追い方を書いておきますね。

    1. CMainFrame::InitializeRibbon()内の適当な位置にブレークポイントを設定して実行

    2.ブレークしたら「呼び出し履歴」ウィンドウを表示し、CWnd::WindowsProcの行をダブルクリック

    3.CWnd::WindowsProc()にブレークポイントを設定

    4.CMainFrame::InitializeRibbon()の中で「ID_VIEW_STATUS_BAR」が使われているところ探して右クリック→「定義へ移動」

    5.ID_VIEW_STATUS_BARが0xE801であることが分かる。

    6.3番のブレークポイントを右クリック→「条件」を選択

    7.条件に「wParam == 0xE801」を入力

      ※ID_VIEW_STATUS_BAR以外の処理でブレークしてしまうと多すぎてしまうので追いたいもののみにしぼってます。

    8.「F5」キーを押してデバッグを続行、画面のステータスバーのチェックボックスを押す。

    9.3番のブレークポイントでブレークするので「F10」キーと「F11」キーで処理の流れを追っていく。

    10.怪しいところにたどり着く

    2008年11月8日 16:40
  • 自力で解決できる範囲が大幅に広がりました。

    詳しく教えて頂きありがとうございました。

     

    2008年11月8日 20:43