Отключить / включить кнопки ленты для пакета функций MFC

Я использую пакет функций MFC, и у меня есть несколько кнопок на ленте, экземпляры CMFCRibbonButton. Проблема в том, что я хотел бы включать и отключать некоторые из них в определенных условиях, но во время выполнения. Как я могу это сделать? потому что для этого нет специального метода ... Я слышал, что решением было бы прикрепить / отсоединить обработчики событий во время выполнения, но я не знаю, как ...


person melculetz    schedule 02.02.2009    source источник


Ответы (2)


При создании объекта CMFCRibbonButton необходимо указать связанный идентификатор команды (см. Документацию для конструктора CMFCRibbonButton здесь). Включение и отключение кнопок ленты затем выполняется с помощью обычного механизма обновления команд в MFC с использованием CCmdUI класс.

Например, если у вас есть кнопка ленты с идентификатором команды ID_MYCOMMAND и вы хотите обрабатывать эту команду в классе представления вашего приложения, вам следует добавить в класс следующие функции:

// MyView.h
class CMyView : public CView {
    // ...
    private:
        afx_msg void OnMyCommand();
        afx_msg void OnUpdateMyCommand(CCmdUI* pCmdUI);
        DECLARE_MESSAGE_MAP()
};

и реализуем их в файле .cpp:

// MyView.cpp
void CMyView::OnMyCommand() {
    // add command handler code.
}

void CMyView::OnUpdateMyCommand(CCmdUI* pCmdUI) {
    BOOL enable = ...; // set flag to enable or disable the command.
    pCmdUI->Enable(enable);
}

Вам также следует добавить записи ON_COMMAND и ON_UPDATE_COMMAND_UI в карту сообщений для класса CMyView:

// MyView.cpp
BEGIN_MESSAGE_MAP(CMyView, CView)
    ON_COMMAND(ID_MYCOMMAND, &CMyView::OnMyCommand)
    ON_UPDATE_COMMAND_UI(ID_MYCOMMAND, &CMyView::OnUpdateMyCommand)
END_MESSAGE_MAP()

Для получения дополнительной информации о картах сообщений в MFC см. TN006: карты сообщений в MSDN.

Надеюсь, это поможет!

person ChrisN    schedule 02.02.2009

ChrisN дал довольно точный ответ. Вы можете увидеть пример того, как именно это делается, загрузив VS2008 Sample Pack из здесь и откройте решение MSOffice2007Demo.

При запуске примера посмотрите на флажок «Эскизы» на вкладке «Просмотр» на ленте, он отключен.

Это контролируется CMSOffice2007DemoView::OnUpdateViewThumb, который вызывает pCmdUI->Enable(FALSE);. Вы можете изменить это на вызов TRUE или FALSE во время выполнения, чтобы включить / выключить кнопку соответственно.

person demoncodemonkey    schedule 02.02.2009