关于>的几个问题!!!---渴望进阶!!!

时间:2021-02-11 10:11:52
大家好!
  小弟最近在啃<<深入浅出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

#3


修炼中...到时再讨论~~~

#4


郁闷中!没有技术性的回帖啊!

#5


不好意思啊 
  现在不懂

#6


关于第一个问题,我是这样想的:
  可以遍历一个窗体的子窗体(比如按钮、编辑框等),然后逐项判断是否为特定的类型,如果是则进行处理。
我有一次遇到这种情况,我有n多组合框,每个组合框对应一个选择框并包含n多编辑框,由选择框决定组合框内所有组件是否有效。如果单独处理,真是一场噩梦,事实上,那个时候我就放弃了。

#7


书还是特意去长沙买的,现在还没有时间看

祝福楼主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* 类型的。


  最后,非常感谢你问了这些问题,要不然我还会迷糊下去的:)
  共同进步

#1


大家帮个忙顶一下啊!!~

#2


也是看过一遍,没怎么懂,继续修炼中。。。。。


帮你顶一下,收藏,看看到时候高手是怎么理解的。。。。。。


up

#3


修炼中...到时再讨论~~~

#4


郁闷中!没有技术性的回帖啊!

#5


不好意思啊 
  现在不懂

#6


关于第一个问题,我是这样想的:
  可以遍历一个窗体的子窗体(比如按钮、编辑框等),然后逐项判断是否为特定的类型,如果是则进行处理。
我有一次遇到这种情况,我有n多组合框,每个组合框对应一个选择框并包含n多编辑框,由选择框决定组合框内所有组件是否有效。如果单独处理,真是一场噩梦,事实上,那个时候我就放弃了。

#7


书还是特意去长沙买的,现在还没有时间看

祝福楼主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* 类型的。


  最后,非常感谢你问了这些问题,要不然我还会迷糊下去的:)
  共同进步