我的ON_COMMAND
处理程序有没有办法让CMFCRibbonBaseElement*
触发事件的事件发生?
不直接,不。WM_COMMAND
消息是从 发送的,CMFCRibbonBaseElement::NotifyCommand
并且该消息的参数中不包含指针。
为了能够判断从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.
}
}
当然,这有点骇人听闻,但这是我能找到解决问题的唯一方法。
无论如何,我希望这会有所帮助,
克里斯