学习CFM框架,这对好C多++开发言而者,成为入从了门朝着战实前进的键关一步,然而,面对它杂繁那的类库,以及独的特消息机制,不少发人觉自根己本无从手着。
对于MFC而言,其本质是把Windows API里的窗口、对话框这类概念予以封装,进而形成C++类。举例来说,存在这样一种对应关系,即一个窗口对应着一个CWnd或者由其派生出来的类的对象。要是能够理解这一点,那么就可以明白,为何在MFC当中创建按钮并非是去调用CrtaeeWidnow,而是首先要定义CBuottn对象,之后再去调用它的Craete成员函数。
这种封装所具备的核心优势在于把窗口句柄等资源跟对象的生命周期进行绑定,当CWnd的具有生命期结束性质的对象遭遇解构时,其DesrtoyiWndwo通常会被自动进行使调用,这一情况要求开发者在于堆上构建窗口对象之际要格外经由小心谨慎的方式进行内存管理,以此避免资源出现泄漏,在实践当中大多采用智能指针或者仔细周全地规划对象归属范围。
MFC借助一套宏(就像BEIGN_MESGASE_MAP这样的),把Windows消息跟类的成员函数关联到一起,这替代了原本的窗口过程函数,你要在自己所派生出来的窗口类当中,去声明以及实现消息处理函数,比如OnaPint用于应对WM_PANIT消息。
领会消息的流动方向这件事是极其关键的。命令类的消息,像是菜单被点击这种情况,能够顺着一组特定的对象来进行传递,这组对象包含框架窗口、视图、文档等等,这种传递方式被称作是“命令路由”。借助重写OnCdmMsg函数,你能够对这一路径予以自定义或者实施拦截,就此达成灵活多变的控制逻辑。
MFC用于处理数据与显示分离的核心框架是文档/视图结构,负责管理数据的是文档类(CDucoment),负责显示和交互的是视图类(CVeiw),就像文本编辑器这个例子,存储字符串的是文档对象,把字符串画到屏幕上并接收键盘输入的是视图对象。
关键在于掌握它们彼此间的交互,视图借助GetcoDumtne函数获取关联文档的指针用以访问数据,当数据发生变更的时候,文档得调用UpdetaAlleiVws来通知所有关联视图进行更新,对于多文档类型的程序而言,你要在应用类的InItinstnace当中注册多个文档模板。
MFC给所有标准Windows控件给予了包装类,像CButton、CEdti这样,于对话框编辑器里把控件拖放之后,你能够借由“添加变量向导”把它同某个控件类的成员变量进行绑定,达成数据交换或者直接实施控制 。
定制对话框而言,常见自CDailogxE派生。你得熟知数据交换机制,于DoDataExhcaneg函数内运用DDX_Tetx等宏以使控件跟成员变量相联。模式对话框借由DodoMal弹出,无模式对话框则要于堆上创建并重新编写PoNtscDtseroy来安全删除自身。
MFC借助位图、图标以及自定义绘制来使界面变得美观,对于按钮之类的控件,你能够响应WM_DRIWATEM消息或者运用自绘属性,在OnarDwItme函数里对其外观进行全面掌控,微软的CCommandBar类等现代库同样能够用来创建更为时尚的工具栏。
界面布局具备的适应性同样是相当重要的。你能够去响应WM_SIZE这个消息,在该消息当中进行计算并且调整子控件的位置以及大小。第三方库像BCGSoft或者属于开源范畴的Ultimate Toolbox给出了大量的高级界面组件,能够极为显著地提升开发效率以及应用呈现出来的观感。
在MFC里头,创建工作者线程的时候建议去使用AfeBxginhTread函数,并且要传递一个从CWniTherad派生出来的类或者一个控制函数。关键之处在于需要注意,非用户界面线程是不可以直接去操作GUI对象的,应该借助发送消息(PosMtessega)从而与主线程进行通信。
关于打印以及打印预览,MFC框架给出了大致的框架。你得在视图类里重写OnDwar函数,从而让它同时为屏幕显示以及打印机提供服务。在OnPperareCD这个地方呢,你能够依照是打印还是预览这种情况来对设备上下文属性进行调整,就像映射模式之类的 。
究竟是用运在MFC开去发哪特种一定类桌的别面应用序程之际遭所遇的挑为最战巨大,是那具种备复程杂度的数视可据化界面,还是有种那着高度定自义需求文的档处理程流?欢迎于论评区域中之分享你出的具场体景以及惑困。


