1 / 23
文档名称:

VC++讲义第15单元 控件.doc

格式:doc   大小:91KB   页数:23页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

VC++讲义第15单元 控件.doc

上传人:mama 2024/6/27 文件大小:91 KB

下载得到文件列表

VC++讲义第15单元 控件.doc

相关文档

文档介绍

文档介绍:该【VC++讲义第15单元 控件 】是由【mama】上传分享,文档一共【23】页,该文档可以免费在线阅读,需要了解更多关于【VC++讲义第15单元 控件 】的内容,可以使用淘豆网的站内搜索功能,选择自己适合的文档,以下文字是截取该文章内的部分文字,如需要获得完整电子版,请下载此文档到您的设备,方便您编辑和打印。第15单元控件本单元教学目标 介绍各种常用控件的运用方法及基于对话框的应用程序。学****要求 驾驭常用控件的运用方法以及基于对话框的应用程序开发。授课内容 对话框与控件是密不行分的。Windows供应了一批基本控件,如静态控件(StaticText)、编辑控件(EditBox)、组框、等,可解决大部分用户输入界面设计的需求。另外,运用VisualC++编程还可运用一批通用控件,包括动画控件(Animate)、标题控件(Header)、复合文本编辑控件(RichEdit)、标签控件(Tab)和树状列表控件(TreeList)等,可大大提高应用程序界面的表现力。(Control)是Windows供应的独立小部件,在对话框与用户的交互过程担当主要角色,如显示文本、图片和图标、吩咐按钮、编辑文字或数据和滚动条等。控件的外观和功能是由其属性(Property)确定的。在编辑对话框模板资源时,对准某个控件按下鼠标右键可调出其属性设置对话框。不同的控件属性也不完全相同。属性对话框中有若干选项卡,如General选项卡、Styles选项卡和ExtendStyles选项卡等,控件的属性就分布在各选项卡上(:“对话框模板资源的编辑”)。控件看似简洁,但事实上也是一个窗口,对应一个CWnd派生类的对象。例如,编辑控件对应Cedit类的对象,静态文本控件对应CStatic类的对象。每个控件均有自己的标识符,在程序中可运用对话框类的成员函数GetDlgItem()取得指向详细控件对象的指针,然后对其进行编程。本节介绍几个常用的控件的运用方法。(StaticText)控件:用于显示字符串,不接受输入信息。多用于显示其他控件的标题。运用静态文本控件一般均可运用缺省属性。(Picture)控件,用于显示位图、图标、方框等,不接受输入信息。在图片控件的属性中,最重要的是其Type(在控件属性对话框的General选项卡中设置),可选类型有Frame(矩形框)、Rectangle(矩形块)、Icon(图标)和Bitmap(位图)等。假如类型选择Frame和Rectangle,可通过Color选项选择其颜色;假如选择Icon和Bitmap,可通过Image选项选择相应的资源。(GroupBox)控件:显示一个文本字符串和一个方框,通常用于组合一组相关控件。以上三个控件均对应CStatic类型的对象。应当说明的是,假如无需对静态控件编程,则也不要求其标识符唯一,通常可选用对话框模板编辑器自动供应的缺省标识符(IDC_STATIC)。(EditBox)控件。编辑控件是最常用的控件,可用于单行或多行文本编辑,其功能特别强大,相当于一个小型文本编辑器。编辑控件亦可用来输入数值数据和日期、时间数据。主要属性有AlignText(文本对齐方式)、Multiline(多行编辑)、AutoHScroll(输入到窗口右边界后自动横滚)等(均在控件属性对话框的Styles选项卡中设置)。编辑控件对应CEdit类的对象。(Button)控件,用于响应用户的鼠标按键等操作,触发相应的事务。编程时按钮的处理与菜单选项类似,可为其添加吩咐响应函数(通常借助ClassWizard完成)。(CheckBox)控件,用作选择标记,有选中、不选中和不确定等状态。(RadioButton)控件,用来作多项选择。单选按钮总是成组运用的。在一组单选按钮中,第一个按钮最为重要,其ID可用于在对话框类中建立对应的数据成员(肯定要设置其Group属性为选中)。按钮、检查框和单选按钮三种控件均对应CButton类的对象。(ListBox)控件,显示一个文字列表,用户可从表中选择一项或多项。主要属性为Selection(位于Styles选项卡中)。可选择“Single”(单选)、“Multiple”(多选)等。属性Sort表示是否将列表框的内容排序。列表框中的文字列表需在编程时确定,通常是在对话框类的InitDialog()成员函数中给出。列表框控件对应CListBox类对象。)是编辑控件和列表框的组合,可分为简易式(Simple)、下拉式(Dropdown)和下拉列表式(DropList)。组合框中列表的内容可在设置时用Data选项卡输入。留意输入各列表项时要运用Ctrl+Enter起先新的一项。bo类的对象。为了在程序中对控件进行查询和限制,可以利用CWnd类供应的一组管理对话框控件的成员函数。这类函数许多,以下仅举几例:对话框控件管理函数说明GetCheckedRadioButton() 返回指定单选按钮组中被选择的单选按钮的ID;GetDlgItem() 返回一个指向一给定控件的指针;GetDlgItemText() 获得在一个控件内显示的正文;SetDlgItemText() 设置一个控件显示的正文。[例15-1]为某公司设计一个人事管理系统,其基本功能为输入、编辑、查看和保存公司的人事档案。职工人事档案包括姓名、性别、诞生日期、婚姻状况、所在部门、职务和工资。说明:为了管理和保存档案,选用SDI(单文档/视图界面)程序结构。首先用AppWizard生成一个名为EMP的SDI程序框架,在第4步中时按下“Advanced…”按钮调出AdvancedOptions对话框,在DocumentTemplateStrings选项卡中将Fileextension(文件名后缀)项设置为“dat”,在WindowStyles选项卡中设置Maximized检查框为“选中”状态。其他选项均可用缺省设置。运用DeveloperStudio菜单的Insert/Resource…选项调出InsertSource对话框,为项目添加一个对话框模板资源,并将其标识符改为IDD_EMPLOYEE。适当调整其大小,并在其上添加如下控件,使其看上去与图15-1类似。静态文本控件:姓名、诞生日期、部门、职务、工资;图片控件:类型为Icon,运用项目自带的IDR_MAINFRAME图标,也可自己为项目添加一个图标资源并编辑成自己喜爱的样式;编辑控件三个,其ID分别改为IDC_NAME、IDC_BIRTHDATE和IDC_SALARY;单选按钮两个,其ID和Caption分别改为IDC_MALE,“男”和IDC_FEMALE,“女”。为IDC_MALE设置属性Group;检查框一个,其ID和Caption分别改为IDC_MARRIED和“婚否”;列表框一个,其ID改为IDC_DEPT,保证Styles选项卡中的Selection项为Single,并将Sort检查框设置为非选中状态;组合框一个,其ID改为IDC_POSITION,并在Style选项卡中将Type设置为DropList,并将Sort检查框设置为非选中状态。然后在Data选项卡中输入各种职务的名称: 总经理 副总经理 部门经理 项目经理 业务经理留意运用Ctrl+Enter键回车换行。 组框一个,将其Caption改为“个人资料”,调整其大小和位置,使之可以框住姓名、性别、诞生日期和婚姻状况等控件。图15-1人事档案管理系统的输入、编辑对话框 然后为各控件设置TabOrder。所谓TabOrder,是指在对话框中用Tab键选择控件的依次。运用Tab键选择控件在鼠标发生故障,或大量键盘输入时特殊有用。选择DeveloperStudio菜单的Layout/TabOrder选项,然后按最便利的依次用鼠标逐一点击对话框模板上的各控件即可。设计好对话框模板后,利用ClassWizard自动建立对话框类。用Ctrl+W键可干脆调出ClassWizard,也可以通过DeveloperStudio菜单的View/ClassWizard…选项调出。进入ClassWizard后,它会发觉已建立的对话框模板资源,并弹出一个对话框询问是否要为该对话框模板建立类。按下“OK”按钮,会弹出NewClass对话框,填写类名(CEmpDlg)后按“OK”按钮即可为对话框建立一个类。利用ClassWizard为对话框类添加与各控件对应的数据成员。选择MemberVariables选项卡,确保ClassName项为新的对话框类,然后在选项卡下方的窗口中选择各控件的ID并按下“AddVariable…”按钮为其添加对应成员变量: ControlIDs VariableType Membervariablename IDC_BIRTHDATE COleDateTime m_tBirthdate IDC_DEPT CString m_strDept IDC_MALE int m_nSex IDC_MARRIED BOOL m_bMarried IDC_NAME CString m_strName IDC_POSITION CString m_strPosition IDC_SALARY float m_fSalary留意在添加成员变量对话框中的Category项均选择Value(值)并在Variabletype组合框中选择相应的数据类型。留意编辑控件IDC_BIRTHDATE对应了一个COleDateTime类的数据成员。COleDateTime类是用于表示一个时间时间,包括日期和时刻。ColeDateTime类的成员函数许多,主要有:COleDateTime(intnYear,intnMonth,intnDay,intnHour,intnMin,intnSec); //依据给定值构造时间对象OleDateTimeGetCurrentTime(); //用当前系统时间填写对象intGetYear()const; //取对象中的年值intGetMonth()const; //取对象中的月值intGetDay()const; //取对象中的日值intGetHour()const; //取对象中的小时值intGetMinute()const; //取对象中的分钟值intGetSecond()const; //取对象中的秒值intGetDayOfWeek()const; //取对象中的星球值intGetDayOfYear()const; //取日相对上年末的天数intSetDateTime(intnYear,intnMonth,intnDay,intnHour,intnMin,intnSec); //用给定值填写对象intSetDate(intnYear,intnMonth,intnDay); //用给定日期填写对象intSetTime(intnHour,intnMin,intnSec); //用给定时间填写对象CStringFormat(LPCTSTRlpszFormat)const; //将对象值按指定格式写入字符串其中大部分的含义很明显,也可通过查询MSDN明确其用法。下面介绍最终一个函数,即将COleDateTime对象的值写入字符串函数的用法。该函数的参数lpszFormat是输出格式字符串,其中除了一般的字符信息外,还可加入形如“%A”的格式说明。常用的格式说明有:格式说明说明%a 星期几的缩写%A 星期几的全称%b 月份名的缩写%B 月份名的全称%c 日期和时间的****惯表示%d 日期(01–31)%H 24时制的小时(00–23)%I 12时制的小时(01–12)%j 当前日期与上年年底之间的天数(001–366)%m 数字表示的月份(01–12)%M 分钟(00–59)%p 12时制的时间(./)%S 秒(00–59)%U 一年中的第几个星期(00–53)%w 星期几(0–6;星期日为0)%W 一年中的第几个星期,以星期一作为星期的起先(00–53)%x 日期%X 时间%y 年份(00–99)%Y 年份(全4位)%z,%Z 时区名或其简称%% 百分号例如: ColeTateTime tm(2000,3,16,10,30,0); Cstrings;s=(“%Y.%m.%d(%A),%H:%M:%S”);则字符串s中的内容为“(Thursday),10:30:00”。 运用COleDateTime类要在头文件中添加文件包含吩咐:#include<>假如添加的是对应编辑控件的成员变量,可在选项卡左下方输入数据检验信息。对于字符串变量,可输入最大字符个数;对于日期和数值变量,可分别输入上限值和下限值。 以上工作完成后,可检查一下由ClassWizard生成的CEmpDlg类的代码。CEmpDlg类的定义为:classCEmpDlg:Dialog{public: CEmpDlg(CWnd*pParent=NULL);//standardconstructor//DialogData//{{AFX_DATA(CEmpDlg) enum{IDD=IDD_EMPLOYEE}; ColeDateTime m_tBirthdate; CString m_strDept; BOOL m_bMarried; float m_fSalary; Cstring m_strName; int m_nSex; CString m_strPosition; //}}AFX_DATA//Overrides //ClassWizardgeneratedvirtualfunctionoverrides //{{AFX_VIRTUAL(CEmpDlg) protected: virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDVsupport //}}AFX_VIRTUAL//Implementationprotected: //Generatedmessagemapfunctions //{{AFX_MSG(CEmpDlg) virtualBOOLOnInitDialog(); //}}AFX_MSG DECLARE_MESSAGE_MAP()};对话框类的构造函数和DoDataExchange()成员函数也是由ClassWizard自动维护的:CEmpDlg::CEmpDlg(CWnd*pParent/*=NULL*/) :CDialog(CEmpDlg::IDD,pParent){ //{{AFX_DATA_INIT(CEmpDlg) m_tBirthdate=COleDateTime::GetCurrentTime(); m_strDept=_T(""); m_bMarried=FALSE; m_fSalary=; m_strName=_T(""); m_nSex=-1; m_strPosition=_T(""); //}}AFX_DATA_INIT}voidCEmpDlg::DoDataExchange(CDataExchange*pDX){ CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CEmpDlg) DDX_Text(pDX,IDC_BIRTHDATE,m_tBirthdate); DDX_LBString(pDX,IDC_DEPT,m_strDept); DDX_Check(pDX,IDC_MARRIED,m_bMarried); DDX_Text(pDX,IDC_SALARY,m_fSalary); DDV_MinMaxFloat(pDX,m_fSalary,,); DDX_Text(pDX,IDC_NAME,m_strName); DDV_MaxChars(pDX,m_strName,20); DDX_Radio(pDX,IDC_MALE,m_nSex); DDX_CBString(pDX,IDC_POSITION,m_strPosition); DDV_MaxChars(pDX,m_strPosition,20); //}}AFX_DATA_MAP}其中构造函数中有CEmpDlg类各数据成员的初始化代码,DoDataExchange()函数中为这些数据成员与控件之间的数据交换和数据检验代码。 接着,还应编辑项目的菜单资源,在框架窗口的主菜单(IDR_MAINFRAME)中添加两个菜单选项,并为下拉菜单“编辑”添加三个菜单选项: ID Caption Prompt ID_NEXT 下一记录下一职工档案\n下一记录ID_PREV 上一记录上一职工档案\n上一记录”ID_APPEND 输入(&I)\tCtrl+I 输入新职工档案\n输入 ID_EDIT 编辑(&E)\tCtrl+E 编辑职工档案\n编辑 ID_DELETE 删除(&D)\tCtrl+D 删除职工档案\n删除然后利用ClassWizard为视图类添加与这些菜单选项对应的成员函数。进入在ClassWizard的MessageMaps选项卡,选择ClassName项为CMyView,在ObjectIDs列表框中分别选择新添加的菜单选项的ID,MAND,按下AddFunction按钮添加成员函数。ClassWizard会为这些菜单选项添加相应的消息响应函数(目前尚没有详细内容,须要程序员自行加入有关的处理代码),并将其声明加入CMyView类定义,在消息映射宏中加入相应的消息映射。 完成以上工作后,即可修改程序框架,添加必要的代码。 程序:由于列表框尚未初始化,所以为CEmpDlg类重载OnInitDialog()成员函数(可运用ClassWizard完成),并添加相应代码:BOOLCEmpDlg::OnInitDialog(){ CListBox*pLB=(CListBox*)GetDlgItem(IDC_DEPT); pLB->InsertString(-1,"办公室"); pLB->InsertString(-1,"开发部"); pLB->InsertString(-1,"生产部"); pLB->InsertString(-1,"销售部"); pLB->InsertString(-1,"人事部"); returnCDialog::OnInitDialog();}其中GetDlgItem()为对话框类的成员函数,用于取对话框控件的指针。 为项目添加有关自定义的职工类CEmployee。选择DeveloperStudio菜单的Insert/NewClass…选项,调出NewClass对话框。在ClassType组合框中选择Generic(一般类),填写类名CEmployee,在对话框下方的Baseclass(es)框中输入基类CObject。 在Workspace窗口的ClassView中选择生成的CEmployee类的定义,添加代码:classCEmployee:Object{ DECLARE_SERIAL(CEmployee)public: CString m_strName; //姓名 int m_nSex; //性别 COleDateTime m_tBirthdate; //诞生日期 BOOL m_bMarried; //婚否 CString m_strDept; //工作部门 CString m_strPosition; //职务 float m_fSalary; //工资 CEmployee(){} CEmployee&operator=(CEmployee&e); virtual~CEmployee(); virtualvoidSerialize(CArchive&ar);};CEmployee类的对象即为一个职工的档案,我们用序列化实现文档的存取,所以要为CEmployee类编写序列化代码。这包括DECLARE_SERIAL()宏和IMPLEMENT_SERIAL()宏(在CEmployee类的源代码文件中),一个没有参数的构造函数,重载的赋值运算符和Serialize()成员函数。在CEmployee类的源代码文件中添加以下代码:IMPLEMENT_SERIAL(CEmployee,CObject,1)//重载的赋值运算符CEmployee&CEmployee::operator=(CEmployee&e){ m_strName =; m_nSex =; m_tBirthdate =; m_bMarried =; m_strDept =; m_strPosition =; m_fSalary =; return*this;}//序列化函数voidCEmployee::Serialize(CArchive&ar){ CObject::Serialize(ar); if(()) { ar<<m_strName; ar<<m_nSex; ar<<m_tBirthdate; ar<<m_bMarried; ar<<m_strDept; ar<<m_strPosition; ar<<m_fSalary; } else { ar>>m_strName; ar>>m_nSex; ar>>m_tBirthdate; ar>>m_bMarried; ar>>m_strDept; ar>>m_strPosition; ar>>m_fSalary; }} 然后修改文档类CMyDocument类定义,添加一个CEmployee类的数组: #include""#defineMAX_EMPLOYEE 1000classCMy1501Doc:Document{ DECLARE_DYNCREATE(CMy1501Doc)public: CEmployeem_empList[MAX_EMPLOYEE]; intm_nCount; public: virtualBOOLOnNewDocument(); virtualvoidSerialize(CArchive&ar); virtualvoidDeleteContents(); DECLARE_MESSAGE_MAP()};为了节约篇幅,这段程序经过删节,与原来由AppWizard生成的程序有所不同。其中黑体部分为要添加的代码。留意重载成员函数DeleteContents()可以手工进行,也可以通过ClassWizard进行。Serialize()和DeleteContents()两个成员函数的代码如下:voidCMy1501Doc::Serialize(CArchive&ar){ if(()) ar<<m_nCount; else ar>>m_nCount; for(inti=0;i<m_nCount;i++) m_empList[i].Serialize(ar);}voidCMy1501Doc::DeleteContents(){ m_nCount=0; //在打开文件和建立新文件时将数组大小置0 CDocument::DeleteContents();} 即在文档类的Serialize()函数中,数据的序列化工作是通过调用Cemployee类的Serialize()函数实现的。 事实上,要为本程序添加的大部分代码均在视图类中。首先在视图类CmyView类的定义中添加一个用于记录当前操作的是哪个记录的数据成员: int m_nCurrEmp;并为视图类重载OnInitialUpdate()成员函数,在其中初始化该变量: voidCMy1501View::OnInitialUpdate()