传统方式 1. XXDoc.h //... class CXXDoc : public CDocument { //... // Operations public: void Foo1(); void Foo2(); void Foo3(); //... }; 2. XXDoc.cpp //... void CXXDoc::Foo1() { // Do Foo1 } void CXXDoc::Foo2() { // Do Foo2 } void CXXDoc::Foo3() { // Do Foo3 } 3. XXView.h //... class CXXView : public CView { //... protected: //... afx_msg void OnFoo1(); afx_msg void OnFoo2(); afx_msg void OnFoo3(); //... }; 4. XXView.cpp //... void CXXView::OnFoo1() { GetDocument()->Foo1(); Invalidate(); } void CXXView::OnFoo2() { GetDocument()->Foo2(); Invalidate(); } void CXXView::OnFoo3() { GetDocument()->Foo3(); Invalidate(); } 新方式 1. XXDoc.h #include <boost/signals2.hpp> //... class CXXDoc : public CDocument { //... // Attributes public: boost::signals2::signal<void()> m_sigDocChanged; // Operations public: void Foo1(); void Foo2(); void Foo3(); //... }; 2. XXDoc.cpp //... void CXXDoc::Foo1() { // Do Foo1 m_sigDocChanged(); } void CXXDoc::Foo2() { // Do Foo2 m_sigDocChanged(); } void CXXDoc::Foo3() { // Do Foo3 m_sigDocChanged(); } 3. XXView.h //... class CXXView : public CView { //... public: virtual void OnInitialUpdate(); protected: void OnDocChanged(); //... afx_msg void OnFoo1(); afx_msg void OnFoo2(); afx_msg void OnFoo3(); //... }; 4. XXView.cpp //... void CXXView::OnInitialUpdate() { CView::OnInitialUpdate(); GetDocument()->m_sigDocChanged.connect(std::bind(&CXXView::OnDocChanged, this)); } void CXXView::OnDocChanged() { Invalidate(); } void CXXView::OnFoo1() { GetDocument()->Foo1(); } void CXXView::OnFoo2() { GetDocument()->Foo2(); } void CXXView::OnFoo3() { GetDocument()->Foo3(); }