MFC将数据从CViewTree传递到CFormView

时间:2017-05-28 07:19:58

标签: c++ mfc

我有一个基于CView类的MFC应用程序。

我需要在CViewTree之间传递数据到主视图

pDocTemplate = new CSingleDocTemplate(
    IDR_MAINFRAME,
    RUNTIME_CLASS(CMFCApplication1Doc),
    RUNTIME_CLASS(CMainFrame),       // <-- the CViewTree  is here
    RUNTIME_CLASS(CMFCApplication1View)); // <-- the main view (CFormView) is here

有什么建议吗?

2 个答案:

答案 0 :(得分:0)

定义您自己的消息,然后使用AfxGetApp()->m_pMainWnd->SendMessage(MY_MESSAGE)。 在CFormView(CMainView ??)中处理MY_MESSAGE并在必要时强制转换为派生的CFormView。

答案 1 :(得分:0)

一个一般的例子 - 在一个虚拟项目中尝试它,然后进行屠宰&#39;你的主要应用程序。

1a)将数据放入文档类中。每当修改数据时,请致电UpdateAllViews

1b)添加一个特殊功能,从任何地方抓取文档 在你的应用程序中。

// Data class
class Item : public CObject
{
    // your data here
};

class MyDocument : public CDocument
{
public:

    // Get the document from 'anywhere' for SDI projects
    // See:
    // http://asg.unige.ch/Past/fuentes/Mfc/HowTo_8.html
    // http://forums.codeguru.com/showthread.php?473808-MFC-Doc-View-How-to-get-the-active-document-anywhere-in-my-application

    static MyDocument* GetDoc()
    {
        auto frame = (CFrameWnd*)(AfxGetApp()->m_pMainWnd);
        return (MyDocument*)frame->GetActiveDocument();
    }

    static const int HintItemAdded = 1;
    // Add other hint constants here

    // Data functions
    void AddItem(Item const& item)
    {
        m_items.Add(item);

        // Call this if you need it    
        SetModifiedFlag();

        // Notify views that data has changed (via CView::OnUpdate)
        UpdateAllViews(nullptr, HintItemAdded,
            &m_items[m_items.GetUpperBound()]);
    }

    // Functions for inserting, updating, getting, removing data, etc.

private:
    CArray<Item> m_items;  // data
};

2)使用文档操作命令处理程序中的数据:

// This handler could be in the document, a view (use GetDocument to get
// doc), frame (use GetActiveDocument to get doc), etc. If outside of
// those, use your special 'anywhere' function

void SomeClass::OnAddItemCommandHandler()
{
   CAddItemDlg dlg; // dialog that allows user input
   if (dlg.DoModal() == IDOK)
   {
      // use the 'anywhere' function
      auto doc = MyDocument::GetDoc();

      // use the user input to create new item and pass it to
      // the document
      doc->AddItem(dlg.GetNewItem());
   }
}

3)确保您的视图具有OnUpdate处理程序。这被调用了    CDocument :: UpdateAllViews函数。

class MyView : public CFormView
{
    void OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint) override
    {
        CFormView::OnUpdate(pSender, lHint, pHint);

        // Just added a new item. pHint points to the new item
        if (lHint == MyDocument::HintItemAdded)    
        {
            auto newItem = (Item*)(pHint);

            // Add the new item to a list box
            m_listBox.AddString(newItem.GetText());
        }
   }

   CListBox m_listBox;
}