请输入您要查询的百科知识:

 

词条 MFC
释义
1 微生物燃料电池英文缩写

MFC,英文全称为microbial fuel cell,是以微生物作为催化剂将碳水化合物中的化学能转化为电能的装置。主要分为双室MFC和单室MFC。双室MFC由阳极区和阴极区组成,中间用质子交换膜分开。而单室MFC即省去了阴极区,阳极和阴极在同一个室内工作。

2 微软基础类库

MFC(Microsoft Foundation Classes),是一个微软公司提供的类库(class libraries),以C++类的形式封装了Windows的API,并且包含一个应用程序框架,以减少应用程序开发人员的工作量。其中包含的类包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。

介绍

MFC,微软基础类(Microsoft Foundation Classes),同VCL类似,是一种应用程序框架,随微软Visual C++ 开发工具发布。目前最新版本为10.0(截止2011年3月),并且发布了中文版。该类库提供一组通用的可重用的类库供开发人员使用。大部分类均从CObject 直接或间接派生,只有少部分类例外。

MFC 应用程序的总体结构通常由开发人员从MFC类派生的几个类和一个CWinApp类对象(应用程序对象)组成。MFC 提供了MFC AppWizard 自动生成框架。

Windows 应用程序中,MFC 的主包含文件为"Afxwin.h"。

此外MFC的部分类为MFC/ATL 通用,可以在Win32 应用程序中单独包含并使用这些类。

由于它的易用性,初学者常误认为VC++开发必须使用MFC。这种想法是错误的。作为Application Framework,MFC的使用只能提高某些情况下的开发效率,只起到辅助作用,而不能替代整个Win32 程序设计。

特点

MFC实际上是微软提供的,用于在C++环境下编写应用程序的一个框架和引擎,VC++Windows下开发人员使用的专业C++ SDK(SDK,Standard SoftWare Develop Kit,专业软件开发平台),MFC就是挂在它之上的一个辅助软件开发包,MFC作为与VC++血肉相连的部分(注意C++和VC++的区别:C++是一种程序设计语言,是一种大家都承认的软件编制的通用规范,而VC++只是一个编译器,或者说是一种编译器+源程序编辑器的IDE,WS,PlatForm,这跟Pascal和Delphi的关系一个道理,Pascal是Delphi的语言基础,Delphi使用Pascal规范来进行Win下应用程序的开发和编译,却不同于Basic语言和VB的关系,Basic语言在VB开发出来被应用的年代已经成了Basic语言的新规范,VB新加的Basic语言要素,如面向对象程序设计的要素,是一种性质上的飞跃,使VB既是一个IDE,又成长成一个新的程序设计语言),MFC同BC++集成的VCL一样是一个非外挂式的软件包,类库,只不过MFC类是微软为VC++专配的..

MFC是Win API与C++的结合,API,即微软提供的Windows下应用程序的编程语言接口,是一种软件编程的规范,但不是一种程序开发语言本身,可以允许用户使用各种各样的第三方(如我是一方,微软是一方,Borland就是第三方)的编程语言来进行对Windows下应用程序的开发,使这些被开发出来的应用程序能在Windows下运行,比如VB,VC++,Java,Delhpi编程语言函数本质上全部源于API,因此用它们开发出来的应用程序都能工作在Windows的消息机制和绘图里,遵守Windows作为一个操作系统的内部实现,这其实也是一种必要,微软如果不提供API,这个世上对Windows编程的工作就不会存在,微软的产品就会迅速从时尚变成垃圾,上面说到MFC是微软对API函数的专用C++封装,这种结合一方面让用户使用微软的专业C++ SDK来进行Windows下应用程序的开发变得容易,因为MFC是对API的封装,微软做了大量的工作,隐藏了好多程序开发人员在Windows下用C++ & MFC编制软件时的大量内节,如应用程序实现消息的处理,设备环境绘图,这种结合是以方便为目的的,必定要付出一定代价(这是微软的一向作风),因此就造成了MFC对类封装中的一定程度的的冗余和迂回,但这是可以接受的..

最后要明白MFC不只是一个功能单纯的界面开发系统,它提供的类绝大部分用来进行界面开发,关联一个窗口的动作,但它提供的类中有好多类不与一个窗口关联,即类的作用不是一个界面类,不实现对一个窗口对象的控制(如创建,销毁),而是一些在Windows(用MFC编写的程序绝大部分都在Windows中运行)中实现内部处理的类,如数据库的管理类等,学习中最应花费时间的是消息和设备环境,对C++和MFC的学习中最难的部分是指针,C++面向对象程序设计的其它部分,如数据类型,流程控制都不难,建议学习数据结构C++版。

MFC是微软封装了的API。什么意思呢?windows作为一个提供功能强大的应用程序接口编程的操作系统,的确方便了许多程序员,传统的win32开发(直接使用windows的接口函数API)对于程序员来说非常的困难,因为,API函数实在太多了,而且名称很乱,从零构架一个窗口动辄就是上百行的代码。MFC是面向对象程序设计与Application framework的完美结合,他将传统的API进行了分类封装,并且为你创建了程序的一般框架,

MFC是对WindowsAPI的封装,大大简化了我们的工作;学VC主要就是要学MFC,大约有100多个类,但常用的也就二三十个。应该象背4级单词一样将这些常用类搞懂;当然不要死记,要通过看帮助、看例子、动手练习来学会它们;而且,并非每个类的内部的所有函数都要学会,要日积月累。如果真的想成为高手,做个笔记本把自己认为重要的类、函数记下来,随时学习,也是很好的突击方法。

重要的MFC

CWnd:窗口,它是大多数“看得见的东西”的父类(Windows里几乎所有看得见的东西都是一个窗口,大窗口里有许多小窗口),比如视图CView、框架窗口CFrameWnd、工具条CToolBar、对话框CDialog、按钮CButton,etc;一个例外是菜单(CMenu)不是从窗口派生的。该类很大,一开始也不必学,知道就行了。

CDocument文档,负责内存数据与磁盘的交互。最重要的是OnOpenDocument(读入),OnSaveDocument(写盘),Serialize(读写)

CView视图,负责内存数据与用户的交互。包括数据的显示、用户操作的响应(如菜单的选取、鼠标的响应)。最重要的是OnDraw(重画窗口),通常用CWnd::Invalidate()来启动它。另外,它通过消息映射表处理菜单、工具条、快捷键和其他用户消息。你自己的许多功能都要加在里面,你打交道最多的就是它。

CDC设备文本。无论是显示器还是打印机,都是画图给用户看。这图就抽象为CDC。CDC与其他GDI(图形设备接口)一起,完成文字和图形、图像的显示工作。把CDC想象成一张纸,每个窗口都有一个CDC相联系,负责画窗口。CDC有个常用子类CClientDC(窗口客户区),画图通常通过CClientDC完成。

CDialog对话框

CWinApp应用程序类。似于C中的main函数,是程序执行的入口和管理者,负责程序建立、消灭,主窗口和文档模板的建立。最常用函数InitInstance():初始化。

CGdiObject及子类,用于向设备文本画图。它们都需要在使用前选进DC。

CPen笔,画线

CBrush刷子,填充

CFont字体,控制文字输出的字体

CBitmap位图

CPalette调色板

CRgn区域,指定一块区域可以用于做特殊处理。

CFile文件。最重要的不外是Open(打开),Read(读入),Write(写)

CString字符串。封装了C中的字符数组,非常实用。

CPoint点,就是(x,y)对

CRect矩形,就是(left,top,right,bottom)

CSize大小,就是(cx,cy)对(宽、高)MFC是在1992年的Microsoft 16位版的C/C++编译器的7.0版本中作为一个扩展轻量级的Windows API面向对象的C++封装库而引入的。此时,C++因为它在和API方面的卓越表现,刚刚开始被用来取代C应用于开发商用软件。因此,他们推出了替代早期的老式的字符界面的集成开发环境(IDE)的PWB。

MFC所有类及其头文件

CAnimateCtrl 自动化通用控件 afxcmn.h

CArchive afx.h

CArchiveException afx.h

CArray afxtempl.h

CAsyncMonikerFile 在ActiveX控件中提供对异步标记的支持 afxole.h

CAsyncScoket 封装Windows Sockets API,参看CSocket afxsock.h

CBitmap afxwin.h

CBitmapButton afxext.h

CBrush afxwin.h

CButton 按钮控件对象 afxwin.h

CByteArray afxcoll.h

CCachedDataPathProperty 允许一个ActiveX控件异步传输属性数据和缓冲内存中的数据,参考CDataPathProperty afxctl.h

CCheckListBox afxwin.h

CClientDC afxwin.h

CCmdTarget 所有能够接收和响应消息的对象的基类 afxwin.h

CCmdUI afxwin.h

