这几天在看侯SIR的《深入浅出MFC》,前面看的我酣畅淋漓,各种内部机制的原理剖析的十分到位,醍醐灌顶。
但是看到最后一部分,也即是大量剖析MFC源代码那部分,小弟看蒙了。感觉很蒙很迷糊。说说我的看法想跟大家讨论一下:如果作为工具,那么MFC确实精美,因为它把不需要你关心的东西都包装了,呈现出来的接口非常的简单。但是正因为这些包装,给想了解它的内部机的人制造成了很大的困难,它的各个类各个函数之间的调用关系极其复杂,经常是呈回路呈网状的,要是跟踪它的执行过程,一会就迷糊掉了,调用层次太多太没有条理。也难怪,人家设计这个东西又不是让你看内部的,是让你开发的,是为了将软件开发流水线化,这样,如果你能熟读MSDN,了解所有用法,它还是一个很强大的application framework的。那么费那么大的劲了解MFC的内在机制到底是不是一件聪明的事呢?因为我觉得MFC内部并不是一个很漂亮的设计,而是一个很晦涩很难懂的设计。对MFC内在机制有所了解当然会很显著地提高用MFC开发的能力,但是它复杂的包装使得想透彻了解它几乎是不可能的(当然是针对我,小弟才疏)。该不该了解?该了解到什么程度?以上是最近学习MFC的疑惑。欢迎各位发表看法!

