有沒有在我的ON_COMMAND
處理的方式來獲取觸發事件的CMFCRibbonBaseElement*
?
不直接,沒有。 WM_COMMAND
消息從CMFCRibbonBaseElement::NotifyCommand
發送,並且此消息不包含其參數中的指針。
爲了能夠確定從ON_COMMAND
處理程序中點擊了哪個Undo按鈕,我編寫了這個類,它繼承了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.
}
}
這是一個黑客位的,肯定的,但它是關於我能找到解決問題的唯一途徑。
無論如何,我希望這會有所幫助,
克里斯
您能舉一個例子說明如何將撤消按鈕添加到QAT?我有一段時間沒有用過MFC,但似乎很奇怪它不會保持按鈕之間的狀態一致。 – 2010-08-01 02:21:44
添加了我使用的代碼,按鈕通過ID添加到QAT。它基於示例代碼。 – AshleysBrain 2010-08-01 14:44:23
你是否希望兩個撤銷按鈕都顯示相同的撤消項目列表?在我的測試應用程序中,我可以調用AddUndoAction將項目添加到功能區中的撤消按鈕,但這些項目不會顯示在快速訪問工具欄的撤消按鈕中。我瀏覽了MFC源代碼,看來問題的解決方案並不簡單。 – ChrisN 2010-08-01 21:44:51