CColorDialog 颜色选择的通用对话框,提供为显示系统定义的颜色列表 afxdlgs.h

CComboBox 组合框对象 afxwin.h

CComboBoxEx CComboBox类的派生类,用于支持在组合框控件中的图像列表 afxcmn.h

CCommandLineInfo afxwin.h

CCommonDialog afxdlgs.h

CConnectionPoint afxdisp.h

CControlBar afxext.h

CCreateContext afxext.h

CCriticalSection afxmt.h

CCtrlView afxwin.h

CDaoDatabase afxdao.h

CDaoException afxdao.h

CDaoFieldExchange afxdao.h

CDaoQueryDef afxdao.h

CDaoRecordset 代表选自数据源的记录集。CDaoRecordset对象可用于三种格式:表类型记录集,动态集类型记录集和快照类型记录集 afxdao.h

CDaoRecordView 提供表单视图,以在控件中显示数据库记录。表单视图是CDaoRecordset对象的一部分。参考CFormView和CRecordView afxdao.h

CDaoTableDef afxdao.h

CDaoWorkspace afxdao.h

CDatabase afxdb.h

CDataExchange afxwin.h

CDataPathProperty 实现一个ActiveX控件属性,它能够异步加载其数据。这个类允许ActiveX控件在后台下载属性数据时被激活 afxctl.h

CDateTimeCtrl 封装新的日期/时间选取器控件 afxdtctl.h

CDBException afxdb.h

CDBVariant afxdb.h

CDC afxwin.h

CDialog 用于包含控件窗口的对话框对象 afxwin.h

CDialogBar afxext.h

CDocItem afxole.h

CDockState afxadv.h

CDocObjectServer afxdocob.h

CDocObjectServerItem afxdocob.h

CDocTemplate afxwin.h

CDocument 用于管理程序的数据的类 afxwin.h

CDragListBox Windows列表框,允许用户把其中的项拖放到不同的位置 afxcmn.h

CDumpContext afx.h

CDWordArray afxcoll.h

CEdit 用于文本输入的子窗口控件 afxwin.h

CEditView 提供Windows编缉控件的功能。因为CEditView派生于Cedit,该对象可同文件和文件模板一同使用 afxext.h

CEvent afxmt.h

CException afx.h

CFieldExchange afxdb.h

CFile afx.h

CFileDialog 通用文件对话框,提供Open和Save As对话框中的功能 afxdlgs.h

CFileException afx.h

CFileFind afx.h

CFindReplaceDialog afxdlgs.h

CFont afxwin.h

CFontDialog 通用字体对话框,用于显示当前已装入系统的字体列表 afxdlgs.h

CFontHolder afxctl.h

CFormView 包含对话框控件的窗口 afxext.h

CFrameWnd SDI(单窗口界面)框架窗口 afxwin.h

CFtpConnection afxinet.h

CFtpFileFind afxinet.h

CGdiObject afxwin.h

CGopherConnection afxinet.h

CGopherFile afxinet.h

CGopherFileFind afxinet.h

CGopherLocator afxinet.h

CHeaderCtrl 标题通用控件 afxcmn.h

CHotKeyCtrl 热键通用控件 afxcmn.h

CHtmlStream afxisapi.h

CHtmlView 实现Web Browser控件的视图类,能够访问当地或Web上的HTML文件。 afxhtml.h

CHttpConnection afxinet.h

CHttpFile afxinet.h

CHttpFilter 创建并处理超文传输协议过滤器对象,该对象用于过滤用于HTTP请求的服务器通知 afxisapi.h

CHttpFilterContext afxisapi.h

CHttpServer Internet Server API(ISAPI)的包装类 afxisapi.h

CHttpServerContext afxisapi.h

CImageList afxcmn.h

CInternetConnection afxinet.h

CInternetException afxinet.h

CInternetFile afxinet.h

CInternetSession afxinet.h

CIPAddressCtrl IP地址控件。类似于编缉框,该控件接收Internet 协议格式的地址 afxcmn.h

CList afxtempl.h

CListBox 列表框对象 afxwin.h

CListCtrl 列表视通用控件 afxcmn.h

ClistView 简化CListCtrl的使用,添加了对文件和视图的支持 afxcview.h

CLongBinary afxdb_.h

CMap afxtempl.h

CMapPtrToPtr afxcoll.h

CMapPtrToWord afxcoll.h

CMapStringToOb afxcoll.h

CMapStringToPtr afxcoll.h

CMapStringToString afxcoll.h

CMapWordToOb afxcoll.h

CMapWordToPtr afxcoll.h

CMDIChildWnd MDI(多文档界面)子框架窗口 afxwin.h

CMDIFrameWnd afxwin.h

CMemFile afx.h

CMemoryException afx.h

CMemoryState

CMenu afxwin.h

CMetaFileDC afxext.h

CMiniFrameWnd 半高的框架窗口,主要用于浮动工具栏。一个小框架窗口没有最小化和最大化按钮,但其他都类似于正常的框架窗口 afxwin.h

CMonikerFile afxole.h

CMonthCalCtrl 月历控件,用于显示一个用户可选择日期的日历 afxdtctl.h

CMultiDocTemplate afxwin.h

CMultiLock afxmt.h

CMutex afxmt.h

CNotSupportedException afx.h

CObArray afxcoll.h

CObject afx.h

CObList afxcoll.h

COleBusyDialog afxodlgs.h

COleChangeIconDialog afxodlgs.h

COleChangeSourceDialog afxodlgs.h

COleClientItem afxole.h

COleCmdUI afxdocob.h

COleControl afxctl.h

COleControlModule afxctl.h

COleConvertDialog afxodlgs.h

COleCurrency afxdisp.h

COleDataObject afxole.h

COleDataSource afxole.h

COleDateTime afxdisp.h

COleDateTimeSpan afxdisp.h

COleDBRecordView afxoledb.h

COleDialog afxodlgs.h

COleDispatchDriver afxdisp.h

COleDispatchException afxdisp.h

COleDocObjectItem afxole.h

COleDocument 把一个文件看作为CDocItem对象的一个集合。包容器和服务器都需要这个结构,因为它们的文件必须能够包含OLE项 afxole.h

COleDropSource afxole.h

COleDropTarget afxole.h

COleException afxdisp.h

COleInsertDialog afxodlgs.h

COleIPFrameWnd afxole.h

COleLinkingDoc OLE包容器文件的基类,这些文件支持对它们所包含项的链接 afxole.h

COleLinksDialog afxodlgs.h

COleMessageFilter afxole.h

COleObjectFactory afxdisp.h

COlePasteSpecialDialog afxodlgs.h

COlePropertiesDialog afxodlgs.h

COlePropertyPage afxctl.h

COleResizeBar afxole.h

COleSafeArray afxdisp.h

COleServerDoc OLE服务器文件的基类 afxole.h

COleServerItem 为OLE项提供一个服务器界面 afxole.h

COleStreamFile afxole.h

COleTemplateServer afxdisp.h

COleUpdateDialog afxodlgs.h

COleVariant afxdisp.h

CPageSetupDialog afxdlgs.h

CPaintDC afxwin.h

CPalette afxwin.h

CPen afxwin.h

CPictureHolder afxctl.h

CPoint atltypes.h

CPrintDialog 通用打印对话框,提供Print和Print Setup对话框中的功能 afxdlgs.h

CPrintInfo

CProgressCtrl 通用进程指示器控件 afxcmn.h

CPropertyPage 代表属性表单中的一页 afxdlgs.h

CPropertyPageEx

CPropertySheet 属性表,也叫做多选项卡对话框。一个属性表由一个CPropertySheet对象和几个CPropertyPage对象组成 afxdlgs.h

CPropertySheetEx

CPropExchange afxctl.h

CPtrArray afxcoll.h

CPtrList afxcoll.h

CReBar afxext.h

CReBarCtrl afxcmn.h

CRecentFileList afxadv.h

CRecordset 用于访问数据库表或查询的类 afxdb.h

CRecordView 包含对话框控件的窗口 afxdb.h

CRect atltypes.h

CRectTracker afxext.h

CResourceException afxwin.h

CRgn afxwin.h

CRichEditCntrItem afxrich.h

CRichEditCtrl 用户能够输入和编缉文本的窗口,提供字符和程序段格式,以及对嵌入OLE项的支持 afxcmn.h

CRichEditDoc afxrich.h

CRichEditView afxrich.h

CRuntimeClass

CScrollBar 滚动条对象 afxwin.h

CScrollView 可滚动的窗口,派生于CView afxwin.h

CSemaphore afxmt.h

CSharedFile afxadv.h

CSingleDocTemplate afxwin.h

CSingleLock afxmt.h

CSize atltypes.h

