Есть ли способ в моем ON_COMMAND
обработчика, чтобы получить CMFCRibbonBaseElement*
, что уволил событие?
Не напрямую, нет. Сообщение WM_COMMAND
отправляется с CMFCRibbonBaseElement::NotifyCommand
, и это сообщение не содержит указатель в его параметрах.
Для того, чтобы узнать, какая кнопка Undo была нажата из обработчика ON_COMMAND
, я написал этот класс, который наследует CMFCRibbonUndoButton
. Что делает этот код, так это сохранение указателя на последнюю активированную кнопку «Отменить» при каждом нажатии одной из кнопок или всплывающее меню.
// CMyMFCRibbonUndoButton.h
class CMyMFCRibbonUndoButton : public CMFCRibbonUndoButton
{
DECLARE_DYNCREATE(CMyMFCRibbonUndoButton)
public:
CMyMFCRibbonUndoButton();
CMyMFCRibbonUndoButton(UINT nID, LPCTSTR lpszText,
int nSmallImageIndex = -1, int nLargeImageIndex = -1);
virtual void OnClick(CPoint point);
virtual void OnShowPopupMenu();
static CMyMFCRibbonUndoButton* GetLastActivated();
private:
static CMyMFCRibbonUndoButton* s_pLastActivated;
};
// CMyMFCRibbonUndoButton.cpp
IMPLEMENT_DYNCREATE(CMyMFCRibbonUndoButton, CMFCRibbonUndoButton)
CMyMFCRibbonUndoButton* CMyMFCRibbonUndoButton::s_pLastActivated = NULL;
CMyMFCRibbonUndoButton::CMyMFCRibbonUndoButton()
{
}
CMyMFCRibbonUndoButton::CMyMFCRibbonUndoButton(UINT nID, LPCTSTR lpszText,
int nSmallImageIndex, int nLargeImageIndex) :
CMFCRibbonUndoButton(nID, lpszText, nSmallImageIndex, nLargeImageIndex)
{
}
void CMyMFCRibbonUndoButton::OnClick(CPoint point)
{
s_pLastActivated = this;
CMFCRibbonUndoButton::OnClick(point);
}
void CMyMFCRibbonUndoButton::OnShowPopupMenu()
{
s_pLastActivated = this;
CMFCRibbonUndoButton::OnShowPopupMenu();
}
CMyMFCRibbonUndoButton* CMyMFCRibbonUndoButton::GetLastActivated()
{
return s_pLastActivated;
}
Используйте этот класс вместо CMFCRibbonUndoButton
при инициализации вашей панели ленты. В функции обработчика, вызовите GetLastActivated()
, чтобы получить этот указатель, например:
void CMyTestDoc::OnEditUndo()
{
CMyMFCRibbonUndoButton* pUndoButton =
CMyMFCRibbonUndoButton::GetLastActivated();
ASSERT_VALID(pUndoButton);
if (pUndoButton != NULL)
{
int ActionNumber = pUndoButton->GetActionNumber();
// etc.
}
}
Это немного рубить, конечно, но это было почти единственным способом я мог найти, чтобы решить эту проблему.
Во всяком случае, я надеюсь, что это помогает,
Крис
Не могли бы вы привести пример того, как вы добавляете кнопку «Отменить» в QAT? Я не работал с MFC через некоторое время, но, похоже, очень странно, что он не будет поддерживать согласованное состояние между кнопками. –
Добавлен код, который я использую, кнопки добавляются в QAT по ID. Он основан на образце кода. – AshleysBrain
Вы хотите, чтобы обе кнопки отмены отображали тот же список элементов отмены?В моем тестовом приложении я могу вызвать AddUndoAction, чтобы добавлять элементы к кнопке отмены на ленте, но эти элементы не отображаются в кнопке отмены на панели быстрого доступа. Я просмотрел исходный код MFC, и кажется, что решение вашей проблемы не будет простым. – ChrisN