Как использовать категорию ленты для переключения просмотра? - PullRequest
0 голосов
/ 09 октября 2010

Я хочу использовать две кнопки категории ленты для переключения между двумя различными представлениями, но я обнаружил, что невозможно добавить обработчик событий к кнопке.

Есть ли подсказка для решения этой проблемы?Лучше, если есть образец, на самом деле я новичок в MFC.

Ответы [ 2 ]

2 голосов
/ 07 июня 2011

Вы можете попробовать подключиться к этому событию?

AFX_WM_ON_CHANGE_RIBBON_CATEGORY

0 голосов
/ 02 апреля 2013

Опция, которую я нашел успешной, состояла в том, чтобы создать подкласс CMFCRibbonBar, переопределить PreTranslateMessage и проверить наличие щелчков мыши. Ниже приведены шаги, которые я предпринял до сих пор.

  1. Подкласс CMFCRibbon - в моем примере я создал CCustomRibbonBar
  2. Переопределите PreTranslateMessage и добавьте значение int, чтобы отслеживать вкладку
  3. Создайте пользовательское сообщение Windows, которое обрабатывает MainForm ваших приложений -WM_ACTIVE_RIBBON_TAB_CHANGED в моем примере
  4. Внутри проверки PreTranslateMessage для события Left Mouse Up
  5. В случае, если левая кнопка мыши нажата, дайте Ленте закончить обработку сообщения и затем запросите активную категорию.
  6. Опубликовать активную категорию в MainForm (или другой форме)
  7. В вашей 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);
}
...