CSliderCtrl 提供包含一个滑块和可选的刻度线的窗口 afxcmn.h

CSocket Windows Socket API的包装类 afxsock.h

CSocketFile afxsock.h

CSpinButtonCtrl 提供箭头按钮,用户可单击它,以增加或减少某个控件中的一个值 afxcmn.h

CSplitterWnd afxext.h

CStatic 用于标识另一个控件或给用户提供消息的简单文本框 afxwin.h

CStatusBar afxext.h

CStatusBarCtrl 提供一个层次窗口,通常放于父窗口的底部,用于显示关于应用程序的状态信息 afxcmn.h

CStdioFile afx.h

CString afx.h

CStringArray afxcoll.h

CStringList afxcoll.h

CSyncObject afxmt.h

CTabCtrl 允许应用程序在一个窗口或对话框的同一区域显示多个页面 afxcmn.h

CTime afx.h

CTimeSpan afx.h

CToolBar afxext.h

CToolBarCtrl 工具栏通用控件 afxcmn.h

CToolTipCtrl 提供工具提示控件的功能,它以一个小弹出窗口的样子显示,包含描述某个工具用途的一行文本 afxcmn.h

CTreeCtrl 显示项的分层结构列表 afxcmn.h

CTreeView 简化CTreeCtrl的用法 afxcview.h

CTypedPtrArray afxtempl.h

CTypedPtrList afxtempl.h

CTypedPtrMap afxtempl.h

CUIntArray afxcoll.h

CUserException afxwin.h

CView 用于显示程序数据的类 afxwin.h

CWaitCursor afxwin.h

CWinApp afxwin.h

CWindowDC afxwin.h

CWinThread 代表一个应用程序中的一个线程 afxwin.h

CWnd afxwin.h

CWordArray afxcoll.h

相关

有趣的是,MFC使用“Afx”作为所有的全局函数的前缀,“afx”作为全局变量的前缀。因为在MFC的早期开发阶段它叫“Application Framework Extensions”缩写为“AFX”。AFX提供了对Windows API的高度抽象,建立了全新的面向对象的AFX API,但它对于新手来说太复杂了,所以AFX小组不得不重新开始。后来他们创建了一组C++类,这就是MFC。MFC这个名字被采用得太晚了以至于没来得及修改这些引用。

最近,MFC8.0和Visual Studio 2005一起发布了;MFC9.0和Visual Studio 2008一起发布。在免费的Express版本的Visual Studio 2005/2008中没有包含MFC。

作为一个强有力的竞争对手,为Borland的Turbo C++编译器设计OWL(Object Windows Library)在同一时间也发布了。但最后,Borland停止了对OWL的继续开发并且不久就从Microsoft那里购买了MFC头文件,动态链接库等的授权,微软没有提供完整的MFC的集成支持。之后Borland发布了VCL(Visual Component Library)来替换OWL框架。

数据类型

BOOL Boolean值(TRUE或FALSE)

BSTR 32-bit字符指针

BYTE 8-bit整数,无符号

COLORREF 32-bit数值,代表颜色值

DWORD 32-bit整数,无符号

LONG 32-bit整数,有符号

LPARAM 32-bit数值,作为窗口函数或callback的参数

LPCSTR 32-bit指针,指向一个常数字符串

LPSTR 32-bit指针,指向一个字符串

LPCTSTR 32-bit指针,指向一个常数字符串,此字符串可以移植到Unicode和DBCS(双字节字集)

LPTSTR 32-bit指针,指向一个字符串,此字符串可以移植到Unicode和DBCS(双字节字集)

LPVOID 32-bit指针,指向一个未指定类型的数据

LPRESULT 32-bit数值,作为窗口函数或callback的返回值

UINT Unsigned int

WNDPROC 32-bit指针,指向一个窗口函数

WORD 16-bit整数,无符号

WPARAM 窗口函数或callback的一个参数

特有的数据类型

POSITION 一个数值,代表collection对象中的元素位置,常用于MFC collection classes

LPCRECT 32-bit指针,指向一个不变的RECT结构

版本更新

新产品版本 MFC版本

Microsoft C/C++ 7.0 MFC 1.0

Visual C++ 1.0 MFC 2.0

Visual C++ 1.5 MFC 2.5

Visual C++ 2.0 MFC 3.0

Visual C++ 2.1 MFC 3.1

Visual C++ 2.2 MFC 3.2

Visual C++ 4.0 MFC 4.0 (mfc40.dll included with Windows 95)

Visual C++ 4.1 MFC 4.1

Visual C++ 4.2 MFC 4.2 (mfc42.dll included with the Windows 98 original release)

eMbedded Visual C++ 3.0 MFC 4.2 (mfc42.dll)

Visual C++ 5.0 MFC 4.21 (mfc42.dll)

Visual C++ 6.0 MFC 6.0 (mfc42.dll)

eMbedded Visual C++ 4.0 none

Visual C++ .NET 2002 MFC 7.0 (mfc70.dll)

Visual C++ .NET 2003 MFC 7.1 (mfc71.dll)

Visual C++ 2005 MFC 8.0 (mfc80.dll)

Visual C++ 2008 MFC 9.0.21022 (mfc90.dll)

Visual C++ 2008 with Feature Pack MFC 9.0.30411 (mfc90.dll)

Visual C++ 2010 MFC 10.0 (mfc100.dll)

编程优势

随着编程语言的推陈出新,MFC一些缺点日益突出。最重要的就是入门门槛相对其他语言要高,而且同样完成一个任务代码量相对较多。而原有的优势如运行速度快等,也因为其他编程语言的日臻完善和个人电脑的运算速度增加而显得不那么突出。MFC似乎江河日下。

但是MFC真的没有任何优势了吗?不是,面对底层程序,它能很轻松的与Windows API或驱动程序结合,就是在自己的代码中直接使用API函数,而API和驱动程序的资料都是以C语言为基础的,这使得VC程序员能够更轻松的使用Windows API。这样造成了一个很有意思的现象,即入门时VC程序员要付出更多的努力来学习,但是一旦掌握后,开发其他领域的程序或使用第三方软件时,如工业控制类的程序,由于底层的程序都是用C语言编写,反倒是VC程序员能够更快的掌握该领域的编程技术。而很多其他的编程语言甚至找不到相关的资料。这就说明VC(MFC)实际上是一种入门困难,但是扩展学习却很轻松的语言框架。如果既限于某一领域的话VC毫无优势可言,但是如果开发一个新的领域的应用程序或者该程序涉及多个应用领域的话,可减少重复学习的频率和难度,VC(MFC)的优势会立刻显现出来。

相关书籍

(1)侯俊杰, 《深入浅出MFC》

(2)孙鑫.《VC++深入详解》

(3)Ivor Horton著 李颂华 康会光 译《Visual C++ 2005 入门经典》

3 质量流量控制器英文缩写

质量流量控制器, 即Mass Flow Controller(缩写为MFC), 不但具有质量流量计的功能,更重要的是,它能自动控制气体流量,即用户可根据需要进行流量设定,MFC自动地将流量恒定在设定值上,即使系统压力有波动或环境温度有变化,也不会使其偏离设定值。简单地说,质量流量控制器就是一个稳流装置, 是一个可以手动设定或与计算机联接自动控制的气体稳流装置。

MFC为Mass Flow Controller的缩写,即质量流量控制。流体在旋转的管内流动时会对管壁产生一个力,它是科里奥利在1832年研究水轮机时发现的,简称科氏力。质量流量计以科氏力为基础,在传感器内部有两根平行的T型振管,中部装有驱动线圈,两端装有拾振线圈,变送器提供的激励电压加到驱动线圈上时,振动管作往复周期振动,工业过程的流体介质流经传感器的振动管,就会在振管上产生科氏力效应,使两根振管扭转振动,安装在振管两端的拾振线圈将产生相位不同的两组信号,这两个信号差与流经传感器的流体质量流量成比例关系。计算机解算出流经振管的质量流量。不同的介质流经传感器时,振管的主振频率不同,据此解算出介质密度。安装在传感器器振管上的铂电阻可间接测量介质的温度。

质量流量计直接测量通过流量计的介质的质量流量,还可测量介质的密度及间接测量介质的温度。由于变送器是以单片机为核心的智能仪表,因此可根据上述三个基本量而导出十几种参数供用户使用。质量流量计组态灵活,功能强大,性能价格比高,是新一代流量仪表。

测量管道内质量流量的流量测量仪表。在被测流体处于压力、温度等参数变化很大的条件下,若仅测量体积流量,则会因为流体密度的变化带来很大的测量误差。在容积式和差压式流量计中,被测流体的密度可能变化30%,这会使流量产生30~40%的误差。随着自动化水平的提高,许多生产过程都对流量测量提出了新的要求。化学反应过程是受原料的质量(而不是体积)控制的。蒸气、空气流的加热、冷却效应也是与质量流量成比例的。产品质量的严格控制、精确的成本核算、飞机和导弹的燃料量控制,也都需要精确的质量流量测量。因此质量流量计是一种重要的流量测量仪表。

