MFC和设计模式

ecai 2004-06-21 04:31:28
MFC不是唯一一个使用了设计模式的程序库,也不可能是唯一的一个。可以肯定的说,所有好的框架必然是充满了好的设计模式。本文的目的在于提醒大家学习框架时,运用设计模式的理论和思想去理解其中众多的类之间的联系,从整体的角度去学习部分,显然比从部分去理解整体有更好的效果。本文的后面会给出MFC中的一些设计模式。 但是,不得不悲哀的看到,MFC中的核心类CWnd(不知道的先拖下去打)违反了框架设计的一个基本准则:最小化。可以说,CWnd就是一个“根部肥大”的准则的好例子。不知道有多少人真正理解了CWnd中数以百计的成员函数?某种意义上,MFC普遍采用继承的方式实现,而很少采用组合类或者对象的方式,也是在一定意义上和软件设计模式相违背的。OO的三大特性中的继承,似乎误导我们尽可能的使用继承方式搭建框架,可是在设计模式中,可以看到组合是更加重要的方法。呜呼,本人也曾经是继承思想的受害者之一。 不过,我必须承认,继承是比组合更加容易理解的方式,至少对于我如此。如果从完美的软件设计模式的角度,是否应该把CWnd拆分成更多的小接口?这样,我们的View,Dialog,button等等可以得到更加清晰的接口。但是这样的代价同样会增加框架的理解难度。从一个入门者的角度,我们不可能要求他先学习《设计模式》,然后去学习MFC。我的建议是,在学习MFC一段时间(半年?100个例子?理解MFC的20个类?)后,应该结合设计模式去学习。或许这也是学习框架的一个良好途径。 不得不提醒诸位,请注意对于模式设计的过分使用的后果。netwind (往事如风)的文章(模式设计与形式主义)http://www.sawin.com.cn/doc/SD/Pattern/pattern.htm是一个非常好的例子。对于本人的经历,在刚开始接触设计模式思想的时候,简直有醍醐灌顶的感觉,啊,上帝,我以前的程序为何如此之烂?!现在,我要承认,设计模式好,但是使用不易,尤其对于我这个懒惰的Programmer,“原理要深,应用要快”是我的目标。这一点从我的“金山词霸的词库读取程序”中可以感受,一个运行了一个多小时的程序,我也会懒得再优化。:) 小注:当然,众多晦涩难以理解的宏也为MFC的框架理解增添了不少“光彩”。一定程度上,我同意bigwhiteshark同志在http://dev.csdn.net/article/20/20831.shtm (对VC的批判,我要打击大家学VC的积极性了…… )文中的观点:从微软的策略看VC的前途!微软的策略是先用.net提供一个新的环境,然后逐步修改其OS,最终完全抛弃NT内核,其最终目的是抢占被UNIX和LINUX占据的高端市场份额(这是Borland李维说的,我觉得有道理)。现在推出的.net框架还支持原来的技术(如COM+),VC.net中也还有MFC7,但这只是一个过渡时期的产品,就象Windows 3.1被Windows 95取代一样,最终是要被抛弃的。 最后的建议:限于本人的理论水平和时间精力,建议大家把自己对MFC中设计模式的理解也综合起来,相信这个是非常有意义的工作。我会继续进行这个工作的。欢迎在我的blog:caijingwei.blogcn.com 上发表评论。
Factory
定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method 使一个类的实例化延迟到其子类。
框架创建它的View的过程。CFameWnd就是一个Creator,通过调用CFrameWnd::CreateView()创建不同的ConcreteProduct。
说明:其实CreateView()和动态创建对象的技术密切相关。这是MFC中一个比较有趣的设计,和C++的RTTI(运行时类型信息)不同。大家可以去研究RUNTIME_CLASS, DECLARE_DYNAMIC, DECLARE_DYNCREATE这几个宏。
 Builder:将一个复杂对象的构建和它的表示分离,使得同样的创建过程可以创建不同的表示。
在int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)中,创建框架窗口的过程:m_wndDlgBar.Create()m_wndReBar.Create()
m_wndStatusBar.Create()
是否可以理解为一个简化了的Builder模式?Director和Builder都是CMainFrame。
Adapter
将一个类的接口转换成客户希望的另外一个接口。
STL中的适配器:stack,queue,priority_queue。可以看作简化的Adapter模式,它改变了基类的接口,但是并没有组合其它对象。
说明:STL并不是MFC的一部分,是C++标准库的一部分,之所以放在本文中,可以认为是作者的偷懒。:)

