Est-il possible dans mon ON_COMMAND
gestionnaire pour obtenir le CMFCRibbonBaseElement*
qui a déclenché l'événement?
Pas directement, non. Le message WM_COMMAND
est envoyé à partir de CMFCRibbonBaseElement::NotifyCommand
et ce message n'inclut pas le pointeur dans ses paramètres.
Pour savoir quel bouton Annuler a été cliqué à partir du gestionnaire ON_COMMAND
, j'ai écrit cette classe, qui hérite de CMFCRibbonUndoButton
. Ce que fait ce code est de stocker un pointeur sur le dernier bouton Annuler à chaque fois que l'un des boutons est cliqué, ou que le menu contextuel est activé.
// 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;
}
Utilisez cette classe à la place de CMFCRibbonUndoButton
lorsque votre barre initialisant de ruban. Dans la fonction de gestionnaire, appelez GetLastActivated()
pour récupérer ce pointeur, par exemple:
void CMyTestDoc::OnEditUndo()
{
CMyMFCRibbonUndoButton* pUndoButton =
CMyMFCRibbonUndoButton::GetLastActivated();
ASSERT_VALID(pUndoButton);
if (pUndoButton != NULL)
{
int ActionNumber = pUndoButton->GetActionNumber();
// etc.
}
}
C'est un peu un hack, certes, mais il était la seule façon que je pouvais trouver pour résoudre le problème.
Quoi qu'il en soit, j'espère que cela aide,
Chris
Pourriez-vous donner un exemple d'ajout du bouton Annuler au QAT? Je n'ai pas travaillé avec MFC depuis un moment, mais il semble très étrange qu'il ne garderait pas l'état cohérent entre les boutons. –
Ajout du code que j'utilise, les boutons sont ajoutés au QAT par ID. Il est basé sur l'exemple de code. – AshleysBrain
Voulez-vous que les deux boutons d'annulation affichent la même liste d'éléments d'annulation?Dans mon application de test, je peux appeler AddUndoAction pour ajouter des éléments au bouton Annuler dans le ruban, mais ces éléments n'apparaissent pas dans le bouton Annuler de la barre d'outils d'accès rapide. J'ai jeté un oeil à travers le code source MFC, et il semble que la solution à votre problème ne sera pas simple. – ChrisN