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é.
- CMFCRibbon Sous-classe - dans mon exemple, je crée
- Override PreTranslateMessage CCustomRibbonBar, et ajouter une valeur int pour garder la trace de l'onglet
- Créez des fenêtres personnalisées message qui gère vos applications MainForm -WM_ACTIVE_RIBBON_TAB_CHANGED dans mon exemple
- À l'intérieur de PreTranslateMessage vérifier l'événement Left Mouse Up
- Dans le cas d'un bouton gauche de la souris, laissez le ruban terminer la gestion du message, puis interroger la catégorie active.
- Post la catégorie active à MainForm (ou autre formulaire)
- 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);
}