Composite:    所有的窗口类都从CWnd派生,而派生的窗口类又可以包含其它从CWnd派生的类,窗口间的父子关系构成了窗口的树形结构。这种机制就是设计模式中典型的结构型模式COMPOSITE(组合),即某个对象拥有一系列类似的对象,而这一系列对象中的每一个又拥有一系列的对象,如此递归下去,管理起来很方便。这是Windows消息处理的基本模型。
Proxy
为其它对象提供一种代理以控制这个对象的访问。智能指针(smart pointer),比如_com_ptr_t
Template:相信学习MFC的同志有一个普遍的感觉:不知道使用哪个消息映射函数,即不知道哪里写代码。比如CDocument的OnNewDocument(),OnOpenDocument(),OnSaveDocument(),OnCloseDocument()。又比如打印的流程相关函数:PreparePrinting(),OnBeginPrinting(),OnPrepareDC(),OnPrint(),OnEndPrinting()。实际上这就是运用了Template模式:定义一个操作中的算法框架,而将一些步骤延迟到子类中。目的是使得子类不需要改变一个算法的结构即可重定义算法的某些特定步骤。很重要的一点是:基类必须指明哪些是钩子操作(可以选择被重定义),哪些是抽象操作(必须被重定义)。
Iterator:STL中的Iterator,从名字和运作方式都很好的吻合了Iterator模式。如果要更加细分,STL中的Iterator属于外部迭代器,即由客户来控制迭代。
C#和VB中的foreach()语句。foreach()语句中操作的对象集合必须实现一个内部迭代器。

MVCMVC模式是一个用于将用户界面逻辑与业务逻辑分离开来的基础设计模式,它将数据处理、界面以及用户的行为控制分为:Model-View-Controller。
Model:负责当前应用的数据获取与变更及相关的业务逻辑
View:负责显示信息
Controller:负责收集转化用户的输入
View和Controller都依赖于Model,但是Model既不依赖于View,也不依赖于Controller,这是分离的主要优点之一,这样Model可以单独的建立和测试以便于代码复用,View和Controller只需要Model提供数据,它们不会知道、也不会关心数据是存储在SQL Server还是Oracle数据库中或者别的什么地方。 。
MFC中的Doc-View结构可以看作是这种模式的一个简化,Document类相当于Model,似乎没有明确出现Controller,Controller的功能可以在Document类中实现。
...全文
699 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
ecai 2004-06-21
  • 打赏
  • 举报
回复
回复:happyparrot(快乐鹦鹉)
此文乃本人原创。不足之处,敬请批评。

同意QunKangLi(雾痕) 的观点:个人觉得理解了设计模式本身,可在自己的项目中用就行了,何必关心别人用了什么模式?
本文的目的并不在于证明MFC对设计模式的运用之妙。虽然MFC的诋毁之词甚多,但是,既然使用者众,将其和设计模式联系进行研究,只是希望帮助大家更好的理解吧!

赞成nlstone(天外流星) 的观点:
因此,我对每一个在这里走着VC/MFC路线的程序员表示致敬,当然也包括我自己:)
nlstone 2004-06-21
  • 打赏
  • 举报
回复
MFC一般鲜有与设计模式相联系起来讨论的,稍微想想不难发现,原来MFC里的设计模式使用导致了很多负面效应,并不算成功。

楼上已经说到了,MFC很多局限性来源于最初设计的目标。我们不妨从MFC目前的情况反过去猜想一下,最初的设计思想核心是什么?很显然的至少有以下两个目标:

1.API类化使用。无限膨胀的API把程序员压得喘不过气来,怎样利用现有的面向对象语言来简化对操作系统的调用模型,想当然也是MFC开发小组面临的首先问题。不过由于在当时还没有成熟的面向对象的操作系统调用模型供借鉴,所以开发小组也不知道怎么做好,所以MFC就是以API的包装为核心,而不是完全从面向对象的开发模型的角度来设计的,从MFC的很多类都可以看出这种痕迹,相同的函数名,和API调用不同的只是前面加了一个对象操作符而已,很多系统调用过程和API开发有着惊人的相似,这也是为什么在MFC中程序里往往会夹杂着很多直接API的调用,即然过程都是一样的,许多人都会觉得不使用类会更简便一点,这大概是最初设计时没有想到的。这个出发点的不同直致导致了mfc与java类库的显著区别。

