求讨论DECLARE_DYNAMIC宏 达到是什么作用?自定义view中为啥不会自动生成
DECLARE_DYNAMIC和IMPLEMENT_DYNAMIC宏
今天碰到一个问题,后来有朋友提醒可能是宏的问题,推荐看深入浅出MFC,按照第三章上写的是DECLARE_DYNAMIC宏 的问题, 但是不明白,还是来问问大家,希望能够更好的理解,具体问题如下:
首先自定义个CXView类,它继承于CView类, 然后再自定义一个CRView类继承于CXView类, 此时这个CRView类中不会自动生成DECLARE_DYNAMIC和IMPLEMENT_DYNAMIC宏 导致在主窗口类中用CRView实例来调用它的一个虚函数无效如:
CRView *m_RView;
m_RView = (CRView *) RUNTIME_CLASS(CRView)->CreateObject();
m_RView->Create(NULL,NULL,WS_CHILD|WS_VISIBLE,R,m_pFrame,T,&context);
m_RView->OnInitialUpdate();
如果不加DECLARE_DYNAMIC和IMPLEMENT_DYNAMIC宏的话,则执行到m_RView->OnInitialUpdate();时,它直接跳到viewcore.cpp中的OnInitialUpdate去了,并且执行完后,不再回来执行CRView自己的OnInitialUpdate,而是顺着程序往下走了, 但是加上上面的这两个宏之后,它在执行完viewcore.cpp中的OnInitialUpdate后,接着就回来执行CRView自己的OnInitialUpdate了, 书上说因为是动态创建的视图类,所以要加上这个标识宏, 但是我不明白什么意思, 只是加上了确实解决了问题, 想问问有哪位朋友能帮忙解释一下嘛,这样下次的时候就会具体知道是怎么回事了, 谢谢。
[解决办法]
建议好好看看深入浅出mfc,上边有相当详细的解释,我具体的细节记不清了,大致就是
mfc没有采用C++的继承来表示继承,因为当时处于性能的考虑。
系统的底层并不存在一个面向对象的表示,所以很多情况下,比如cwnd表示一个窗口,cview也是
而win32程序并没有cwnd,把一个cwnd表示为一个Hwnd好办,反过来呢,还有消息的传递如何进行,怎么让子类接到的消息依次传递给父类,这就需要那几个宏了
[解决办法]
宏观来讲就是要让这个类支持动态创建
因为有这句
CMultiDocTemplate* pDocTemplate;
pDocTemplate = new CMultiDocTemplate(
IDR_MDITYPE,
RUNTIME_CLASS(CMDIDoc),
RUNTIME_CLASS(CChildFrame), // custom MDI child frame
RUNTIME_CLASS(CMDIView));
AddDocTemplate(pDocTemplate);