2 Stimmen

MFC-Band - erhalten Sie das geklickte Basiselement vom Befehl

Ich habe eine CMFCRibbonUndoButton auf dem Ribbon einer MFC-Anwendung. Ich habe einen Handler für den Fall, dass dessen ID angeklickt wird (ON_COMMAND(ID_EDIT_UNDO, ...)). Wenn sich die Schaltfläche auch in der Schnellzugriffsleiste (QAT) befindet, gibt es anscheinend zwei CMFCRubbonUndoButtons, von denen jeder seinen eigenen Zustand behält. Im Befehls-Handler weiß ich nicht, wie ich feststellen kann, welcher angeklickt wurde, und wenn Sie GetActionNumber() beim falschen Button aufrufen, erhalten Sie die falsche Anzahl von rückgängig gemachten Aktionen zurück.

Gibt es eine Möglichkeit, in meinem ON_COMMAND-Handler das CMFCRibbonBaseElement* zu bekommen, das das Ereignis ausgelöst hat?

Bearbeiten: Die Antwort ist mir wichtig, die Frage ist etwas obskur, aber ich setze einen Bonus aus!

Bearbeiten: Hier ist, wie es zur QAT hinzugefügt wird:

CList lstQATCmds;
lstQATCmds.AddTail(ID_EDIT_UNDO);
m_RibbonBar.SetQuickAccessCommands(lstQATCmds);

1voto

ChrisN Punkte 16165

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

0voto

Bruce Ikin Punkte 855

Schauen Sie sich das MSOffice2007Demo in den Visual C++ 2008 Feature Pack Beispielen an

Sie verwenden eine andere Technik, bei der sie eine registrierte Nachricht (AFX_WM_ON_BEFORE_SHOW_RIBBON_ITEM_MENU) abfangen. In diesem Handler wird die Rückgängig-Liste dynamisch neu aufgebaut (ähnlich der alten SDK WM_INITMENUPOPUP-Behandlung).

Der CMFCRibbonUndoButton, der die Nachricht ausgelöst hat, wird im LPARAM der Nachricht übergeben.

Mit dieser Technik können Sie Ihre Rückgängig-Liste unabhängig von den Ribbon-Steuerungen verwalten und die Steuerung als Ansicht in Ihre Liste verwenden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X