Gibt es eine Möglichkeit in meinem ON_COMMAND
-Handler den CMFCRibbonBaseElement*
zu erhalten, der das Ereignis ausgelöst hat?
Nicht direkt, nein. Die WM_COMMAND
-Nachricht wird von CMFCRibbonBaseElement::NotifyCommand
gesendet, und diese Nachricht enthält den Zeiger nicht in ihren Parametern.
Um festzustellen, welcher Rückgängig-Button im ON_COMMAND
-Handler angeklickt wurde, habe ich diese Klasse geschrieben, die von CMFCRibbonUndoButton
erbt. Was dieser Code tut, ist, jedes Mal, wenn einer der Knöpfe angeklickt wird oder das Popup-Menü aktiviert wird, einen Zeiger auf den zuletzt aktivierten Rückgängig-Button zu speichern.
// 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;
}
Verwenden Sie diese Klasse anstelle von CMFCRibbonUndoButton
beim Initialisieren Ihrer Symbolleiste. Rufen Sie in Ihrer Handlerfunktion GetLastActivated()
auf, um diesen Zeiger abzurufen, zum Beispiel:
void CMyTestDoc::OnEditUndo()
{
CMyMFCRibbonUndoButton* pUndoButton =
CMyMFCRibbonUndoButton::GetLastActivated();
ASSERT_VALID(pUndoButton);
if (pUndoButton != NULL)
{
int ActionNumber = pUndoButton->GetActionNumber();
// usw.
}
}
Dies ist sicherlich ein wenig trickreich, aber es war so ziemlich die einzige Möglichkeit, die ich finden konnte, um das Problem zu lösen.
Wie auch immer, ich hoffe, das hilft,
Chris