小弟最近在啃<<深入浅出mfc>>,是个实在的vc入门者!
看书学习过程用出现了几个问题!
想请大家帮忙解决一下!
相信看过<<深入浅出mfc>>的战友门,一定对第三章 mfc 六大技术的模拟影象十分深刻!
小弟这章已经看了第二遍了,看书中过多的感情就不在这里倾诉了。有几个问题一直不解!
一。(RTTI)中有个重要的概念是"动态识别"IsKindOf();
这个问题我已经问了自己好多遍了,为什么要动态识别呢?在整个mfc的框架中,这个函数肯定是
提供一种识别的服务,应用在mfc程序的什么位置呢?什么情况下需要使用IsKindOf(),请从框架的角度帮我解释一下!
二。Command Routing(消息饶行)
1。在整个mfc的消息流动过程中,出现了两个虚函数!OnCommand() OnCmdMsg()
其中OnCommand()中会出现调用OnCmdMsg()这个函数的情况。
我的问题是:OnCommand() 和 OnCmdMsg()在意义上有什么不同,他们的应用领域
个是什么?
2。关于this指针的问题
书150页,CWnd* pwnd;
pwnd->WindowProc()//调用CWnd::WindowProc();
书在解释一下代码的时候
BOOL CWnd::OnCommand()
{
...
return OnCmdMsg(0,0);
}
的时候解释说根据this指针的不同出现4中情况,
分别是
this指向CMyFrameWnd
this指向CMyView
this指向CMyDoc
this指向CMyWinApp
从而产生四种调用,
问题是:this指针是一个CWnd类型的指针,把CMyFrameWnd的指针,CMyView的指针复制给它,没 有疑问,派生类指针赋值给基类指针。
但是CMyDoc,CMyWinApp从IsKindOf的角度来看,就不是一个类的,怎么能产生书中解释的后两中情 况呢?
8 个解决方案
#1
大家帮个忙顶一下啊!!~
#2
也是看过一遍,没怎么懂,继续修炼中。。。。。
帮你顶一下,收藏,看看到时候高手是怎么理解的。。。。。。
up
帮你顶一下,收藏,看看到时候高手是怎么理解的。。。。。。
up
#3
修炼中...到时再讨论~~~
#4
郁闷中!没有技术性的回帖啊!
#5
不好意思啊
现在不懂
现在不懂
#6
关于第一个问题,我是这样想的:
可以遍历一个窗体的子窗体(比如按钮、编辑框等),然后逐项判断是否为特定的类型,如果是则进行处理。
我有一次遇到这种情况,我有n多组合框,每个组合框对应一个选择框并包含n多编辑框,由选择框决定组合框内所有组件是否有效。如果单独处理,真是一场噩梦,事实上,那个时候我就放弃了。
可以遍历一个窗体的子窗体(比如按钮、编辑框等),然后逐项判断是否为特定的类型,如果是则进行处理。
我有一次遇到这种情况,我有n多组合框,每个组合框对应一个选择框并包含n多编辑框,由选择框决定组合框内所有组件是否有效。如果单独处理,真是一场噩梦,事实上,那个时候我就放弃了。
#7
书还是特意去长沙买的,现在还没有时间看
祝福楼主ing
祝福楼主ing
#8
呵呵,先说一点废话,这本书还真的遍地是黄金啊:)
我刚才又把那部分看了一下,发现自己真的没有吸收到东西啊。然后又查了相关的章节,大致可以解释一下这些问题了。
关于 OnCommand 和 OnCmdMsg
Command Routing 这一节一开始就提到“MFC之中用来处理消息的C++类并不成单线发展”,“document/view 结构也具有消息处理的能力”,这就是存在两个 WM_COMMAND 消息处理方法原因了——如果只有一个虚函数,就只能单线传递了。
也就是说,WM_COMMAND 消息肯定是 OnCommand 处理的,然后由 CWnd::OnCommand 调用 OnCmdMsg,这一点是MFC处理的,不用我们操心。
第三章的图比较零乱,可以看第九章的图9-6(P431),这是一张比较完整的 WM_COMMAND 路由图。在这张图里,注意以下方法:
CFrameWnd::OnCmdMsg 顺序调用了 CView、CWnd、CWinApp 的 OnCmdMsg 方法;
CView::OnCmdMsg 顺序调用了 CWnd、CDocument 的OnCmdMsg 方法。
因为 WM_COMMAND 消息需要“横向”传递,所以才有这么多麻烦。知道这些,你的问题就不难回答了:
两个方法实际上仅仅是先后顺序不同罢了,你可以根据需要的时机重载不同的方法。根据MSDN的说明,大致 OnCommand 用以处理用户的操作,比如点击按钮选择菜单等等;而 OnCmdMsg 方法用以传递、分派命令消息并更新用户界面对象,是消息体系的主要例程。
另外,图3-7、3-8以及148页上部的表都很有用,可以结合起来看。对了,我说的页码依据华中科技第二版。
关于 this
你说的概念我也很模糊,但是我有印象书上见过,去看目录,找到在P53,寥寥20行,讲得非常明白。this 指针并不是 CWnd* 类型的,而是当前方法所属类的指针( this 总是出现在类的成员方法中的),比如53页例子中的 this 就是 CShape* 类型的。
最后,非常感谢你问了这些问题,要不然我还会迷糊下去的:)
共同进步
我刚才又把那部分看了一下,发现自己真的没有吸收到东西啊。然后又查了相关的章节,大致可以解释一下这些问题了。
关于 OnCommand 和 OnCmdMsg
Command Routing 这一节一开始就提到“MFC之中用来处理消息的C++类并不成单线发展”,“document/view 结构也具有消息处理的能力”,这就是存在两个 WM_COMMAND 消息处理方法原因了——如果只有一个虚函数,就只能单线传递了。
也就是说,WM_COMMAND 消息肯定是 OnCommand 处理的,然后由 CWnd::OnCommand 调用 OnCmdMsg,这一点是MFC处理的,不用我们操心。
第三章的图比较零乱,可以看第九章的图9-6(P431),这是一张比较完整的 WM_COMMAND 路由图。在这张图里,注意以下方法:
CFrameWnd::OnCmdMsg 顺序调用了 CView、CWnd、CWinApp 的 OnCmdMsg 方法;
CView::OnCmdMsg 顺序调用了 CWnd、CDocument 的OnCmdMsg 方法。
因为 WM_COMMAND 消息需要“横向”传递,所以才有这么多麻烦。知道这些,你的问题就不难回答了:
两个方法实际上仅仅是先后顺序不同罢了,你可以根据需要的时机重载不同的方法。根据MSDN的说明,大致 OnCommand 用以处理用户的操作,比如点击按钮选择菜单等等;而 OnCmdMsg 方法用以传递、分派命令消息并更新用户界面对象,是消息体系的主要例程。
另外,图3-7、3-8以及148页上部的表都很有用,可以结合起来看。对了,我说的页码依据华中科技第二版。
关于 this
你说的概念我也很模糊,但是我有印象书上见过,去看目录,找到在P53,寥寥20行,讲得非常明白。this 指针并不是 CWnd* 类型的,而是当前方法所属类的指针( this 总是出现在类的成员方法中的),比如53页例子中的 this 就是 CShape* 类型的。
最后,非常感谢你问了这些问题,要不然我还会迷糊下去的:)
共同进步
#1
大家帮个忙顶一下啊!!~
#2
也是看过一遍,没怎么懂,继续修炼中。。。。。
帮你顶一下,收藏,看看到时候高手是怎么理解的。。。。。。
up
帮你顶一下,收藏,看看到时候高手是怎么理解的。。。。。。
up
#3
修炼中...到时再讨论~~~
#4
郁闷中!没有技术性的回帖啊!
#5
不好意思啊
现在不懂
现在不懂
#6
关于第一个问题,我是这样想的:
可以遍历一个窗体的子窗体(比如按钮、编辑框等),然后逐项判断是否为特定的类型,如果是则进行处理。
我有一次遇到这种情况,我有n多组合框,每个组合框对应一个选择框并包含n多编辑框,由选择框决定组合框内所有组件是否有效。如果单独处理,真是一场噩梦,事实上,那个时候我就放弃了。
可以遍历一个窗体的子窗体(比如按钮、编辑框等),然后逐项判断是否为特定的类型,如果是则进行处理。
我有一次遇到这种情况,我有n多组合框,每个组合框对应一个选择框并包含n多编辑框,由选择框决定组合框内所有组件是否有效。如果单独处理,真是一场噩梦,事实上,那个时候我就放弃了。
#7
书还是特意去长沙买的,现在还没有时间看
祝福楼主ing
祝福楼主ing
#8
呵呵,先说一点废话,这本书还真的遍地是黄金啊:)
我刚才又把那部分看了一下,发现自己真的没有吸收到东西啊。然后又查了相关的章节,大致可以解释一下这些问题了。
关于 OnCommand 和 OnCmdMsg
Command Routing 这一节一开始就提到“MFC之中用来处理消息的C++类并不成单线发展”,“document/view 结构也具有消息处理的能力”,这就是存在两个 WM_COMMAND 消息处理方法原因了——如果只有一个虚函数,就只能单线传递了。
也就是说,WM_COMMAND 消息肯定是 OnCommand 处理的,然后由 CWnd::OnCommand 调用 OnCmdMsg,这一点是MFC处理的,不用我们操心。
第三章的图比较零乱,可以看第九章的图9-6(P431),这是一张比较完整的 WM_COMMAND 路由图。在这张图里,注意以下方法:
CFrameWnd::OnCmdMsg 顺序调用了 CView、CWnd、CWinApp 的 OnCmdMsg 方法;
CView::OnCmdMsg 顺序调用了 CWnd、CDocument 的OnCmdMsg 方法。
因为 WM_COMMAND 消息需要“横向”传递,所以才有这么多麻烦。知道这些,你的问题就不难回答了:
两个方法实际上仅仅是先后顺序不同罢了,你可以根据需要的时机重载不同的方法。根据MSDN的说明,大致 OnCommand 用以处理用户的操作,比如点击按钮选择菜单等等;而 OnCmdMsg 方法用以传递、分派命令消息并更新用户界面对象,是消息体系的主要例程。
另外,图3-7、3-8以及148页上部的表都很有用,可以结合起来看。对了,我说的页码依据华中科技第二版。
关于 this
你说的概念我也很模糊,但是我有印象书上见过,去看目录,找到在P53,寥寥20行,讲得非常明白。this 指针并不是 CWnd* 类型的,而是当前方法所属类的指针( this 总是出现在类的成员方法中的),比如53页例子中的 this 就是 CShape* 类型的。
最后,非常感谢你问了这些问题,要不然我还会迷糊下去的:)
共同进步
我刚才又把那部分看了一下,发现自己真的没有吸收到东西啊。然后又查了相关的章节,大致可以解释一下这些问题了。
关于 OnCommand 和 OnCmdMsg
Command Routing 这一节一开始就提到“MFC之中用来处理消息的C++类并不成单线发展”,“document/view 结构也具有消息处理的能力”,这就是存在两个 WM_COMMAND 消息处理方法原因了——如果只有一个虚函数,就只能单线传递了。
也就是说,WM_COMMAND 消息肯定是 OnCommand 处理的,然后由 CWnd::OnCommand 调用 OnCmdMsg,这一点是MFC处理的,不用我们操心。
第三章的图比较零乱,可以看第九章的图9-6(P431),这是一张比较完整的 WM_COMMAND 路由图。在这张图里,注意以下方法:
CFrameWnd::OnCmdMsg 顺序调用了 CView、CWnd、CWinApp 的 OnCmdMsg 方法;
CView::OnCmdMsg 顺序调用了 CWnd、CDocument 的OnCmdMsg 方法。
因为 WM_COMMAND 消息需要“横向”传递,所以才有这么多麻烦。知道这些,你的问题就不难回答了:
两个方法实际上仅仅是先后顺序不同罢了,你可以根据需要的时机重载不同的方法。根据MSDN的说明,大致 OnCommand 用以处理用户的操作,比如点击按钮选择菜单等等;而 OnCmdMsg 方法用以传递、分派命令消息并更新用户界面对象,是消息体系的主要例程。
另外,图3-7、3-8以及148页上部的表都很有用,可以结合起来看。对了,我说的页码依据华中科技第二版。
关于 this
你说的概念我也很模糊,但是我有印象书上见过,去看目录,找到在P53,寥寥20行,讲得非常明白。this 指针并不是 CWnd* 类型的,而是当前方法所属类的指针( this 总是出现在类的成员方法中的),比如53页例子中的 this 就是 CShape* 类型的。
最后,非常感谢你问了这些问题,要不然我还会迷糊下去的:)
共同进步