解决方案 »

  1.   

    VC是封装的很好,但就像基本的用一下,是可以的,但要做出个好东西,就的了解他是怎么封装的。现在就有很多控件是在MFC基础上做的,增加了很多功能。特别是在调试时,只有在知道了它是怎么封装的,才可以更好的修改BUG。我也同意你的意见--它复杂的包装使得想透彻了解它几乎是不可能的--我也和你一样,呵呵
      

  2.   

    终于有人回话了,一迷惑就很想找人交流。
    内部机制是应该了解的,这个我也同意,比如了解view\document\doctemplate之间的关系,相互之间如何协作,比如了解serialization的内部机制和层次关系,比如了解RTTI和动态创建,否则面对一个自己不知道如何运行起来的程序实在是不高明,而且出了错误也不知道是哪部分的问题。
    对一些内部机制的了解确实有助于写出更好的程序和调试。好处是大大地!
    所以我才在看深入浅出MFC前面部分时觉得那么过瘾。
    但是源代码这个东西
    不知您怎么看?
    MFC内部的调用关系实在是太复杂了(我认为设计的很不好。。),跟踪源代码的话很难看出它的设计主线。
      

  3.   

    这可能是MFC太过久远以及不断地向后兼容造成的吧。。
    我真觉得那东西(MFC源码)不是给人看的
    想听听大家看法
      

  4.   

    楼主,握爪一下,我也最近上升到看MFC了,看的也是《MFC深入浅出》
    我的出观点是MFC看看理解理解就好,因为自己的出发点就是解决应用(自己的算法,但无奈又要运行在WIN下,且不能跑Console,唯有MFC能一臂之力了),界面需求较少(最多也就是缩到托盘里),
    MFC的View很好,能解决了搞UI的的负担,
    所以我觉得MFC里Message的路由才是我的重点
    至于MFC给出了那些方便的封装,要用的时候查一查就行了,
    MFC的设计出发点就是为了减轻负担,那些东西用多了就知道
    如果真的要在机理上去较MFC的劲,倒不如把API全给记下来算了,而且做事保准有效率而且够直接,呵呵
    小弟愚见,期望拍砖!!!
      

  5.   

    1、MFC是优秀的设计,但并不是最优秀的,哪怕哪些,看MFC代码,也能学到不少东西。
    2、了解MFC到什么程度,主要看你想作什么。若只是MFC使用者,了解类库用法即可;若要成为VC高手,则要深入MFC,了解其机理;若要成为大师级人物的话,不仅要了解其机理,还要看到它的优点及缺点,以及改进的思路。
    3、不管MFC会不会OVER,MS会不会倒闭,深入学习MFC是有益的,它会让你触类旁通,以树见林。
      

  6.   

    握爪,我就是看到消息路由那部分的源码剖析开始犯迷糊的
    你这句话提醒了我:
    “自己的算法,但无奈又要运行在WIN下,且不能跑Console,唯有MFC能一臂之力了”
    也许程序员和MFC的关系就应如此
      

  7.   

    我用过的东西少,不知道其它类似的类库设计的如何,是不是也如MFC这般错综复杂?
      

  8.   

    MFC是一套很复杂的供程序员使用的类库,它的结构非常复杂,常用的类就有几百个,要是想要全面剖析它,没有个七八年是不太可能的吧?你想当初设计它,微软费了多大的劲呢。我的观点就是,主要了解MFC的运行机制,熟练掌握常用类的使用,初步了解常用类的内部构成,对于其它不常用类,用到的时候可以借助工具书和网络资源来帮助使用它。
      

  9.   


    据我所知,类库的设计都是复杂的,因为类库要解决的问题本来就是复杂的。
    评估一个类库的优秀是否,以下几方面是显而易见的:
    1、使用起来很方便。
    2、功能是完备的。
    3、性能是卓越的。
    4、扩展是轻松的。
    5、依赖与耦合是极低的。MFC不是在windows上的唯一选择,还有许多选择,比如QT。
    有一些库,非常好用,比如STL,BOOST,但若看它们的源代码的话,不是一般的复杂。
      

  10.   

    我最近也是在看深入浅出mfc,与楼主有同样的困惑,那些的代码确实让人发蒙
      

  11.   

    曾经看过一篇比较QT和MFC的文章,作者得出的结论是QT在很多方面优于MFC,但当时我对于MFC了解还不多(现在也不多,比当时多了些,呵呵),所以体会并不深,找来给大家看看,我也重温一遍
    QT和MFC的战争
    http://blog.csdn.net/szuwangjl/archive/2009/07/14/4347244.aspx
    CSDN的登录BUG如何解决啊?真烦啊!
      

  12.   

    没搞好链接
    重来一帖
    http://blog.csdn.net/szuwangjl/archive/2009/07/14/4347244.aspx
      

  13.   

    MFC 7.0 纯ASCII的内容就10几兆了,还是当作“黑箱”看待算了
      

  14.   

    准备看MFC很久了,却老没有激情看完它。
      

  15.   

    MFC集众多高人的智慧,精通了它,个人Windows编程能力,及感悟能力会有很大的提高。
      

  16.   

    我是刚混进这个行业的  菜鸟,MFC,呵呵,学习啦哦
      

  17.   

    感觉C++最不靠谱的东西就是宏了,一坨一坨的#define把代码搞的很难懂这个完全是牺牲可读性来提高效率阿。如果所有的#define写在一起也就算了,他们还是分散在无数个h文件中,郁闷阿。//a.h
    #define ___ main() {
    #define ____ printf("HELLO WORLD");
    #define _____ }
    #define ______ ___ ____ _____//a.cpp
    ______
    ps:跟ATL比起来,MFC只是个小屋而已
      

  18.   

    对于代码就不必须都知道了,侯捷就是列出来一下罢了。真正的就要知道MFC这样封装的,封装的结构.我们在平时工作调试时就是按这个结构在走.到了具体的错误就看具体的地方.把那个结构搞清楚就好了.我一朋友看了9遍MFC,现在自己就写了个MFC的平台,就是按那个结构写的,代码因人不同.
    让你们见笑了,呵呵
      

  19.   

    不要迷糊,要迟之一横,坚持就是胜利,我自学1年多了,还是不怎么会呢,c/c++,windows编程,mfc,都看完了,到现在还是一知半解,现在多动手好点了
      

  20.   

    觉得除了Message路由,
    View/Document还是要看看的...
      

  21.   

    恩,我也觉得该动手了,书没少看,代码没咋写,假期打算小试牛刀,就用MFC吧,顺别熟悉MFC
      

  22.   

    那肯定 侯SIR说d/v是MFC的立身之本嘛
      

  23.   

    我们也有过你的迷惑,我觉得不要一开始就去看这本书,看这本书也不要只看一遍。先看看VC++深入详解和windows程序设计。
      

  24.   

    VC++深入详解我看了
    老外那本WINDOWS程序设计还没
    不过看过咱中国那本山寨的WINDOWS程序设计的一部分
    对SDK有少许了解
    哥们能不能给介绍下看WINDOWS程序设计(老外版)的必要性
    也好让我有个清楚的认识
    呵呵
      

  25.   

    请问MFC学来干什么的?
      

  26.   

    包装是为了快速上手。
    因为下次开发可能不需要mfc了。
    但是长期使用mfc的话,还是需要了解的,那样写出来的程序质量会高一点。
      

  27.   

    MFC我看了好几遍才看明白了一部份,而且用的时候有些问题很难解决,如果有人带一下,会好很多,完全自学,还是有难度的。。
      

  28.   

    MFC真正学的就是它的内核哈 如果想快速上手 做东西 也不必很深钻但想提升内功 楼主可以好好看看
      

  29.   

    正在看侯捷的深入浅出mfc。。
    为什么总是会静不下心来看呢。
      

  30.   

    学习MFC还有本好书《MFC深入浅出》,国人原创,剖析的不错,也有深度,可以被候Sir的光芒给掩盖了
      

  31.   

    我用了十年时间看MFC,这段时间用一周时间看了OWL5.0/wxWidge2.9/VCF0.9这三个库的核心代码,通过对比,我觉得MFC是目前Windows平台流行的GUI框架中最优秀的一个。[MFC]
    最流行,最稳定,功能完善,对多线程支持最彻底的一个框架,采用单继承,构成关系清楚明了!代码清晰直接易懂,例如有些库明明是HWND的数据类型她硬是要变成uint32,明明是RECT结构她硬是要变成她自己的Rect结构,这样就更绕弯子了。[OWL5.0]
    已经死亡的项目,继承者是OWLNext,采用多继承比MFC更复杂,对多线程支持不及MFC完善,直到5.0版本依然可以看到大量使用const char*、char*这样的代码,你应该明白这代表着什么。历史做出了正确的选择。[wxWidge]
    卖力地模仿MFC,目前已经很完善,但对多线程支持几乎空白(多GUI线程)。例如在创建窗口时不使用线程同步,在窗口过程WndProc中也不使用线程同步。支持跨平台,但不要拿跨平台来说事,使用同一份源代码跨平台的软件都是缺乏竞争力的,因为它不能发挥平台本身的优势,没法跟原生程序相比。所以大凡跨平台的软件都是一些专有软件或者是大公司的软件(你不用也得用)。[VCF]
    一个较新的框架,与stl融合,支持Action等概念,但不成熟,对多线程支持也很弱。[WTL]
    基于ATL和模板技术的小型库(我不敢说它是一个框架),开发ActiveX控件的首选,但它还很原始不适合用来开发较大的软件。看一个GUI框架是否优秀不要主要看它的消息映射,FRAME/DOC/VIEW很难接受呀什么的,这是次要的。
    抛开这个框架的流行程度不说(越多人用当然就越好了),看一个框架主要看它的模型,也就是说它的核心对多线程的支持程度,然后才是它的层次构成和消息映射等方面。核心对多线程的支持是这个框架的骨架,其他的什么App/Wnd对象等都是在这个骨架上铺层皮而已。为什么MFC很多类都有FromHandle()这个函数?以CWnd为例,因为多个线程同时操作一个C++的CWnd对象时会涉及同步问题,所以MFC采取的策略是将一个Windows系统的HWND对象映射成无数个C++的CWnd对象,每个线程操作属于自己的私有CWnd对象,这样就不会破坏CWnd对象的数据和状态,MFC就承担起对CWnd的线程同步责任,而Windows系统则会承担起对HWND所代表的窗口的线程同步责任。所以为什么在主线程内创建的窗口要在附属线程中使用时需要用CWnd::FromHandle(HWND)这样的方法,这种生态现象是由MFC内部形态决定的。
    建议有水平的朋友多看看afxstate.cpp和afxtls.cpp这两个文件。
      

  32.   

    侯的深入签出MFC确实很经典啊,看着看着突然有一种拨云见日,豁然开朗的感觉,
      

  33.   

    能够作为一个应用框架适用N多应用,已经很不错了。。这个框架不太合理?那.net?JAVA等等其他语言的框架就合理了?你分析透彻了?觉得比MFC的合理了?其实我想说的就是 知道怎么使用就好了吧,你搞研究?你老板就不给你发工资了  
      

  34.   

    MFC用起来还是挺方便的,不过真的是想要搞清楚内部的原理什么的,一需要实践,二是时间。
      

  35.   

    初学者,不知道好坏,只知道看《深入浅出MFC》感觉非常的爽。
      

  36.   

    MFC的时间效率和空间效率很高。
      

  37.   

    MFC确实不错。用起来方便。封装得不错。
      

  38.   

    mfc的源码是必须要看的 。 不仅仅因为它开源
      

  39.   

    唉。。同是学mfc的。。同样困惑啊。。求解
      

  40.   

    MFC源码对于VC程序员来说,应该小菜一碟
      

  41.   

    是啊,也很迷惑
    一直不明白MFC封装sdk api时为什么使用钩子而不用其他的方法?