2017-08-04 5 views
1

ホームリボンボタンの変な動作に直面しました。
リボンコントロールを持つOfficeテンプレートを使用してVisual Studio 2010で標準のMFCアプリケーションを作成しました。しかし、上の位置でHomeリボンボタンをダブルクリックすると、アプリケーションが閉じられます。
標準的なMFCアプリケーションハンドラの動作と、それをどのように変更できるのか教えてください。
私はPrevent double click on MFC-Dialog buttonを見ましたが、私のケースには適用できませんでした(もっと明確に - ダブルクリックハンドラをリボンのホームボタンに追加する方法がわかりません)。MFCのリボンのホームボタンがダブルクリックでアプリを閉じる

答えて

0

CMFCRibbonApplicationButtonはそうWM_LBUTTONDBLCLKのメッセージを処理できないのCWndに由来しません。 1つの解決策は、CMFCRibbonBarから派生するものです。

class CCustomRibbonBar : public CMFCRibbonBar 
{ 
    // ... 
protected: 
    DECLARE_MESSAGE_MAP() 
    afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point); 
}; 


BEGIN_MESSAGE_MAP(CCustomRibbonBar, CMFCRibbonBar) 
    ON_WM_LBUTTONDBLCLK() 
END_MESSAGE_MAP() 

void CCustomRibbonBar::OnLButtonDblClk(UINT nFlags, CPoint point) 
{ 
    CMFCRibbonBaseElement* pHit = HitTest(point); 
    if (pHit->IsKindOf(RUNTIME_CLASS(CMFCRibbonApplicationButton))) 
    { 
     // the user double-clicked in the application button 
     // do what you want here but do not call CMFCRibbonBar::OnLButtonDblClk 
     return; 
    } 
    CMFCRibbonBar::OnLButtonDblClk(nFlags, point); 
} 

別の解決策:CMainFrameクラスでオーバーライドのPreTranslateMessage

BOOL CMainFrame::PreTranslateMessage(MSG* pMsg) 
{ 
    if ((WM_LBUTTONDBLCLK == pMsg->message) && (pMsg->hwnd == m_wndRibbonBar)) 
    { 
     CPoint point(pMsg->pt); 
     m_wndRibbonBar.ScreenToClient(&point); 
     CMFCRibbonBaseElement* pHit = m_wndRibbonBar.HitTest(point); 
     if (pHit && pHit->IsKindOf(RUNTIME_CLASS(CMFCRibbonApplicationButton))) 
     { 
      // do what you want but do not call CMDIFrameWndEx::PreTranslateMessage 
      return TRUE; // no further dispatch 
     } 
    } 
    return CMDIFrameWndEx::PreTranslateMessage(pMsg); 
} 
0
  1. CMFCRibbonApplicationButtonの独自の派生クラスを生成します。
  2. CMFCRibbonApplicationButton :: OnLButtonDblClkのメッセージハンドラを作成する
  3. ダブルクリックで何をしたいのか独自の実装を提供します。何も起こらなければ、体を空のままにしておきます。
  4. CMainFrameには、CMFCRibbonApplicationButton m_MainButtonの定義があります。実装にクラス名を置き換えます。
関連する問題