质量流量计可分为两类:一类是直接式,即直接输出质量流量;另一类为间接式或推导式,如应用超声流量计和密度计组合,对它们的输出再进行乘法运算以得出质量流量。

直接式质量流量计 直接式质量流量计有多种类型,如量热式、角动量式、陀螺式和双叶轮式等。

(1) 主要参数:

质量流量精度: ±0.002×流量±零点漂移

密度测量精度: ±0.003g/cm3

密度测量范围: 0.5~1.5g/cm3

温度测量范围: ±1°C

(2) 传感器相关数据:

环境温度: -40~60°C

介质温度: -50~200°C

防爆类型: iBⅡBT3

关联设备: 配套变送器

(3) 变送器相关数据:

工作温度: 0~60°C

相对湿度: 95%以下

电 源: 220±10%VAC,50Hz或24±5%VDC,40W

4 三聚氰胺贴面板英文缩写

三聚氰胺环保板,一种以刨花板为基材,表面经“三聚氰胺”(MELAMINE)专业加工处理,具耐磨,抗刻划,耐高温,易清洁,耐酸碱等优点的复合型饰板,英文简称为MFC(三聚氰胺贴面板)。MFC广泛被采用为板式家具,办公家具及厨房家具的主要用材。

5 婚姻家庭咨询师英文简称

即“婚姻家庭咨询师”,是国家新职业“婚姻家庭咨询师”的英文全称“marriage family consultant ”的缩写。婚姻家庭咨询师是为在恋爱、婚姻、家庭生活中遇到各种问题的求助者提供咨询服务的人员。该职业由劳动部07年发布,08年印发职业标准,,09年6月在北京举行第一次考试,09年七月产生第一个行业论坛“婚姻家庭咨询师之家”,09年12月在北京举行了第一次行业年会。

6 ARM微处理器内部硬件电路

Multi Format Codec的缩写,中文释义:多格式编码器。

是ARM微处理器内部一种支持多种硬件编码方式的硬件电路,能够编码/解码 MPEG-4/H.263/H.264(30fps)等多种格式的多媒体影像。

7 蒙顿飞行学院英文缩写

Moncton Flight College 缩写为 MFC

蒙顿飞行学院是 加拿大最古老的飞行学院之一 从1929年开始,蒙顿飞行学院就致力于为航空业培养专业及高素质的飞行员。

蒙顿飞行学院位于加拿大 New Brunswick 省 Moncton市 机场第四停机坪旁边

地址Moncton Flight College 1719 Champlain St. Dieppe, NB Canada, E1A 7P5

从1929年起开始以蒙顿航空俱乐部培训飞行员,曾改名为 蒙顿飞行俱乐部,蒙顿飞行中心,最后于1997年 引进两年制的学位课程,成为了蒙顿飞行学院。

蒙顿飞行学院是中国培养飞行员的主要航校之一

2006年北京航空航天大学飞行学院开始往蒙顿飞行学院送飞行学员,毕业后于南方航空公司签订就业合同。

2007年蒙顿飞行学院在New Brunswick 省 省会城市Fredericton 成立了分校 陆续有深航,川航,东航,国航,北航,厦航等公司送学院前往学习。

2008年5月 厦门航空公司送出加拿大蒙顿第一批飞行学员。

蒙顿飞行学院主要的培训机型是 DA20 Diamond Eclipse 两座单发螺旋桨飞机17架 CESSNA 172 5架 PA-44 Piper Seminole 双发3架 Kingair c-90 一架

这里的培训周期平均是14个月 从10到22个月不等

蒙顿飞行学院对中国学员的课程安排主要是

PPL 私人飞行员执照

Night Rating 夜航等级

CPL 商业飞行员执照

Multi Rating 双发等级

IFR 仪表飞行等级

ATPL 航线飞行员执照

8 麦肯基快餐简称

在广东某些地区很流行的一种中式快餐,其风格类似于麦当劳、肯德基。

9 魔兽玩家moon的fans的小窝缩写

MFC = Moon Fans Club

10 微功能电路英文缩写

MFC = microfunction circuit microfunction circuit 微功能电路

11 磁带记录扫描英文缩写

MFC = magnetic-tape field scan

magnetic-tape field scan 磁带记录扫描

12 美绪后援会通称

绫赖川 雾乃(绫瀬川 雾乃(あやせがわ きりの))

太郎的班级的学级委员长。“美绪后援会(通称:MFC)”的始创者及会长。很喜欢美绪,但也因此对于常

常在一起的太郎抱持敌意。

片桐 志帆(片桐 志帆(かたぎり しほ))

樱守高中的学生会长。整った颜立ちをしており、落ち着いた雰囲気をしている。MFC的委员。

13 C++的图形化界面语言

mfc是微软基础类库的简称,是微软公司实现的一个c++类库,主要封装了大部分的windows API函数,vc++是微软公司开发的c/c++的集成开发环境,所谓集成开发环境,就是说利用它你可以编辑,编译,调试,而不是使用多种工具轮换操作,灵活性较大。有时人们说vc呢也指它的内部编译器,集成开发环境必须有一个编译器内核,要不有什么用,例如DevC++其中一个编译器内核就是gcc。 MFC除了是一个类库以外,还是一个框架,你应该试过,在vc++里新建一个MFC的工程,开发环境会自动帮你产生许多文件,同时它使用了mfcxx.dll。xx是版本,它封装了mfc内核,所以你在你的代码看不到原本的SDK编程中的消息循环等等东西,因为MFC框架帮你封装好了,这样你就可以专心的考虑你程序的逻辑,而不是这些每次编程都要重复的东西,但是由于是通用框架,没有最好的针对性,当然也就丧失了一些灵活性和效率但是MFC的封装很浅,所以效率上损失不大,灵活性还可以,虽然也有很多缺陷,但还是一个比较好的东西。

MFC和Win32

MFC Object和Windows Object的关系

MFC中最重要的封装是对Win32 API的封装,因此,理解Windows Object和MFC Object (C++对象,一个C++类的实例)之间的关系是理解MFC的关键之一。所谓Windows Object(Windows对象)是Win32下用句柄表示的Windows操作系统对象;所谓MFC Object (MFC对象)是C++对象,是一个C++类的实例,这里(本书范围内)MFC Object是有特定含义的,指封装Windows Object的C++ Object,并非指任意的C++ Object。

MFC Object 和Windows Object是不一样的,但两者紧密联系。以窗口对象为例:

一个MFC窗口对象是一个C++ CWnd类(或派生类)的实例,是程序直接创建的。在程序执行中它随着窗口类构造函数的调用而生成,随着析构函数的调用而消失。而Windows窗口则是Windows系统的一个内部数据结构的实例,由一个“窗口句柄”标识,Windows系统创建它并给它分配系统资源。Windows窗口在MFC窗口对象创建之后,由CWnd类的Create成员函数创建,“窗口句柄”保存在窗口对象的m_hWnd成员变量中。Windows窗口可以被一个程序销毁,也可以被用户的动作销毁。MFC窗口对象和Windows窗口对象的关系如图2-1所示。其他的Windows Object和对应的MFC Object也有类似的关系。

下面,对MFC Object和Windows Object作一个比较。有些论断对设备描述表(MFC类是CDC,句柄是HDC)可能不适用,但具体涉及到时会指出。

从数据结构上比较

MFC Object是相应C++类的实例,这些类是MFC或者程序员定义的;

Windows Object是Windows系统的内部结构,通过一个句柄来引用;

MFC给这些类定义了一个成员变量来保存MFC Object对应的Windows Object的句柄。对于设备描述表CDC类,将保存两个HDC句柄。

从层次上讲比较

MFC Object是高层的,Windows Object是低层的;

MFC Object封装了Windows Object的大部分或全部功能,MFC Object的使用者不需要直接应用Windows Object的HANDLE(句柄)使用Win32 API,代替它的是引用相应的MFC Object的成员函数。

从创建上比较

MFC Object通过构造函数由程序直接创建;Windows Object由相应的SDK函数创建。

MFC中,使用这些MFC Object,一般分两步:

首先,创建一个MFC Object,或者在STACK中创建,或者在HEAP中创建,这时,MFC Object的句柄实例变量为空,或者说不是一个有效的句柄。

然后,调用MFC Object的成员函数创建相应的Windows Object,MFC的句柄变量存储一个有效句柄。

CDC(设备描述表类)的创建有所不同,在后面的2.3节会具体说明CDC及其派生类的创建和使用。