2.框架化。如果仅仅是第一点,我想MFC早就消声匿迹了。MFC最大的卖点就是实现“开发框架化”,在理论上这可以节省大量的开发时间。实际上却有很多问题。首先,楼主提到的MFC框架的几个重要的设计模式在这里都起了反作用。设计模式的运用往往会提高底层代码的复杂程度。如果这个框架能够满足绝大多数的开发需要,那么还无伤大雅,可惜它满足不了,许多应用程序都不与这个框架相吻合,开发人员必须要对框架提供的默认模型进行改造甚至动大手术,由于几个并不简单的设计模式的使用以及交叉运用,让MFC的改造使用变得相当困难。这也是为什么用MFC来学写一些哪怕很小的应用程序的难度也远远大于学习其它的(诸如VB、Delphi、java),需要付出的努力程度是悬殊的。因此,我对每一个在这里走着VC/MFC路线的程序员表示致敬,当然也包括我自己:)
DerryZhang 2004-06-21
  • 打赏
  • 举报
回复
Mark
QunKangLi 2004-06-21
  • 打赏
  • 举报
回复
记得在书店中看到过不少专门介绍标准C++以及VC.NET所用设计模式的书,专讲MFC的倒是没有。个人觉得理解了设计模式本身,可在自己的项目中用就行了,何必关心别人用了什么模式?学习的话则另当别论。

结构的合理上,即使面对同门兄弟ATL,MFC的也差得太远。但请注意它实现的功能!此外,STL主要用于程序业务部分的数据与算法,MFC主要用于界面处理及操作系统特性的应用,有言“道不同不相与谋”,没得可比性。

MFC的一切局限都来源它最初的设计目标:
1.开发现实世界的应用程序。不应该定义新的编程概念,而是扩展现有模型,并用标准的C++思想来表达他们的概念。但不是每个人都是C++的宗师,因些实现中只使用了C++的一个子集,多继承就在这个子集之外。当然,框架对程序员所写代码的C++特性没有任何限制。
2.简化Windows API。将API分成若干逻辑单元,用类和继承来简化开发概念,同时安全地隐藏大量的细节。但是不可避免地,窗口类和设备环境类的体积。。。
3.使用已有的知识。尽可能地使用操作系统的已呢特性,使得底层C代码可在MFC中重用。
4.一个牢固的基础。随着API的增大,MFC要保证它的可扩展性。如OLE,上千行的SDK代码和简单应用OLE类的负担大不相同。不过相关的窗口等类的体积则受到最直接的影响,如CDialog的代码量就多了一倍以上。
5.小而快的框架。最初目标是20K的内存代价,且不能比同等C/SDK程序慢。高抽象层次的类库和过多的虚函数因此不被允许出现。为保证速度更快,规模更小,AFX发明了其它机制来处理消息。以CObject而言,在类的虚表中增加三个表项,就可实现RTTI,动态创建,序列化,内存诊断等高级功能。
快乐鹦鹉 2004-06-21
  • 打赏
  • 举报
