从MFC CCmdTarget ON_COMMAND

时间:2016-07-24 17:57:46

标签: c++ mfc command handler

我从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

0 个答案:

没有答案