当然,可以在MFC Object的构造函数中创建相应的Windows对象,MFC的GDI类就是如此实现的,但从实质上讲,MFC Object的创建和Windows Object的创建是两回事。

从转换上比较

可以从一个MFC Object得到对应的Windows Object的句柄;一般使用MFC Object的成员函数GetSafeHandle得到对应的句柄。

可以从一个已存在的Windows Object创建一个对应的MFC Object; 一般使用MFC Object的成员函数Attach或者FromHandle来创建,前者得到一个永久性对象,后者得到的可能是一个临时对象。

从使用范围上比较

MFC Object对系统的其他进程来说是不可见、不可用的;而Windows Object一旦创建,其句柄是整个Windows系统全局的。一些句柄可以被其他进程使用。典型地,一个进程可以获得另一进程的窗口句柄,并给该窗口发送消息。

对同一个进程的线程来说,只可以使用本线程创建的MFC Object,不能使用其他线程的MFC Object。

从销毁上比较

MFC Object随着析构函数的调用而消失;但Windows Object必须由相应的Windows系统函数销毁。

设备描述表CDC类的对象有所不同,它对应的HDC句柄对象可能不是被销毁,而是被释放。

当然,可以在MFC Object的析构函数中完成Windows Object的销毁,MFC Object的GDI类等就是如此实现的,但是,应该看到:两者的销毁是不同的。

每类Windows Object都有对应的MFC Object,下面用表格的形式列出它们之间的对应关系,如表2-1所示:

表2-1 MFC Object和Windows Object的对应关系

描述  Windows句柄  MFC Object

窗口  HWND  CWnd and CWnd-derived classes

设备上下文  HDC  CDC and CDC-derived classes

菜单  HMENU  CMenu

笔  HPEN  CGdiObject类,CPen和CPen-derived classes

刷子  HBRUSH  CGdiObject类,CBrush和CBrush-derived classes

字体  HFONT  CGdiObject类,CFont和CFont-derived classes

位图  HBITMAP  CGdiObject类,CBitmap和CBitmap-derived classes

调色板  HPALETTE  CGdiObject类,CPalette和CPalette-derived classes

区域  HRGN  CGdiObject类,CRgn和CRgn-derived classes

图像列表  HimageLIST  CimageList和CimageList-derived classes

套接字  SOCKET  CSocket,CAsynSocket及其派生类 表2-1中的OBJECT分以下几类:

Windows对象,

设备上下文对象,

GDI对象(BITMAP,BRUSH,FONT,PALETTE,PEN,RGN),

菜单,

图像列表,

网络套接字接口。

从广义上来看,文档对象和文件可以看作一对MFC Object和Windows Object,分别用CDocument类和文件句柄描述。

后续几节分别对前四类作一个简明扼要的论述。

Windows Object

用SDK的Win32 API编写各种Windows应用程序,有其共同的规律:首先是编写WinMain函数,编写处理消息和事件的窗口过程WndProc,在WinMain里头注册窗口(Register Window),创建窗口,然后开始应用程序的消息循环。

MFC应用程序也不例外,因为MFC是一个建立在SDK API基础上的编程框架。对程序员来说所不同的是:一般情况下,MFC框架自动完成了Windows登记、创建等工作。

下面,简要介绍MFC Window对Windows Window的封装。

Windows的注册

一个应用程序在创建某个类型的窗口前,必须首先注册该“窗口类”(Windows Class)。注意,这里不是C++类的类。Register Window把窗口过程、窗口类型以及其他类型信息和要登记的窗口类关联起来。

“窗口类”的数据结构

“窗口类”是Windows系统的数据结构,可以把它理解为Windows系统的类型定义,而Windows窗口则是相应“窗口类”的实例。Windows使用一个结构来描述“窗口类”,其定义如下:

typedef struct _WNDCLASSEX {

UINT cbSize; //该结构的字节数

UINT style; //窗口类的风格

WNDPROC lpfnWndProc; //窗口过程

int cbClsExtra;

int cbWndExtra;

HANDLE hInstance; //该窗口类的窗口过程所属的应用实例

HICON hIcon; //该窗口类所用的像标

HCURSOR hCursor; //该窗口类所用的光标

HBRUSH hbrBackground; //该窗口类所用的背景刷

LPCTSTR lpszMenuName; //该窗口类所用的菜单资源

LPCTSTR lpszClassName; //该窗口类的名称

HICON hIconSm; //该窗口类所用的小像标

} WNDCLASSEX;

从“窗口类”的定义可以看出,它包含了一个窗口的重要信息,如窗口风格、窗口过程、显示和绘制窗口所需要的信息,等等。关于窗口过程,将在后面消息映射等有关章节作详细论述。

Windows系统在初始化时,会注册(Register)一些全局的“窗口类”,例如通用控制窗口类。应用程序在创建自己的窗口时,首先必须注册自己的窗口类。在MFC环境下,有几种方法可以用来注册“窗口类”,下面分别予以讨论。

调用AfxRegisterClass注册

AfxRegisterClass函数是MFC全局函数。AfxRegisterClass的函数原型:

BOOL AFXAPI AfxRegisterClass(WNDCLASS *lpWndClass);

参数lpWndClass是指向WNDCLASS结构的指针,表示一个“窗口类”。

首先,AfxRegisterClass检查希望注册的“窗口类”是否已经注册,如果是则表示已注册,返回TRUE,否则,继续处理。

接着,调用::RegisterClass(lpWndClass)注册窗口类;

然后,如果当前模块是DLL模块,则把注册“窗口类”的名字加入到模块状态的域m_szUnregisterList中。该域是一个固定长度的缓冲区,依次存放模块注册的“窗口类”的名字(每个名字是以“\\\0”结尾的字符串)。之所以这样做,是为了DLL退出时能自动取消(Unregister)它注册的窗口类。至于模块状态将在后面第9章详细的讨论。

最后,返回TRUE表示成功注册。

调用AfxRegisterWndClass注册

AfxRegisterWndClass函数也是MFC全局函数。AfxRegisterWndClass的函数原型:

LPCTSTR AFXAPI AfxRegisterWndClass(UINT nClassStyle,

HCURSOR hCursor, HBRUSH hbrBackground, HICON hIcon)

参数1指定窗口类风格;

参数2、3、4分别指定该窗口类使用的光标、背景刷、像标的句柄,缺省值是0。

此函数根据窗口类属性动态地产生窗口类的名字,然后,判断是否该类已经注册,是则返回窗口类名;否则用指定窗口类的属性(窗口过程指定为缺省窗口过程),调用AfxRegisterCalss注册窗口类,返回类名。

动态产生的窗口类名字由以下几部分组成(包括冒号分隔符):

如果参数2、3、4全部为NULL,则由三部分组成。

“Afx”+“:”+模块实例句柄”+“:”+“窗口类风格”

否则,由六部分组成:

“Afx”+“:”+模块实例句柄+“:”+“窗口类风格”+“:”+光标句柄+“:”+背景刷句柄+“:”+像标句柄。比如:“Afx:400000:b:13de:6:32cf”。

该函数在MFC注册主边框或者文档边框“窗口类”时被调用。具体怎样用在5.3.3.3节会指出。

隐含的使用MFC预定义的的窗口类

MFC4.0以前的版本提供了一些预定义的窗口类,4.0以后不再预定义这些窗口类。但是,MFC仍然沿用了这些窗口类,例如:

用于子窗口的“AfxWnd”;

用于边框窗口(SDI主窗口或MDI子窗口)或视的“AfxFrameOrView”;

用于MDI主窗口的“AfxMDIFrame”;

用于标准控制条的“AfxControlBar”。

这些类的名字就 是“AfxWnd”、“AfxFrameOrView”、“AfxMdiFrame”、 “AfxControlBar”加上前缀和后缀(用来标识版本号或是否调试版等)。它们使用标准应用程序像标、标准文档像标、标准光标等标准资源。为了使用这些“窗口类”,MFC会在适当的时候注册这些类:或者要创建该类的窗口时,或者创建应用程序的主窗口时,等等。

MFC内部使用了函数

BOOL AFXAPI AfxEndDeferRegisterClass(short fClass)

来帮助注册上述原MFC版本的预定义“窗口类”。参数fClass区分了那些预定义窗口的类型。根据不同的类型,使用不同的窗口类风格、窗口类名字等填充WndClass的域,然后调用AfxRegisterClass注册窗口类。并且注册成功之后,通过模块状态的m_fRegisteredClasses记录该窗口类已经注册,这样该模块在再次需要注册这些窗口类之前可以查一下m_fRegisteredClasses,如果已经注册就不必浪费时间了。为此,MFC内部使用宏

AfxDeferRegisterClass(short fClass)

