我从CCmdTarget派生了一个类,因为我想在单击功能区按钮时使用此类调用其他方法。因此,使用ON_COMMAND和ON_UPDATE_COMMAND_UI,这些方法在非MFC类中,因此使用它作为桥接,因为代码是非gui /视图特定的。我已经使用类向导生成类,并在应用程序InitInstance中创建类的实例。该类已创建但我没有得到命令处理程序消息,它们在其他MFC类中看到,而不是在我直接从CCmdTarget派生的这个类中。我还在派生类中重写了OnCmdMsg,这永远不会被调用。我在这里错过了什么吗?好像这个类没有注册接收命令处理程序消息?
标题
#pragma once
#include <memory>
namespace NM
{
class ISelectedObjects;
}
class CGuiBridge :
public CCmdTarget
{
DECLARE_DYNAMIC(CGuiBridge)
public:
CGuiBridge();
virtual ~CGuiBridge();
#ifdef _DEBUG
virtual void AssertValid() const;
#ifndef _WIN32_WCE
virtual void Dump(CDumpContext& dc) const;
#endif
#endif
private:
::std::unique_ptr<NM::ISelectedObjects> _pSelectedObjects;
protected:
DECLARE_MESSAGE_MAP()
public:
//virtual BOOL OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo);
afx_msg void OnSelectedClear();
afx_msg void OnUpdateSelectedClear(CCmdUI *pCmdUI);
};
CPP
IMPLEMENT_DYNAMIC(CGuiBridge, CCmdTarget)
extern ::NM::Registry::IServiceRegistry* reg;
CGuiBridge::CGuiBridge()
{
_pSelectedObjects.reset(reinterpret_cast<NM::ISelectedObjects*>(reg->GetClientInterface(L"SELECTEDOBJECTS")));
if (!_pSelectedObjects)
throw ::std::runtime_error("Selected Objects Service Not Available, Cannot Continue.");
}
CGuiBridge::~CGuiBridge()
{
}
BEGIN_MESSAGE_MAP(CGuiBridge, CCmdTarget)
ON_COMMAND(IDC_SELECTED_CLEAR, &CGuiBridge::OnSelectedClear)
ON_UPDATE_COMMAND_UI(IDC_SELECTED_CLEAR, &CGuiBridge::OnUpdateSelectedClear)
END_MESSAGE_MAP()
// CGuiBridge message handlers
//BOOL CGuiBridge::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo)
//{
// switch (nID)
// {
// case IDC_SELECTED_CLEAR:
// {
// if (nCode == CN_UPDATE_COMMAND_UI)
// {
// CCmdUI* pCmdUI = (CCmdUI*)pExtra;
// pCmdUI->Enable( _pSelectedObjects->SelectedCount() > 0 ? TRUE : FALSE);
// return TRUE;
// }
// if (nCode == CN_COMMAND)
// {
// _pSelectedObjects->Clear();
// return TRUE;
// }
// }
// break;
// }
//
// return CCmdTarget::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
//}
void CGuiBridge::OnSelectedClear()
{
_pSelectedObjects->Clear();
}
void CGuiBridge::OnUpdateSelectedClear(CCmdUI *pCmdUI)
{
pCmdUI->Enable(_pSelectedObjects->SelectedCount() > 0 ? TRUE : FALSE);
}
#ifdef _DEBUG
void CGuiBridge::AssertValid() const
{
CCmdTarget::AssertValid();
}
#ifndef _WIN32_WCE
void CGuiBridge::Dump(CDumpContext& dc) const
{
CCmdTarget::Dump(dc);
}
#endif
#endif //_DEBUG