关于消息传递时 this指针的问题 MFC高手进

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于消息传递时 this指针的问题 MFC高手进相关的知识,希望对你有一定的参考价值。

当调用一个函数的时候 实际上传入了一个隐性的this指针参数 来明确到底是调用谁的函数(比如基类有个函数A 派生类重写了函数A 那么一个指向A的指针p, p->A();到底是调用基类的A还是派生类的A 全看this了)

小弟在学习命令传递的时候对this有点不明确
有问题2个:
1:
比如CFrameWnd对象获得一个命令消息,按照MFC的消息传递机制,应该先调用CFrameWnd::OnCommand(),然后CFrameWnd::OnCommand()调用CWin::OnCommand();然后CWin::OnCommand()调用OnCmdMsg();这个时候 请问为什么this指针指向CFrameWnd呢?因为书上说是调用了CFrameWnd::OnCmdMsg();而不是CWnd::OnCmdMsg();这里有点不太明白

2:
CFrameWnd();利用pView->OnCmdMsg();调用了OnCmdMsg(); 这个时候肯定调用的是CView::OncmdMsg();然后CView::OncmdMsg()调用CWnd::OnCmdMsg();因为CWnd没有改写OnCmdMsg();所以是调用了基类CCmdTarget::OnCmdMsg();在CCmdTarget::OnCmdMsg()中调用了GetMessageEntry();问题就在这里 请问调用GetMassageEntry();的时候 请问调用的是哪个类的?这个对看懂程序很重要,也就是问 调用该函数的时候 this是指向谁的?CView?CWnd?还是CCmdTarget?

谢谢高手指教 渴望能一步步的教我下 我会追加100分
对不起 第2个问题第一行开头是CFrameWnd 不是CFrameWnd();

1. 首先,我们必须应该知道CFrameWnd::OnCommand()这个函数是个虚函数,言外之意,一般来说,CFrameWnd的所有基类的OnCommand()函数都不可能被显式的调用了。当然了,在CFrameWnd::OnCommand()函数的内部,又调用了CWnd::OnCommand()函数,其实也就是把系统消息传递给基类CWnd去处理。
你所关心的问题是this指针为什么指向CFrameWnd,其实this指针并没有指向它,而是指向了CMainFrame这个对象,假如你使用的是单文档架构的话。而我们说CMainFrame所生成的对象包含了CFrameWnd对象,而CFrameWnd对象又包含了CWnd对象,所以当this指针指向CMainFrame对象的时候,已经同时指向了它所有的基类。而我们知道OnCmdMsg()函数又是一个虚函数,由于多态的原因,this指针的vptr(虚函数表指针)所指向的CFrameWnd中的所有虚函数,从而此时this指针所能获得的OnCmdMsg()函数的确是属于CFrameWnd类的。
2. 这个问题与1应该说是很相似了,this指针总是指向你所创建的对象本身,并同时指向它所有的基类,而由于运行时多态的存在,其实也就是虚函数的存在,使this指针所能访问到的函数会改变。从而此时的this指针指向你的工程中的CXxxxView对象,而作为CView基类的CCmdTarget类,它的所有成员函数都是属于CXxxxView的,CXxxxView可以随意的访问任意一个非私有的成员函数与变量。
参考技术A 去把重载、覆盖、虚函数看一下这个问题你就知道了

关于Visual Studio 2010中MFC工程的消息WM_INITDIALOG找不到的问题

学习孙鑫的那个深入详解C++视频时,有一处给编辑框空间改写窗口过程函数的例子,其中需要添加一个WM_INITDIALOG消息响应函数,但在类向导的消息栏下找不到WM_INITDIALOG消息。解决方法如下:

1、给你的对话框添加相应的映射类;
2、在“类视图”中选中该对话框的映射类 ;
3、右键点击,选择“属性”,在属性视图中切换到“重写”选项,即可找到OnInitDialog,点击选出OnInitDialog()函数即可。

以上是关于关于消息传递时 this指针的问题 MFC高手进的主要内容,如果未能解决你的问题,请参考以下文章

关于MFC中的CClientDC的问题

哪位高手能告诉我这个新手下面那个关于MFC的简单问题

在 MFC 中捕获鼠标指针形状更改事件

类成员在实例初始化时需要这个指针

请教高手一个关于CMFCPropertyGridCtrl消息处理的问题

重构 MFC 消息映射以包含完全限定的成员函数指针