Опция, которую я нашел успешной, состояла в том, чтобы создать подкласс CMFCRibbonBar, переопределить PreTranslateMessage и проверить наличие щелчков мыши. Ниже приведены шаги, которые я предпринял до сих пор.
- Подкласс CMFCRibbon - в моем примере я создал CCustomRibbonBar
- Переопределите PreTranslateMessage и добавьте значение int, чтобы отслеживать вкладку
- Создайте пользовательское сообщение Windows, которое обрабатывает MainForm ваших приложений -WM_ACTIVE_RIBBON_TAB_CHANGED в моем примере
- Внутри проверки PreTranslateMessage для события Left Mouse Up
- В случае, если левая кнопка мыши нажата, дайте Ленте закончить обработку сообщения и затем запросите активную категорию.
- Опубликовать активную категорию в MainForm (или другой форме)
- В вашей MainForm обработайте категорию и учтите, что с большинством событий категория не изменилась.
Затем в своем переопределении я проверяю событие мыши и получаю категорию Active
Внутриклассная декларация
virtual BOOL PreTranslateMessage(MSG* pMsg);
int m_LastActiveCategory;
Определение класса внутри
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);
}