代码之家  ›  专栏  ›  技术社区  ›  AshleysBrain

MFC功能区-从命令中单击获取基本元素

  •  2
  • AshleysBrain  · 技术社区  · 14 年前

    我在MFC应用程序的功能区上有一个CMFCribbonEndoButton。我有一个处理程序,当它的ID被单击时( ON_COMMAND(ID_EDIT_UNDO, ...) GetActionNumber() 在错误的情况下,返回的撤消操作的数目是错误的。

    我有什么办法吗 ON_COMMAND 处理程序获取 CMFCRibbonBaseElement*

    编辑:下面是如何添加到QAT中的:

    CList<UINT, UINT> lstQATCmds;
    lstQATCmds.AddTail(ID_EDIT_UNDO);
    m_RibbonBar.SetQuickAccessCommands(lstQATCmds);
    
    2 回复  |  直到 14 年前
        1
  •  1
  •   ChrisN    14 年前

    ON_COMMAND 处理程序获取 CMFCRibbonBaseElement* 引发了这次事件?

    WM_COMMAND CMFCRibbonBaseElement::NotifyCommand ,并且此消息的参数中不包含指针。

    能够分辨从 ON\ U命令 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.
        }
    }
    

    不管怎样,我希望这有帮助,

    克里斯

        2
  •  0
  •   Bruce Ikin    14 年前

    Visual C++ 2008 Feature Pack examples

    他们使用一种不同的技术,在这个处理程序中捕获一个注册的消息(AFX\u WM\u ON\u BEFORE\u SHOW\u RIBBON\u ITEM\u MENU),动态地重建撤消列表(类似于旧的SDK WM\u INITMENUPOPUP处理)。

    引发消息的CMFCRibbonUndoButton在消息的LPARAM中传递。

    使用此技术,可以独立于功能区控件维护撤消列表,并将该控件用作列表的视图。