MFC控件 学习经典
MFC标准控件的使用,几乎都有讲到,可以做个参考。控件Activex控件可用于对话框中,也可用于HTML文档中。这种控件过去被称为OLEActivex控件使用了与标准控件完全不同的接口和实现放识。这甲仅指出控件。本书将在专门的章节中来讲述关于 ActiveⅩ控件的知其它控件类除了 Windows标准控件和自己编写的或者来自于第三方软件开发商的 Activex控件以外,MFC还提供了另外三种控件,它们由下面的三个类进行封装:类 CBitmapButton用于创建以位图作为标签的按钮,位图按钮最多可以包括四个位图图片,分别代表按钮的四种不同状态。类 CChecklistBox用于创建选择列表框,这种列表框中的每一项前面有个复选框,以决定该项是否被选中。类 CDraglistBox用于创建一种特殊的列表框,这种列表框允许用户移动列表项。在本章我们仅讲述第一类控件,即 Windows标准控件。所涉及的内容包括各个控件的使用及相应的技巧。第一节使用对话框编辑器和 ClassWizard对于大多数 Windows标准控件,我们一般都使用对话框编辑器来将它们添加到对话框中匈Dial日包 DialogIDD ABOUTBOXE IDD DIALOGDEMO DIALOG+String Table口 VersionAE Classview ac ResourcE.6 File view? InfoViewT图6.1在 Resourceview中选择对话框IDD DIALOGDEMO DIALOCID: IDC STATICcpm甲入一些字得Tab sto图6.2控件的 Properties对话框t圖图6.3对话框编辑器的 Controls工具窗冂在下面的过程中,我们将一个编辑框控件添加到在第四章创建的基于对话框的MFC框架应用程序的主对话框窗口中。1.首先,在 Workspace窗凵的 ResourceⅤiew选项内双击 DialogDemoresources Dialog节点下的 IDD DIALOGDEMO DIAL0G图标。上面的操作如图所小2.用鼠标选中标有“要做的静态文本控件。右击鼠标,从上下文菜单中选择 Properties,打开如图6.2所示的对话框,在 Caption文本框中输入新的控件文本:“在下面的文本框中输入一些字符”,然后将静态文本控件拖动到对话框的左上角3.从 Controls工具窗口(如图6.3所示,如果在你的资源编辑器中看不到该T具窗口,可以在工具条上右击鼠标,从上下文菜单中选择 Controls)中选择编辑控件图标,在对话框中绘制一个编辑框控件,如图6.4所示。在该编辑框控件的 Properties窗口的 General选项卡中输入其ID为 LDC EDIT然后在 Styles选项卡下将 Multiline复选框划上勾,并消除 Auto hscroll复选框前的勾4.右击该编辑框控件,从上下文菜单中选择 ClassWizard命令,打开ClassWizard对话框,该对话框看起来如图6.5所示。下面的文本粒中菊入一坚子件:图6.4向对证框中添加一个编辑框控件R区Message Maps Member Variables Automation ActiveX Events Class Infos5 nae点 dd clacDialny DraimDlyAdd wariableE-I-. Dialog DemoDlgh, E:.Dialog DemoDlg cppControl idsMemberDelete WariableIDCANCELUpdate ColumnsBind All图6.5C1 assWizard对话框单击 Member variables选项卡,确信在 Project处选择了 Dialogdemo,在 Classlae处选择了( Dialogdemodlg。现在我们为刚才添加的编辑框控件 IDC EDIT添加一个数据映射入口。在 Control ids处选择 IDC edIt.,单击右边的 Add viable按钮。打开如图6.6所示的对话框。在 Member variable name处链接变量名 m streit(这里m表示该变量为类CDialogdemodlg的一个成员变量,str表明其类型为字符串,即类 CString)在 Category下拉列表中选择 Value(另一种选择是 Control,两种选择的不同将在后面的内容中讲述),在 Variable type下拉列表中选择 CString(还有其它很多数据类型可供选择,但出于这里编辑框中的内容为一字符串,因此 CString是最恰当的选择)。单击0K关闭对话框。区Member variable name.m stEdltCategallVariable tyDescriptionCSIth length validati图6.6为控件映射添加成员变量5.检查一下现在的 ClassWizard对话框(图6.7)与图6.5相比有何不同。在图6.7所示的对话框中下方的 Maximum characters文本框中输入50。由字面意思可以很容易猜出其含义,即将编辑框Ⅰ DC EDITˆ中可能的最长字符串的大小限制为50。单击OK关闭对话框Message Maps Member Variables Automation ActivcX [rents Class Info Is naneAdd classDialogDcmoialogdcmoDlgE-l.Dialog Dlg.h, E-.Dialog DemoDIg cppAdd amiableControl IDs:TypeMemberDelete variablelll slrFIlilID CANCELUpdate ColumnBind sillithtring with length YNMxillmu climrauIrrseCancel图6.7使用 Class wizard设置数据验证方案6.从 Workspace窗口的 Classview中双击类 CDialogDemodlg的0 nInitDialog成员函数,使用下面的代码来代替位于语句前的//TODO注释:m streit=”您好!请在这里输入一些字符串。UpdateData(FALSE)7.在 Classview中双击类 CDialogdemoapp的 InitInstance成员函数,使用下面的代码来找替位于选择支if (rEsponse == IDOK下的//TODO注释:AfxMessageDox(dlg. m strEdit然后将同一成员函数中的下面的代码行删掉(或注释掉)m pMainWnd =&dlg;8.编译并运行该应用程序。显示如图6.8所示的对话框。在下面的文丰中输入一字上确国一世了仔图6.8示例程序 DialogUe)的运行结果在图6.8所示的文本框中输入一些字符,单击“确定”。随即弹出如图6.9所示的消息框。该消息框复述了用户在图6.8所示的对话框中的输入。我们还发现,在图6.8所示的对话框中,当输入字符牛达到一·定的长度之后,我们不可以再输入更多的字符,这是我们在前面设置了 Maximum characters为50的结果。是3;到这个文程中输入了上面的这字确”图6.9以消息框的形式反馈输入的字符串下面我们来看在上面的步骤中都完成了什么。首先我们使用资源编辑器向对话框模板中添加这些标准控件,这一步的概念很清晣,因此并不难理解。然后,我们打开了所绘制的编辑框的 Properties(属性)对话框。先将其控件ⅠD设置为 IDC EDIT。这时如果打开头文件 Resource.h,就会发现宏 IDC EDIT被定义为常量1001。不过,事实上在很多情况下我们并不需要关心每一控件的ID的具体值,而只需要记住相应的助记符。对于这里的编辑框控件,我们以需要记住IDC EDIT即可,而不需要关心它等于1001。接着,我们在 Styles选项卡中设置了 Multiline属性,同时清除了 Auto hscroll属性,两者共同作用使用得编辑框IDC_EDIT支持多行文本,并且如文本行的长度超过编辑框宽度时自动回行下面的步骤是最重要的一步,我们动用了功能强大的工具 Classwizard。首先,我们将编辑框与一个 CString对象相关联,这使用了一种被称为 Dialog da laExchange(DDX)的机制。在这种机制中,我们先在处理函数 OnInitDialog或对话框类的构造函数中对对话框对象的成员变量进行初始化,在对话框显示之前,框架的DX机制将成员变量的值传递给对话框中的控件。这个过程在成员函教DoModal或 Create被调用的过程中发生。类 CDialog中对0 nInitDialog成员函数的默认实现调用了类CWnd成员函数 UpdateData来初始化对话框中的控件。这时我们就可以看到前面的第6步还可在具有下面的几种变通方案将代码行l stress="您好!请在这里输入一些字符串移到对基类的 Onlnildialog成员函数的调用之前,即位于下面的代码之前:CDialog: OnInitDialos O2.将代码l streit="您好!请在这里输入一些字符串移到类 CDialoglemodlg的构造函数中对于上面的两种方法,与前面第6步中使用的方法相比,我们没有必要调用类CWnd的成员函数 LpdateData。因为该函数在类 CDialog的成员函数Onlniidialog中将被调用。这三种方法之间并没有明确的优劣之分,在很多情况下,它们分别适用于不同的场合这里我们说一下成员函数 UpdateData。该函数带一个布尔类型的参数,如果该参数为 FALSE,数 UpdateData将成员变量的值传递给对话框的变量;而如果该参数为TRUE,函数 UpdateData将进行相反的过程。如果用户单击了对话框中ID为IDOK的按钮,或者以TRUE为参数调用函数UpdateData,D机制从控件中将值传递到成员变量,同时对话框数掂验证( dialog data validation,Dν)机制根据设定的验证规则验证所有数据项。在数据交换的过程中,成员函数 CpdateData先创建个 CDataExchange对象然后调用对话框对类 CDialog成员函数 DoDataExchange的重载版本。该DAtaeXchange对象将作为成员函数 DoDataExchange的一个参数,该参数定义了数据交换的上下文。在 DoDataExchange中,我们为每个数据成员指定了一个对DDX函数的调用每一个函数定义了基于由成员函数 UpdateData所提供的 DAtaeXchange参数所硝定的上下文而进行的双向数据交换。下面的代码摘自实现文件 Dialogdemo.cpp中对函数 DoDataExchange的定义:void CDialogDemoDlg:: DoDataExchange(CDataExchange* pDX)CDialog:: DoDataExchange(pDX//AFX DATA MAP (CDialogDemoDlg)DDX Text(pDX, IDC EDIt, m strEdit)DDV Max Chars(pDX, m strEdit, 50)//AFX DATA MAP在两行注释/{ AFX DATA MAP和//}} AFX DATA MAP之间的代码部分称作数据映射。函数 DDX Text使川 CString对象 m streit与ID为 IDC EDIT的编辑框控件相关联。函数 DDV MaxChars设置与编辑框控件 IDC EDIT相关联 CString对象I credit的最大长度为50。需要注意的是,如果用户在模式对话框中单击了“取消”( Cance1)按钮, DoModal函数将返回值 IDCANCEL,在这种情况下,在对话框和对话框对象之前的数据交换不会发生。由于这个原因,如果 DoModal函数返回了值IDOK,我们可以使用下面的代码来复述用户在对话框中所输入的值AixMessageBox(dlg. m strEit)注意在前面的第7步中有一个乍看起来有一些费解的过程,这就是我们为什么要将下面的代码从函数 OnInitDialog中删除m mAin Wnd=是dlg这基于下面的一个事实类 CWinthread的数据成员 m pMainWnd有一个有用的特征,如果由该成员所引用的口被关闭的话,MFC库捋自动的终止 CWinthread对象所代表的线程。这样,如果我们将指向dlg的指针赋予了成员变量 m pMainWnd,那么,无论我们单击了“确认”还是“取消”,应用程序的主线程都捋被自动终止,之后的代码当然不会得到执行。而在本示例中,我们希望在对话框被关闭后程序继续运行(即弹出一个消息重述用户所输入的内容),因此不应该将dg对象的指针赋予成员变量 m pMainWnd,从而需要捋前面的代码从函数Onlnildialog中删除。第二节所有窗口类的基类:CWnd在MFC中类CWnd是一个很重要的类,它封装了 Windows窗口句柄HWND在 Windows编程中,窗口句柄唯一的标识了一个窗口。然而,尽管类CWnd的对象和窗口句柄之间有着如此紧密的联系,但两者并不是等同的概念。CWnd对象通过类CWnd的构造函数和析构函数创建和消毁,而 Windows窗口是 Windows内部的一种数据结构,在类CWnd中,它通过 Create成员数创建,通过其析构函数消毁。除此之外,成员函数 Destroy window可以消毁 Windows窗口,而不需要消毁CWnd对象传统的 Windows应用程序中,消息是通过一个称作窗口过程( window procedure,通常具有 WndProc之类的函数名)的回调函数来处理的。这种方式在MFC中仍然使用,但为CWnd类及其消息映射所隐藏。在类Cwnd中, Windows通知消息会被自动的通过消息映射传递到类CWnd中合适的 OnMessagc成员函数(这里OnMessage是指这些函数具有的以0n为前缀的函数名,如 OnPaint和前面接触到的 OnInitDialog等)进行处理。通常我们都在类CWnd的派生类中重载需要处理的特定消息所对应的 OnMessage成员函数。除了直接从CWnd派生新的窗口类以外,我们更倾向于从MFC中定义的其它类,如 FRame Wnd、 CMIDFrame Wnd、CMDIChileWnd、 CView和 CDialog以及 CButton之类的控件类派生新的窗口类在MFC中定义的这些类本身也是从CWnd派生的。
下载地址
用户评论