2010-10-09 5 views
0

Je souhaite utiliser deux boutons de catégorie de ruban pour basculer entre deux vues différentes, mais j'ai trouvé qu'il ne peut pas ajouter de gestionnaire d'événements au bouton.comment utiliser la catégorie de ruban pour changer de vue?

Y at-il un indice pour résoudre ce problème? Mieux s'il y a un échantillon, en fait je suis nouveau à MFC.

Répondre

2

Vous pourriez essayer de vous accrocher à cet événement?

AFX_WM_ON_CHANGE_RIBBON_CATEGORY

0

Une option que j'ai trouvé avec succès était de sous-classe CMFCRibbonBar et passer outre PreTranslateMessage et vérifier les clics de souris. Voici les mesures que j'ai prises qui ont jusqu'ici bien fonctionné.

  1. CMFCRibbon Sous-classe - dans mon exemple, je crée
  2. Override PreTranslateMessage CCustomRibbonBar, et ajouter une valeur int pour garder la trace de l'onglet
  3. Créez des fenêtres personnalisées message qui gère vos applications MainForm -WM_ACTIVE_RIBBON_TAB_CHANGED dans mon exemple
  4. À l'intérieur de PreTranslateMessage vérifier l'événement Left Mouse Up
  5. Dans le cas d'un bouton gauche de la souris, laissez le ruban terminer la gestion du message, puis interroger la catégorie active.
  6. Post la catégorie active à MainForm (ou autre formulaire)
  7. Dans votre MainForm, gérer la catégorie et prendre en compte qu'avec la plupart des événements la catégorie n'aura pas changé.

Puis dans mon override je vérifie la souris vers le haut événement et récupérer la catégorie active

Déclaration intérieur Classe

virtual BOOL PreTranslateMessage(MSG* pMsg); 
    int m_LastActiveCategory; 

classe à l'intérieur Définition

BOOL CCustomRibbonBar::PreTranslateMessage(MSG* pMsg) 
{ 
    //If command was finishing a click 
    if(pMsg->message == WM_LBUTTONUP && pMsg->wParam == 0) 
    { 

     //Allow ribbon to handle itself first 
     BOOL result = CMFCRibbonBar::PreTranslateMessage(pMsg); 

     //Get new active tab 
     int activeTab = GetCategoryIndex(GetActiveCategory()); 

     //If tab has changed, forward message 
     if(activeTab != m_LastActiveCategory) 
     { 
       //forward message to parent 
      ::SendMessage(GetParentFrame()->GetSafeHwnd(),WM_ACTIVE_RIBBON_TAB_CHANGED,activeTab,0); 
      m_LastActiveCategory = activeTab; 
     } 



     return result; 
    } 

    //Otherwise handle like normal 
    return CMFCRibbonBar::PreTranslateMessage(pMsg); 
} 
Questions connexes