来注册“窗口类”,如果m_fRegisteredClasses记录了注册的窗口类,返回TRUE,否则,调用AfxEndDeferRegisterClass注册。

注册这些窗口类的例子:

MFC在加载边框窗口时,会自动地注册“AfxFrameOrView”窗口类。在创建视时,就会使用该“窗口类”创建视窗口。当然,如果创建视窗口时,该“窗口类”还没有注册,MFC将先注册它然后使用它创建视窗口。

不过,MFC并不使用”AfxMDIFrame”来创建MDI主窗口,因为在加载主窗口时一般都指定了主窗口的资源,MFC使用指定的像标注册新的MDI主窗口类(通过函数AfxRegisterWndClass完成,因此“窗口类”的名字是动态产生的)。

MDI子窗口类似于上述MDI主窗口的处理。

在MFC创建控制窗口时,如工具栏窗口,如果“AfxControlBar”类还没有注册,则注册它。注册过程很简单,就是调用::InitCommonControl加载通用控制动态连接库。

调用::RegisterWndClass。

直接调用Win32的窗口注册函数::RegisterWndClass注册“窗口类”,这样做有一个缺点:如果是DLL模块,这样注册的“窗口类”在程序退出时不会自动的被取消注册(Unregister)。所以必须记得在DLL模块退出时取消它所注册的窗口类。

子类化

子类化(Subclass)一个“窗口类”,可自动地得到它的“窗口类”属性。

MFC窗口类CWnd

在Windows系统里,一个窗口的属性分两个地方存放:一部分放在“窗口类”里头,如上所述的在注册窗口时指定;另一部分放在Windows Object本身,如:窗口的尺寸,窗口的位置(X,Y轴),窗口的Z轴顺序,窗口的状态(ACTIVE,MINIMIZED,MAXMIZED,RESTORED…),和其他窗口的关系(父窗口,子窗口…),窗口是否可以接收键盘或鼠标消息,等等。

为了表达所有这些窗口的共性,MFC设计了一个窗口基类CWnd。有一点非常重要,那就是CWnd提供了一个标准而通用的MFC窗口过程,MFC下所有的窗口都使用这个窗口过程。至于通用的窗口过程却能为各个窗口实现不同的操作,那就是MFC消息映射机制的奥秘和作用了。这些,将在后面有关章节详细论述。

CWnd提供了一系列成员函数,或者是对Win32相关函数的封装,或者是CWnd新设计的一些函数。这些函数大致如下。

(1)窗口创建函数

这里主要讨论函数Create和CreateEx。它们封装了Win32窗口创建函数::CreateWindowEx。Create的原型如下:

BOOL CWnd::Create(LPCTSTR lpszClassName,

LPCTSTR lpszWindowName, DWORD dwStyle,

const RECT& rect,

CWnd* pParentWnd, UINT nID,

CCreateContext* pContext)

Create是一个虚拟函数,用来创建子窗口(不能创建桌面窗口和POP UP窗口)。CWnd的基类可以覆盖该函数,例如边框窗口类等覆盖了该函数以实现边框窗口的创建,视类则使用它来创建视窗口。

Create调用了成员函数CreateEx。CWnd::CreateEx的原型如下:

BOOL CWnd::CreateEx(DWORD dwExStyle, LPCTSTR lpszClassName,

LPCTSTR lpszWindowName, DWORD dwStyle,

int x, int y, int nWidth, int nHeight,

HWND hWndParent, HMENU nIDorHMenu, LPVOID lpParam)

CreateEx有11个参数,它将调用::CreateWindowEx完成窗口的创建,这11个参数对应地传递给::CreateWindowEx。参数指定了窗口扩展风格、“窗口类”、窗口名、窗口大小和位置、父窗口句柄、窗口菜单和窗口创建参数。

CreateEx的处理流程将在后面4.4.1节讨论窗口过程时分析。

窗口创建时发送WM_CREATE消息,消息参数lParam指向一个CreateStruct结构的变量,该结构有11个域,其描述见后面4.4.1节对窗口过程的分析,Windows使用和CreateEx参数一样的内容填充该变量。

(2)窗口销毁函数

例如:

DestroyWindow函数 销毁窗口

PostNcDestroy( ),销毁窗口后调用,虚拟函数

(3)用于设定、获取、改变窗口属性的函数,例如:

SetWindowText(CString tiltle) 设置窗口标题

GetWindowText() 得到窗口标题

SetIcon(HICON hIcon, BOOL bBigIcon);设置窗口像标

GetIcon( BOOL bBigIcon ) ;得到窗口像标

GetDlgItem( int nID);得到窗口类指定ID的控制子窗口

GetDC(); 得到窗口的设备上下文

SetMenu(CMenu *pMenu); 设置窗口菜单

GetMenu();得到窗口菜单

(4)用于完成窗口动作的函数

用于更新窗口,滚动窗口,等等。一部分成员函数设计成或可重载(Overloaded)函数,或虚拟(Overridden)函数,或MFC消息处理函数。这些函数或者实现了一部分功能,或者仅仅是一个空函数。如:

有关消息发送的函数:

SendMessage( UINT message,WPARAM wParam = 0, LPARAM lParam = 0 );

给窗口发送发送消息,立即调用方式

PostMessage(( UINT message,WPARAM wParam = 0, LPARAM lParam = 0 );

给窗口发送消息,放进消息队列

有关改变窗口状态的函数

MoveWindow( LPCRECT lpRect, BOOL bRepaint = TRUE );

移动窗口到指定位置

ShowWindow(BOOL );显示窗口,使之可见或不可见

….

实现MFC消息处理机制的函数:

virtual LRESULT WindowProc( UINT message, WPARAM wParam, LPARAM lParam ); 窗口过程,虚拟函数

virtual BOOL OnCommand( WPARAM wParam, LPARAM lParam );处理命令消息

消息处理函数:

OnCreate( LPCREATESTRUCT lpCreateStruct );MFC窗口消息处理函数,窗口创建时由MFC框架调用

OnClose();MFC窗口消息处理函数,窗口创建时由MFC框架调用

其他功能的函数

CWnd的导出类是类型更具体、功能更完善的窗口类,它们继承了CWnd的属性和方法,并提供了新的成员函数(消息处理函数、虚拟函数、等等)。

常用的窗口类及其层次关系见图1-1。

在MFC下创建一个窗口对象

MFC下创建一个窗口对象分两步,首先创建MFC窗口对象,然后创建对应的Windows窗口。在内存使用上,MFC窗口对象可以在栈或者堆(使用new创建)中创建。具体表述如下:

创建MFC窗口对象。通过定义一个CWnd或其派生类的实例变量或者动态创建一个MFC窗口的实例,前者在栈空间创建一个MFC窗口对象,后者在堆空间创建一个MFC窗口对象。

调用相应的窗口创建函数,创建Windows窗口对象。

例如:在前面提到的AppWizard产生的源码中,有CMainFrame(派生于CMDIFrame(SDI)或者CMDIFrameWnd(MDI))类。它有两个成员变量定义如下:

CToolBar m_wndToolBar;

CStatusBar m_wndStatusBar;

当创建CMainFrame类对象时,上面两个MFC Object也被构造。

CMainFrame还有一个成员函数

OnCreate(LPCREATESTRUCT lpCreateStruct),

它的实现包含如下一段代码,调用CToolBar和CStatusBar的成员函数Create来创建上述两个MFC对象对应的工具栏HWND窗口和状态栏HWND窗口:

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)

{

if (!m_wndToolBar.Create(this) ||

!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))

