イベントを発生させたON_COMMAND
ハンドラを取得する方法はありますか?CMFCRibbonBaseElement*
直接ではありません。WM_COMMAND
メッセージは から送信されましたが、このCMFCRibbonBaseElement::NotifyCommand
メッセージのパラメータにはポインタが含まれていません。
ON_COMMAND
どの元に戻すボタンがクリックされたかをハンドラーから判別できるようにするために、 を継承するこのクラスを作成しCMFCRibbonUndoButton
ました。このコードが行うことは、ボタンの 1 つがクリックされるか、ポップアップ メニューがアクティブになるたびに、最後にアクティブ化された [元に戻す] ボタンへのポインターを格納することです。
// 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.
}
}
これは確かにちょっとしたハックですが、問題を解決するために私が見つけた唯一の方法でした。
とにかく、これが役に立てば幸いです。
クリス