回复
原创还是转载?
现在流行的Windows下的编程语言实在不少,所以在BBS上常常有人会问:我应该使用什么编程语言呢?其中,有一个大家认可的答案:真正的程序员使用Visual C++。 的确,Visual C++是一个功能强大、灵活、方便的编程工具,可以完成其他编程语言所无法完成的任务,可以让程序员方便地实现自己的设计,尽情的发挥自己地创造性。 Visual C++的强大无比的功能除了得益于C++的特性之外,更重要的是它具有体系完整、机制灵活、功能丰富的MFC类库。 所以,要讲Visual C++,必须讲MFC类库。 MFC的类库可以分两个层次,首先是实现MFC编程框架体系的核心MFC类库,然后是建立在核心MFC类库基础之上的扩展类库,例如,支持COM的类库,实现网络功能的类库,等等。随着Visual C++的不断升级,MFC类库的功能越来越丰富,越来越强大,但是,MFC核心类库是相对稳定的,特别是从Visual C++ 4.2开始到现在的Visual C++6.0。 本书的中心就是深入浅出地解析MFC类库,分析怎么使用MFC类库以及MFC类库的内部实现,揭开MFC复杂、深奥的面纱,让读者对MFC有一个全面、透彻、清晰的理解。关于MFC的核心实现,主要有以下几个方面。 首先,MFC采用C++的面向对象的特征封装了Windows的对象和Win32函数,一定程度上隐蔽了底层Win32的复杂性。 其次,MFC采用消息映射的方法来处理Windows消息和事件,隐藏了Windows窗口的窗口过程,简化了消息处理的复杂性和烦琐性。 还有,MFC提供了一个以文档-视为中心的编程模式,并实现了以文档-视为中心的编程框架,简化了数据处理的过程。 而且,MFC提出了模块状态、线程状态、模块线程状态来支持多线程的编程设计和DLL的编程。 本书分别从使用MFC的角度和MFC内部设计及实现的角度讨论了上述内容,分析了MFC核心的设计和实现;然后,在此基础上,进一步讨论了MFC对一些常用类的实现。有关章节的内容如下: 第一章,MFC概述。 第二章,解释MFC对Win32 API和Windows对象的封装,讨论各类MFC对象的使用,分析MFC对象和Windows对象的关系。 第三章,讨论CObject的特性及其实现,包括动态类信息、动态创建、序列化的实现等内容。 第四章,讨论MFC的消息映射机制,分析MFC对各类消息的处理,例如对Windows消息、控制通知消息、命令消息、状态更新消息、反射消息的处理等;并揭示了MFC通过消息映射手段实现C++虚拟函数机制的原理。 第五章和第六章,分析MFC编程框架启动和关闭一个应用程序的过程,揭示MFC框架的内幕,剖析以文档模板为核心创建基于文档-视的应用程序的过程,展示MFC框架处理消息和调用虚拟函数的时机和位置。 第七、八、九章,介绍MFC的动态链接库、进程、线程等概念,以及MFC动态链接库的种类和使用,讨论MFC下多线程编程的问题。并且进一步阐述MFC的核心概念之一:状态(模块状态、线程状态、模块线程状态),揭示MFC对多线程的支持机制,MFC实现规则DLL和扩展DLL的内幕。 第十章,阐述MFC下的调试手段。 第十一章,讨论CFile类,主要分析了CFile的使用和它对Win32文件函数的封装。 第十二章,讨论模式和无模式对话框,分析MFC如何设计和实现这两种对话框的功能,分析CDialog和CFormView为实现有关功能而设计的虚拟函数、消息处理函数等。 第十三章,讨论MFC工具栏和状态栏的设计及其实现,分析MFC是如何以CControlBar为基础,派生出CStatusBar、CToolBar、CDialogBar等子类,实现MFC工具栏和状态栏标准处理。 第十四章,讨论MFC的Socket类。 第一章到第十章介绍了MFC的核心概念以及实现。在此基础上,第十一章到第十四章讨论了MFC一些常用类的实现。 本书的内容对MFC的初学者(最好对Visual C++和Windows有所了解)和提高者都是很有帮助的。 如果您是一个初学者,可以读第一至第六章。主要目的是建立对MFC的全面理解,了解MFC框架是如何支持程序员编程的。如果有读不懂的地方,可以跳过,直接阅读有关分析的结论。特别是第五章和第六章,可以重点阅读,了解MFC是怎样来处理有关消息、调用有关虚拟函数的。 然后,还可以读第十章,第十一至第十四章。特别第十二章,可以重点阅读,它是MFC从CWnd或者CView派生出特定的类实现特定功能的例子,可以帮助您进一步理解MFC,并且学习如何设计和实现一个特定的类。 如果您对MFC有一定的掌握,可以进一步阅读第八和第九章,了解MFC处理DLL和线程的知识。对于第一至第六章、第十至第十四
目 录 译者序 前言 第一部分 基础知识 第1章 窗口 2 1.1 窗口和API环境 2 1.1.1 三种类型窗口 2 1.1.2 客户区和非客户区 3 1.2 窗口和MFC环境 4 1.3 怎样应用MFC创建一个窗口 5 1.4 怎样使用MFC销毁一个窗口 9 1.4.1 捆绑到一个已有的窗口 9 1.4.2 窗口类 10 1.4.3 窗口进程 10 1.5 怎样使用MFC创建一个窗口类 11 1.5.1 使用AfxRegisterWndClass () 函数注册一个窗口类 11 1.5.2 使用AfxRegisterClass ()函数 创建一个窗口类 12 1.6 怎样销毁一个MFC窗口类 14 1.7 厂商安装的窗口类 14 1.8 其他类型窗口 15 1.9 桌面窗口 16 1.10 小结 16 第2章 类 18 2.1 基类 18 2.1.1 CObject 18 2.1.2 CCmdTarget 19 2.1.3 CWnd 19 2.2 应用程序、框架、文档和视图类 19 2.2.1 CWinApp(O/C/W) 20 2.2.2 CView (O/C/W) 21 2.3 其他用户界面类 22 2.3.1 通用控件类 23 2.3.2 菜单类 23 2.3.3 对话框类 24 2.3.4 控制条类 24 2.3.5 属性类 25 2.4 绘图类 25 2.4.1 设备环境类 25 2.4.2 图形对象类 25 2.5 文件类 26 2.6 数据库类 26 2.6.1 ODBC类 26 2.6.2 DAO类 27 2.7 数据集类 27 2.8 其他数据类 27 2.9 通信类 28 2.10 其他类 29 2.11 小结 31 第3章 消息处理 32 3.1 发送或寄送一个消息 32 3.1.1 发送一个消息 32 3.1.2 寄送一个消息 32 3.1.3 发送一个消息与寄送一个消息 的比较 32 3.2 怎样使用MFC发送一个消息 33 3.3 怎样用MFC寄送一个消息 33 3.4 三种类型的消息 34 3.4.1 窗口消息 34 3.4.2 命令消息 34 3.4.3 控件通知 34 3.5 MFC怎样接收一个寄送的消息 36 3.6 MFC怎样处理一个接收到的消息 36 3.7 处理用户界面的对象 44 3.8 创建自定义窗口消息 45 3.8.1 静态分配的窗口消息 45 3.8.2 动态分配的窗口消息 46 3.9 重定向消息 47 3.9.1 子分类和超分类 47 3.9.2 用MFC子分类窗口 48 3.9.3 重载OnCmdMsg ( ) 49 3.9.4 使用SetWindowsHookEx ( ) 49 3.9.5 使用SetCapture ( ) 49 3.9.6 专有的消息泵 50 3.10 小结 50 第4章 绘图 51 4.1 设备环境 51 4.2 在MFC环境中创建一个设备环境 52 4.2.1 屏幕 52 4.2.2 打印机 53 4.2.3 内存 54 4.2.4 信息 54 4.3 绘图例程 55 4.3.1 画点 55 4.3.2 画线 55 4.3.3 画形状 55 4.3.4 形状填充和翻转 55 4.3.5 滚动 56 4.3.6 绘制文本 56 4.3.7 绘制位图和图标 56 4.4 绘图属性 56 4.4.1 设备环境属性 57 4.4.2 画线属性 58 4.4.3 形状填充属性 58 4.4.4 文本绘制属性 58 4.4.5 映像模式 59 4.4.6 调色板属性 62 4.4.7 混合属性 62 4.4.8 剪裁属性 63 4.4.9 位图绘制属性 64 4.5 元文件和路径 65 4.5.1 元文件 65 4.5.2 路径 66 4.6 颜色和调色板 66 4.6.1 抖动色 67 4.6.2 未经抖动色 67 4.6.3 系统调色板 67 4.6.4 使用系统调色板 68 4.6.5 动画色 71 4.7 控制什么时候在哪里绘图 71 4.7.1 处理WM_PAINT 71 4.7.2 只绘制被无效化的区域 72 4.7.3 处理WM_DRAWITEM 72 4.7.4 在其他时间绘图 73 4.8 小结 74 第二部分 用户界面实例 第5章 应用程序与环境 76 5.1 例1 规划MFC应用程序 76 5.2 例2 用AppWizard创建一个MFC 应用程序 79 5.3 例3 用ClassWizard创建一个类 83 5.4 例4 初始化应用程序屏幕 84 5.5 例5 保存应用程序屏幕 86 5.6 例6 处理命令行选项 88 5.7 例7 动态改变应用程序图标 91 5.8 例8 提示用户优先选项 93 5.9 例9 保存和恢复用户优先选项 97 5.10 例10 终止应用程序 100 5.11 例11 创建一个启动窗口 101 第6章 菜单 107 6.1 例12 使用菜单编辑器 107 6.2 例13 添加一个菜单命令处理函数 109 6.3 例14 根据当前可视文档动态改 变菜单 110 6.4 例15 启用和禁用菜单命令 111 6.5 例16 复选标记菜单命令 112 6.6 例17 单选标记菜单命令 113 6.7 例18 动态修改菜单 114 6.8 例19 动态修改系统菜单 116 6.9 例20 触发一个菜单命令 117 6.10 例21 创建弹出式菜单 117 第7章 工具栏和状态栏 120 7.1 例22 使用工具栏编辑器 120 7.2 例23 启用和禁用工具栏按钮 122 7.3 例24 为工具栏按钮添加字 123 7.4 例25 非标准工具栏大小 128 7.5 例26 保持工具栏按钮按下 129 7.6 例27 保持工具栏按钮组中 一个按钮按下 130 7.7 例28 为工具栏添加非按钮控件 131 7.8 例29 修改应用程序的状态栏 136 7.9 例30 更新状态栏窗格 138 7.10 例31 为状态栏添加其他控件 139 第8章 视图 145 8.1 例32 滚动视图 145 8.2 例33 改变鼠标光标形状 147 8.3 例34 沙漏光标 148 8.4 例35 窗体视图 149 8.5 例36 列表视图 152 8.6 例37 动态分割一个视图 163 第9章 对话框和对话条 166 9.1 例38 使用对话框编辑器 166 9.2 例39 创建一个对话框类 168 9.3 例40 模式对话框 170 9.4 例41 无模式对话框 171 9.5 例42 在无模式对话框的控件间 切换焦点 172 9.6 例43 对话框中的动画 173 9.7 例44 消息框 174 9.8 例45 对话条 176 第10章 控件窗口 182 10.1 例46 在任意位置创建一个控 件窗口 182 10.2 例47 用子分类定制一个通用 控件窗口 183 10.3 例48 用超分类定制一个通用 控件窗口 188 10.4 例49 在按钮上放置位图 190 10.5 例50 动态填充一个组合框 192 10.6 例51 排序一个列表控件 194 10.7 例52 分隔线控件 196 第11章 绘图 198 11.1 例53 绘制图形 198 11.2 例54 绘制文本 201 11.3 例55 从任意位置装入一个图 标并绘制 203 11.4 例56 从任意位置装入一个位 图和绘制一个位图 204 11.5 例57 从文件中创建一个位图 206 11.6 例58 创建一个自绘位图 211 第三部分 内部处理实例 第12章 消息 215 12.1 例59 添加消息处理函数或重 载MFC类 216 12.2 例60 添加命令范围消息处理函数 219 12.3 例61 重定向命令消息 221 12.4 例62 创建自己的窗口消息 222 第13章 文件、串行化和数据库 225 13.1 例63 访问二进制文件 225 13.2 例64 访问标准I/O文件 227 13.3 例65 访问内存文件 228 13.4 例66 在数据类中实现串行化 229 13.5 例67 串行化SDI或MDI文档 235 13.6 例68 按要求串行化 240 13.7 例69 透明地更新串行化的文档 242 13.8 例70 串行化多态类 246 13.9 例71 串行化数据集 248 13.10 例72 访问ODBC数据库 252 13.11 例73 访问DAO数据库 257 第14章 杂类 263 14.1 例74 剪切、拷贝和粘贴文本 数据 263 14.2 例75 剪切、拷贝、粘贴多信 息文本数据 268 14.3 例76 剪切、拷贝和粘贴二进制 数据 273 14.4 例77 数组函数 280 14.5 例78 列表函数 281 14.6 例79 映像函数 283 14.7 例80 系统键盘输入 285 14.8 例81 时间 288 第四部分 打包实例 第15章 库 291 15.1 例82 静态链接C/C++库 291 15.2 例83 动态链接C/C++库 295 15.3 例84 动态链接MFC扩展类库 300 15.4 例85 资源库 303 第五部分 附录 附录A 控件窗口风格 305 附录B 消息、控件通知和消息映像宏 323 附录C 访问其他应用程序类 328 附录D 开发中注意事项 330 附录E MFC快速参考指南 339

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