{

TRACE0("Failed to create toolbar\");

return -1; // fail to create

}

if (!m_wndStatusBar.Create(this) ||

!m_wndStatusBar.SetIndicators(indicators,

sizeof(indicators)/sizeof(UINT)))

{

TRACE0("Failed to create status bar\");

return -1; // fail to create

}

}

关于工具栏、状态栏将在后续有关章节作详细讨论。

在MFC中,还提供了一种动态创建技术。动态创建的过程实际上也如上所述分两步,只不过MFC使用这个技术是由框架自动地完成整个过程的。通常框架窗口、文档框架窗口、视使用了动态创建。介于MFC的结构,CFrameWnd和CView及其派生类的实例即使不使用动态创建,也要用new在堆中分配。理由见窗口的销毁(2.2.5节)。

至于动态创建技术,将在下一章具体讨论。

在Windows窗口的创建过程中,将发送一些消息,如:

在创建了窗口的非客户区(Nonclient area)之后,发送消息WM_NCCREATE;

在创建了窗口的客户区(client area)之后,发送消息WM_CREATE;

窗口的窗口过程在窗口显示之前收到这两个消息。

如果是子窗口,在发送了上述两个消息之后,还给父窗口发送WM_PARENATNOTIFY消息。其他类或风格的窗口可能发送更多的消息,具体参见SDK开发文档。

MFC窗口的使用

MFC提供了大量的窗口类,其功能和用途各异。程序员应该选择哪些类来使用,以及怎么使用他们呢?

直接使用MFC提供的窗口类或者先从MFC窗口类派生一个新的C++类然后使用它,这些在通常情况下都不需要程序员提供窗口注册的代码。是否需要派生新的C++类,视MFC已有的窗口类是否能满足使用要求而定。派生的C++类继承了基类的特性并改变或扩展了它的功能,例如增加或者改变对消息、事件的特殊处理等。

主要使用或继承以下一些MFC窗口类(其层次关系图见图1-1):

框架类CFrameWnd,CMdiFrameWnd;

文档框架CMdiChildWnd;

视图CView和CView派生的有特殊功能的视图如:列表CListView,编辑CEditView,树形列表CTreeView,支持RTF的CRichEditView,基于对话框的视CFormView等等。

对话框CDialog。

通常,都要从这些类派生应用程序的框架窗口和视窗口或者对话框。

工具条CToolBar

状态条CStatusBar

其他各类控制窗口,如列表框CList,编辑框CEdit,组合框CComboBox,按钮Cbutton等。

通常,直接使用这些类。

在MFC下窗口的销毁

窗口对象使用完毕,应该销毁。在MFC下,一个窗口对象的销毁包括HWND窗口对象的销毁和MFC窗口对象的销毁。一般情况下,MFC编程框架自动地处理了这些。

(1)对CFrameWnd和CView的派生类

这些窗口的关闭导致销毁窗口的函数DestroyWindow被调用。销毁Windows窗口时,MFC框架调用的最后一个成员函数是OnNcDestroy函数,该函数负责Windows清理工作,并在最后调用虚拟成员函数PostNcDestroy。CFrameWnd和CView的PostNcDestroy调用delete this删除自身这个MFC窗口对象。

所以,对这些窗口,如前所述,应在堆(Heap)中分配,而且,不要对这些对象使用delete操作。

(2)对Windows Control窗口

在它们的析构函数中,将调用DestroyWidnow来销毁窗口。如果在栈中分配这样的窗口对象,则在超出作用范围的时候,随着析构函数的调用,MFC窗口对象和它的Windows window对象都被销毁。如果在堆(Heap)中分配,则显式调用delete操作符,导致析构函数的调用和窗口的销毁。

所以,这种类型的窗口应尽可能在栈中分配,避免用额外的代码来销毁窗口。如前所述的CMainFrame的成员变量m_wndStatusBar和m_wndToolBar就是这样的例子。

(3)对于程序员直接从CWnd派生的窗口

程序员可以在派生类中实现上述两种机制之一,然后,在相应的规范下使用。

后面章节将详细的讨论应用程序退出时关闭、清理窗口的过程。

设备描述表

设备描述表概述

当一个应用程序使用GDI函数时,必须先装入特定的设备驱动程序,然后为绘制窗口准备设备描述表,比如指定线的宽度和颜色、刷子的样式和颜色、字体、剪裁区域等等。不像其他Win32结构,设备描述表不能被直接访问,只能通过系列Win32函数来间接地操作。

如同Windows“窗口类”一样,设备描述表也是一种Windows数据结构,用来描述绘制窗口所需要的信息。它定义了一个坐标映射模式、一组GDI图形对象及其属性。这些GDI对象包括用于画线的笔,绘图、填图的刷子,位图,调色板,剪裁区域,及路径(Path)。

表2-2列出了设备描述表的结构和各项缺省值,表2-3列出了设备描述表的类型,表2-4显示设备描述表的类型。

表2-2 设备描述表的结构

属性  缺省值

Background color  Background color setting from Windows Control Panel (typically, white)

Background mode  OPAQUE

Bitmap  None

Brush  WHITE_BRUSH

Brush origin  (0,0)

Clipping region  Entire window or client area with the update region clipped, as appropriate. Child and pop-up windows in the client area may also be clipped



Palette  DEFAULT_PALETTE

Current pen position  (0,0)

Device origin  Upper left corner of the window or the client area

Drawing mode  R2_COPYPEN

Font  SYSTEM_FONT (SYSTEM_FIXED_FONT for applications written to run with Windows versions 3.0 and earlier)


Intercharacter spacing  0

Mapping mode  MM_TEXT

Pen  BLACK_PEN

Polygon-fill mode  ALTERNATE

Stretch mode  BLACKONWHITE

Text color  Text color setting from Control Panel (typically, black)

Viewport extent  (1,1)

Viewport origin  (0,0)

Window extent  (1,1)

Window origin  (0,0) 表2-3 设备描述表的分类

Display  显示设备描述表,提供对视频显示设备上的绘制操作的支持

Printer  打印设备描述表,提供对打印机、绘图仪设备上的绘制操作的支持

Memory  内存设备描述表,提供对位图操作的支持

Information  信息设备描述表,提供对操作设备信息获取的支持 表2-3中的显示设备描述表又分三种类型,如表2-4所示。

表2-4 显示设备描述表的分类

名称  特点  功能

Class DeviceContexts  提供对Win16的向后兼容

CommonDeviceContexts  在Windows系统的高速缓冲区,数量有限  Applicaion获取设备描述表时,Windows用缺省值初始化该设备描述表,Application使用它完成绘制操作,然后释放

PrivateDeviceContexts  没有数量限制,用完不需释放一次获取,多次使用  多次使用过程中,每次设备描述表属性的任何修改或变化都会被保存,以支持快速绘制 (1)使用设备描述表的步骤

要使用设备描述表,一般有如下步骤:

获取或者创建设备描述表;

必要的话,改变设备描述表的属性;

使用设备描述表完成绘制操作;

释放或删除设备描述表。

Common设备描述表通过::GetDC,::GetDCEx,::BeginPaint来获得一个设备描述表,用毕,用::ReleaseDC或::EndPaint释放设备描述表;

Printer设备描述表通过::CreateDC创建设备描述表,用::DeleteDC删除设备描述表。

Memory设备描述表通过::CreateCompatibleDC创建设备描述表,用::DeleteDC删除。

Information设备描述表通过::CreateIC创建设备描述表,用::DeleteDC删除。

(2)改变设备描述表属性的途径

要改变设备描述表的属性,可通过以下途径:

用::SelectObject选入新的除调色板以外的GDI Object到设备描述表中;

对于调色板,使用::SelectPalette函数选入逻辑调色板,并使用::RealizePalette把逻辑调色板的入口映射到物理调色板中。

用其他API函数改变其他属性,如::SetMapMode改变映射模式。

设备描述表在MFC中的实现

MFC提供了CDC类作为设备描述表类的基类,它封装了Windows的HDC设备描述表对象和相关函数。

CDC类

CDC类包含了各种类型的Windows设备描述表的全部功能,封装了所有的Win32 GDI 函数和设备描述表相关的SDK函数。在MFC下,使用CDC的成员函数来完成所有的窗口绘制工作。

CDC类有两个成员变量:m_hDC,m_hAttribDC,它们都是Windows设备描述表句柄。CDC的成员函数作输出操作时,使用m_Hdc;要获取设备描述表的属性时,使用m_hAttribDC。

在创建一个CDC类实例时,缺省的m_hDC等于m_hAttribDC。如果需要的话,程序员可以分别指定它们。例如,MFC框架实现CMetaFileDC类时,就是如此:CMetaFileDC从物理设备上读取设备信息,输出则送到元文件(metafile)上,所以m_hDC和m_hAttribDC是不同的,各司其责。还有一个类似的例子:打印预览的实现,一个代表打印机模拟输出,一个代表屏幕显示。

CDC封装::SelectObject(HDC hdc,HGDIOBJECT hgdiobject)函数时,采用了重载技术,即它针对不同的GDI对象,提供了名同而参数不同的成员函数:

SelectObject(CPen *pen)用于选入笔;

SelectObject(CBitmap* pBitmap)用于选入位图;

SelectObject(CRgn *pRgn)用于选入剪裁区域;

SelectObject(CBrush *pBrush)用于选入刷子;

SelectObject(CFont *pFont)用于选入字体;

至于调色板,使用SelectPalette(CPalette *pPalette,BOOL bForceBackground )选入调色板到设备描述表,使用RealizePalletter()实现逻辑调色板到物理调色板的映射。

从CDC派生出功能更具体的设备描述表

下面,分别讨论派生出的四种设备描述表。

CCientDC

代表窗口客户区的设备描述表。其构造函数CClientDC(CWnd *pWin)通过::GetDC获取指定窗口的客户区的设备描述表HDC,并且使用成员函数Attach把它和CClientDC对象捆绑在一起;其析构函数使用成员函数Detach把设备描述表句柄HDC分离出来,并调用::ReleaseDC释放设备描述表HDC。

CPaintDC

仅仅用于响应WM_PAINT消息时绘制窗口,因为它的构造函数调用了::BeginPaint获取设备描述表HDC,并且使用成员函数Attach把它和CPaintDC对象捆绑在一起;析构函数使用成员函数Detach把设备描述表句柄HDC分离出来,并调用::EndPaint释放设备描述表HDC,而::BeginPaint和::EndPaint仅仅在响应WM_PAINT时使用。

CMetaFileDC

用于生成元文件。

CWindowDC

代表整个窗口区(包括非客户区)的设备描述表。其构造函数CWindowDC(CWnd *pWin)通过::GetWindowDC获取指定窗口的客户区的设备描述表HDC,并使用Attach把它和CWindowDC对象捆绑在一起;其析构函数使用Detach把设备描述表HDC分离出来,调用::ReleaseDC释放设备描述表HDC。

MFC设备描述表类的使用

使用CPaintDC、CClientDC、CWindowDC的方法

首先,定义一个这些类的实例变量,通常在栈中定义。然后,使用它。

例如,MFC中CView对WM_PAINT消息的实现方法如下:

void CView::OnPaint()

{

// standard paint routine

CPaintDC dc(this);

OnPrepareDC(&dc);

OnDraw(&dc);

}

在栈中定义了CPaintDC类型的变量dc,随着构造函数的调用获取了设备描述表;设备描述表使用完毕,超出其有效范围就被自动地清除,随着析构函数的调用,其获取的设备描述表被释放。

如果希望在堆中创建,例如

CPaintDC *pDC;

pDC = new CPaintDC(this)

则在使用完毕时,用delete删除pDC:

delete pDC;

直接使用CDC

需要注意的是:在生成CDC对象的时候,并不像它的派生类那样,在构造函数里获取相应的Windows设备描述表。最好不要使用::GetDC等函数来获取一个设备描述表,而是创建一个设备描述表。其构造函数如下:

CDC::CDC()

{

m_hDC = NULL;

m_hAttribDC = NULL;

m_bPrinting = FALSE;

}

其析构函数如下:

CDC::~CDC()

{

if (m_hDC != NULL)

::DeleteDC(Detach());

}

在CDC析构函数中,如果设备描述表句柄不空,则调用DeleteDC删除它。这是直接使用CDC时最好创建Windows设备描述表的理由。如果设备描述表不是创建的,则应该在析构函数被调用前分离出设备描述表句柄并用::RealeaseDC释放它,释放后m_hDC为空,则在析构函数调用时不会执行::DeleteDC。当然,不用担心CDC的派生类的析构函数调用CDC的析构函数,因为CDC::~CDC()不是虚拟析构函数。

直接使用CDC的例子是内存设备上下文,例如:

CDC dcMem; //声明一个CDC对象

dcMem.CreateCompatibleDC(&dc); //创建设备描述表

pbmOld = dcMem.SelectObject(&m_bmBall);//更改设备描述表属性

…//作一些绘制操作

dcMem.SelectObject(pbmOld);//恢复设备描述表的属性

dcMem.DeleteDC(); //可以不调用,而让析构函数去删除设备描述表

GDI对象

在讨论设备描述表时,已经多次涉及到GDI对象。这里,需强调一下:GDI对象要选入Windows 设备描述表后才能使用;用毕,要恢复设备描述表的原GDI对象,并删除该GDI对象。

一般按如下步骤使用GDI对象:

Create or get a GDI OBJECT hNewGdi;

hOldGdi = ::SelectObject(hdc, hNewGdi)

……

::SelectObject(hdc, hOldGdi)

::DeleteObject(hNewGdi)

先创建或得到一个GDI对象,然后把它选入设备描述表并保存它原来的GDI对象;用毕恢复设备描述表原来的GDI对象并删除新创建的GDI对象。

需要指出的是,如果hNewGdi是一个Stock GDI对象,可以不删除(删除也可以)。通过

HGDIOBJ GetStockObject(

int fnObject // type of stock object

);

来获取Stock GDI对象。

MFC GDI对象

MFC用一些类封装了Windows GDI对象和相关函数,

CGdiObject封装了Windows GDI Object共有的特性。其派生类在继承的基础上,主要封装了各类GDI的创建函数以及和具体GDI对象相关的操作。

CGdiObject的构造函数仅仅让m_hObject为空。如果m_hObject不空,其析构函数将删除对应的Windows GDI对象。MFC GDI对象和Windows GDI对象的关系如图2-5所示。

使用MFC GDI类的使用

首先创建GDI对象,可分一步或两步创建。一步创建就是构造MFC对象和Windows GDI对象一步完成;两步创建则先构造MFC对象,接着创建Windows GDI对象。然后,把新创建的GDI对象选进设备描述表,取代原GDI对象并保存。最后,恢复原GDI对象。例如:

void CMyView::OnDraw(CDC *pDC)

{

CPen penBlack; //构造MFC CPen对象

if (penBlack.CreatePen(PS_SOLID, RGB(0, 0, 0)))

{

CPen *pOldPen = pDC->SelectObject(&penBlack)); //选进设备表,保存原笔

pDC->SelectObject(pOldPen); //恢复原笔

}else

{

}

}

和在SDK下有一点不同的是:这里没有DeleteObject。因为执行完OnDraw后,栈中的penBlack被销毁,它的析构函数被调用,导致DeleteObject的调用。

还有一点要说明:

pDC->SelectObject(&penBlack)返回了一个CPen *指针,也就是说,它根据原来PEN的句柄创建了一个MFC CPen对象。这个对象是否需要删除呢?不必要,因为它是一个临时对象,MFC框架会自动地删除它。当然,在本函数执行完毕把控制权返回给主消息循环之前,该对象是有效的。

关于临时对象及MFC处理它们的内部机制,将在后续章节详细讨论。

至此,Windows编程的核心概念:窗口、GDI界面(设备描述表、GDI对象等)已经陈述清楚,特别揭示了MFC对这些概念的封装机制,并简明讲述了与这些Windows Object对应的MFC类的使用方法。还有其他Windows概念,可以参见SDK开发文档。在MFC的实现上,基本上仅仅是对和这些概念相关的Win32函数的封装。如果明白了MFC的窗口、GDI界面的封装机制,其他就不难了。

14 多频互控

拼写

多频互控 Multiple Frequency Control

多频互控信号 Multi-Frequency Compelled Signal

解释

记发器信令由一个交换局的记发器发出,由另一个交换局的记发器接收。它的功能是控制电路的自动接续。为了保证有较快的传送速度和有一定的抗干扰能力,记发器信号采用“多频互控”方式。因此叫做“多频互控信令”。

“多频”是指多频编码信号,即由多个频率组成的编码信号。它的频率取在通话频带范围,即300——3400HZ。前向(高频段)信号按“六中取二”编码,最多有十五种组合;后向(低频段)信号按“四中取二”编码,最多有六种组合。

前向信号频率为:1380Hz、1500Hz、1620Hz、1740Hz、1860Hz、1980Hz

后向信号频率为:1140Hz、1020Hz、900Hz、780Hz。

”互控”是指信号发送过程中必须在收到对端来的证实信号以后才停发信号。也就是说,每一个信号的发送和接收都有一个互控的过程。每个互控过程分为四个节拍:

第一拍:去话记发器发送前向信号;

第二拍:来话记发器接收和识别前向信号后,发后向信号;

第三拍:去话记发器接收和识别后向信号后,停发前向信号;

第四拍:来话记发器识别前向信号停发以后停发后向信号。

当去话记发器识别后向信号停发以后,根据收到的后向信号要求,发送下一位前向信号,开始下一个互控过程。

15 边际要素成本

边际要素成本(MFC) 厂商在决定使用多少生产要素

边际要素成本

投入时,必须考虑成本和收益的比较,即追加1单位生产要素所获得的收益MRP能否补偿他为使用该单位要素所需支付的成本。这种成本即增加1单位投入要素所增加的成本支出可称为边际要素成本(MFC)。同使用要素的收益情况相类似,MFC的变化也取决于要素的市场结构。如果要素市场是完全竞争的市场,则MFC不变且等于要素的价格比如说劳动的价格(W),即MFC=W;如果该要素市场为不完全竞争的市场,则MFC将随要素需求量的增加而递增且总大于要素价格。 边际要素成本的变动趋势 如果要素价格不变(完全竞争),则边际要素成本正好等于要素价格,也不变;如果要素价格随着要素供给的增加而上升,则MFCLφw ,而且,边际要素成本随着要素投入的增加而递增。

随便看

 

百科全书收录4421916条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。

 

Copyright © 2004-2023 Cnenc.net All Rights Reserved
更新时间:2025/2/27 16:54:05