收藏 分销(赏)

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

上传人:精*** 文档编号:2465153 上传时间:2024-05-30 格式:DOC 页数:25 大小:806.54KB
下载 相关 举报
VC++讲义第单元-控件.doc_第1页
第1页 / 共25页
VC++讲义第单元-控件.doc_第2页
第2页 / 共25页
VC++讲义第单元-控件.doc_第3页
第3页 / 共25页
VC++讲义第单元-控件.doc_第4页
第4页 / 共25页
VC++讲义第单元-控件.doc_第5页
第5页 / 共25页
点击查看更多>>
资源描述

1、VC+讲义第单元 控件 作者: 日期:325 个人收集整理 勿做商业用途第15单元 控件本单元教学目标介绍各种常用控件的使用方法及基于对话框的应用程序.学习要求掌握常用控件的使用方法以及基于对话框的应用程序开发。授课内容对话框与控件是密不可分的。Windows提供了一批基本控件,如静态控件(Static Text)、编辑控件(Edit Box)、组框、等,可解决大部分用户输入界面设计的需求。另外,使用Visual C+编程还可使用一批通用控件,包括动画控件(Animate)、标题控件(Header)、复合文本编辑控件(Rich Edit)、标签控件(Tab)和树状列表控件(Tree List)

2、等,可大大提高应用程序界面的表现力。15。1 常用控件控件(Control)是Windows提供的独立小部件,在对话框与用户的交互过程担任主要角色,如显示文本、图片和图标、命令按钮、编辑文字或数据和滚动条等。控件的外观和功能是由其属性(Property)决定的.在编辑对话框模板资源时,对准某个控件按下鼠标右键可调出其属性设置对话框。不同的控件属性也不完全相同.属性对话框中有若干选项卡,如General选项卡、Styles选项卡和Extend Styles选项卡等,控件的属性就分布在各选项卡上(参看14.7:“对话框模板资源的编辑”)。控件看似简单,但实际上也是一个窗口,对应一个CWnd派生类的

3、对象。例如,编辑控件对应Cedit类的对象,静态文本控件对应CStatic类的对象.每个控件均有自己的标识符,在程序中可使用对话框类的成员函数GetDlgItem()取得指向具体控件对象的指针,然后对其进行编程.本节介绍几个常用的控件的使用方法。1静态文本(Static Text)控件:用于显示字符串,不接受输入信息。多用于显示其他控件的标题。使用静态文本控件一般均可使用缺省属性。2图片(Picture)控件,用于显示位图、图标、方框等,不接受输入信息。在图片控件的属性中,最重要的是其Type(在控件属性对话框的General选项卡中设置),可选类型有Frame(矩形框)、Rectangle(

4、矩形块)、Icon(图标)和Bitmap(位图)等。如果类型选择Frame和Rectangle,可通过Color选项选择其颜色;如果选择Icon和Bitmap,可通过Image选项选择相应的资源。3组框(Group Box)控件:显示一个文本字符串和一个方框,通常用于组合一组相关控件.以上三个控件均对应CStatic类型的对象。应该说明的是,如果无需对静态控件编程,则也不要求其标识符唯一,通常可选用对话框模板编辑器自动提供的缺省标识符(IDC_STATIC)。4编辑(Edit Box)控件。编辑控件是最常用的控件,可用于单行或多行文本编辑,其功能十分强大,相当于一个小型文本编辑器.编辑控件亦可

5、用来输入数值数据和日期、时间数据.主要属性有Align Text(文本对齐方式)、Multiline(多行编辑)、AutoHScroll(输入到窗口右边界后自动横滚)等(均在控件属性对话框的Styles选项卡中设置)。编辑控件对应CEdit类的对象。5按钮(Button)控件,用于响应用户的鼠标按键等操作,触发相应的事件。编程时按钮的处理与菜单选项类似,可为其添加命令响应函数(通常借助ClassWizard完成)。6检查框(Check Box)控件,用作选择标记,有选中、不选中和不确定等状态.7单选按钮(Radio Button)控件,用来作多项选择。单选按钮总是成组使用的.在一组单选按钮中,

6、第一个按钮最为重要,其ID可用于在对话框类中建立对应的数据成员(一定要设置其Group属性为选中).按钮、检查框和单选按钮三种控件均对应CButton类的对象.8列表框(List Box)控件,显示一个文字列表,用户可从表中选择一项或多项。主要属性为Selection(位于Styles选项卡中).可选择“Single(单选)、“Multiple”(多选)等。属性Sort表示是否将列表框的内容排序.列表框中的文字列表需在编程时确定,通常是在对话框类的InitDialog()成员函数中给出.列表框控件对应CListBox类对象。9组合框(Combo Box)是编辑控件和列表框的组合,可分为简易式(

7、Simple)、下拉式(Dropdown)和下拉列表式(Drop List)。组合框中列表的内容可在设置时用Data选项卡输入。注意输入各列表项时要使用Ctrl+Enter开始新的一项。组合框控件对应CCombo类的对象。为了在程序中对控件进行查询和控制,可以利用CWnd类提供的一组管理对话框控件的成员函数。这类函数很多,以下仅举几例:对话框控件管理函数说明GetCheckedRadioButton()返回指定单选按钮组中被选择的单选按钮的ID;GetDlgItem()返回一个指向一给定控件的指针;GetDlgItemText()获得在一个控件内显示的正文;SetDlgItemText()设置

8、一个控件显示的正文。例151 为某公司设计一个人事管理系统,其基本功能为输入、编辑、查看和保存公司的人事档案。职工人事档案包括姓名、性别、出生日期、婚姻状况、所在部门、职务和工资。说 明:为了管理和保存档案,选用SDI(单文档/视图界面)程序结构.首先用AppWizard生成一个名为EMP的SDI程序框架,在第4步中时按下“Advanced按钮调出Advanced Options对话框,在Document Template Strings选项卡中将File extension(文件名后缀)项设置为“dat”,在Window Styles选项卡中设置Maximized检查框为“选中状态.其他选项

9、均可用缺省设置。使用Developer Studio菜单的Insert/Resource选项调出Insert Source对话框,为项目添加一个对话框模板资源,并将其标识符改为IDD_EMPLOYEE。适当调整其大小,并在其上添加如下控件,使其看上去与图151类似。静态文本控件:姓名、出生日期、部门、职务、工资;图片控件:类型为Icon,使用项目自带的IDR_MAINFRAME图标,也可自己为项目添加一个图标资源并编辑成自己喜欢的样式;编辑控件三个,其ID分别改为IDC_NAME、IDC_BIRTHDATE和IDC_SALARY;单选按钮两个,其ID和Caption分别改为IDC_MALE,“

10、男”和IDC_FEMALE,“女”.为IDC_MALE设置属性Group;检查框一个,其ID和Caption分别改为IDC_MARRIED和“婚否”;列表框一个,其ID改为IDC_DEPT,保证Styles选项卡中的Selection项为Single,并将Sort检查框设置为非选中状态;组合框一个,其ID改为IDC_POSITION,并在Style选项卡中将Type设置为Drop List,并将Sort检查框设置为非选中状态。然后在Data选项卡中输入各种职务的名称:总经理副总经理部门经理项目经理业务经理注意使用Ctrl+Enter键回车换行。组框一个,将其Caption改为“个人资料”,调整

11、其大小和位置,使之可以框住姓名、性别、出生日期和婚姻状况等控件。图15-1 人事档案管理系统的输入、编辑对话框然后为各控件设置Tab Order。所谓Tab Order,是指在对话框中用Tab键选择控件的顺序。使用Tab键选择控件在鼠标发生故障,或大量键盘输入时特别有用。选择Developer Studio菜单的Layout/Tab Order选项,然后按最方便的顺序用鼠标逐一点击对话框模板上的各控件即可。设计好对话框模板后,利用ClassWizard自动建立对话框类。用Ctrl+W键可直接调出ClassWizard,也可以通过Developer Studio菜单的View/ClassWiza

12、rd选项调出.进入ClassWizard后,它会发现已建立的对话框模板资源,并弹出一个对话框询问是否要为该对话框模板建立类。按下“OK”按钮,会弹出New Class对话框,填写类名(CEmpDlg)后按“OK按钮即可为对话框建立一个类。利用ClassWizard为对话框类添加与各控件对应的数据成员。选择Member Variables选项卡,确保Class Name项为新的对话框类,然后在选项卡下方的窗口中选择各控件的ID并按下“Add Variable”按钮为其添加对应成员变量:Control IDsVariable TypeMember variable nameIDC_BIRTHDAT

13、ECOleDateTimem_tBirthdateIDC_DEPTCStringm_strDeptIDC_MALEintm_nSexIDC_MARRIEDBOOLm_bMarriedIDC_NAMECStringm_strNameIDC_POSITIONCStringm_strPositionIDC_SALARYfloatm_fSalary注意在添加成员变量对话框中的Category项均选择Value(值)并在Variable type组合框中选择相应的数据类型.注意编辑控件IDC_BIRTHDATE对应了一个COleDateTime类的数据成员。COleDateTime类是用于表示一个时间时

14、间,包括日期和时刻。ColeDateTime类的成员函数很多,主要有:COleDateTime ( int nYear, int nMonth, int nDay, int nHour, int nMin, int nSec );/ 根据给定值构造时间对象static COleDateTime GetCurrentTime ( );/ 用当前系统时间填写对象int GetYear ( ) const;/ 取对象中的年值int GetMonth ( ) const;/ 取对象中的月值int GetDay ( ) const;/ 取对象中的日值int GetHour ( ) const;/ 取对象

15、中的小时值int GetMinute ( ) const;/ 取对象中的分钟值int GetSecond ( ) const;/ 取对象中的秒值int GetDayOfWeek ( ) const;/ 取对象中的星球值int GetDayOfYear ( ) const;/ 取日相对上年末的天数int SetDateTime ( int nYear, int nMonth, int nDay, int nHour, int nMin, int nSec );/ 用给定值填写对象int SetDate ( int nYear, int nMonth, int nDay );/ 用给定日期填写对象

16、int SetTime ( int nHour, int nMin, int nSec );/ 用给定时间填写对象CString Format ( LPCTSTR lpszFormat ) const;/ 将对象值按指定格式写入字符串其中大部分的含义很明显,也可通过查询MSDN明确其用法。下面介绍最后一个函数,即将COleDateTime对象的值写入字符串函数的用法.该函数的参数lpszFormat是输出格式字符串,其中除了一般的字符信息外,还可加入形如“A”的格式说明。常用的格式说明有:格式说明说明%a星期几的缩写A星期几的全称%b月份名的缩写%B月份名的全称%c日期和时间的习惯表示%d日期

17、 (01 31)H24时制的小时 (00 23)I12时制的小时 (01 12)%j当前日期与上年年底之间的天数 (001 366)m数字表示的月份 (01 12)M分钟 (00 59)p12时制的时间(带A.M./P.M. 表示)%S秒 (00 59)%U一年中的第几个星期 (00 53)%w星期几 (0 6; 星期日为0)%W一年中的第几个星期, 以星期一作为星期的开始 (00 53)x日期X时间%y年份 (00 99)Y年份(全4位)%z, %Z时区名或其简称%百分号例如:ColeTateTimetm (2000,3,16,10,30,0);Cstring s;s = tm。Format

18、 (“Y。m。%d (%A), H: %M: %S);则字符串s中的内容为“2000.03.16 (Thursday), 10: 30: 00”。使用COleDateTime类要在头文件中添加文件包含命令:#include InsertString(-1, 办公室”);pLBInsertString(-1, 开发部);pLBInsertString(1, ”生产部);pLB-InsertString(-1, 销售部”);pLB-InsertString(-1, 人事部”);return CDialog::OnInitDialog();其中GetDlgItem()为对话框类的成员函数,用于取对话

19、框控件的指针。为项目添加有关自定义的职工类CEmployee。选择Developer Studio菜单的Insert/New Class选项,调出New Class对话框。在Class Type组合框中选择Generic(普通类),填写类名CEmployee,在对话框下方的Base class (es)框中输入基类CObject。在Workspace窗口的Class View中选择生成的CEmployee类的定义,添加代码:class CEmployee : public CObject DECLARE_SERIAL(CEmployee)public:CStringm_strName;/ 姓名

20、intm_nSex;/ 性别COleDateTimem_tBirthdate;/ 出生日期BOOLm_bMarried;/ 婚否CStringm_strDept;/ 工作部门CStringm_strPosition;/ 职务floatm_fSalary;/ 工资CEmployee()CEmployee operator = (CEmployee e);virtual CEmployee();virtual void Serialize(CArchive ar);CEmployee类的对象即为一个职工的档案,我们用序列化实现文档的存取,所以要为CEmployee类编写序列化代码.这包括DECLA

21、RE_SERIAL()宏和IMPLEMENT_SERIAL()宏(在CEmployee类的源代码文件中),一个没有参数的构造函数,重载的赋值运算符和Serialize()成员函数。在CEmployee类的源代码文件中添加以下代码:IMPLEMENT_SERIAL(CEmployee, CObject, 1)/ 重载的赋值运算符CEmployee& CEmployee:operator = (CEmployee& e)m_strName= e。m_strName;m_nSex= e。m_nSex;m_tBirthdate= e.m_tBirthdate;m_bMarried= e。m_bMarr

22、ied;m_strDept= e。m_strDept;m_strPosition= e.m_strPosition;m_fSalary= e.m_fSalary;return this;/ 序列化函数void CEmployee:Serialize(CArchive ar)CObject:Serialize(ar);if(ar。IsStoring()ar m_strName;ar m_nSex;ar m_tBirthdate;ar m_bMarried;ar m_strDept;ar m_strPosition;ar m_strName;ar m_nSex;ar m_tBirthdate;ar

23、 m_bMarried;ar m_strDept;ar m_strPosition;ar m_fSalary;然后修改文档类CMyDocument类定义,添加一个CEmployee类的数组:#include ”employee。h”#define MAX_EMPLOYEE1000class CMy1501Doc : public CDocumentDECLARE_DYNCREATE(CMy1501Doc)public:CEmployee m_empListMAX_EMPLOYEE;int m_nCount;public:virtual BOOL OnNewDocument();virtual

24、void Serialize(CArchive ar);virtual void DeleteContents();DECLARE_MESSAGE_MAP();为了节省篇幅,这段程序经过删节,与原来由AppWizard生成的程序有所不同。其中黑体部分为要添加的代码。注意重载成员函数DeleteContents()可以手工进行,也可以通过ClassWizard进行.Serialize()和DeleteContents()两个成员函数的代码如下:void CMy1501Doc::Serialize(CArchive& ar)if(ar。IsStoring())ar m_nCount;elsear

25、m_nCount;for(int i=0; im_nCount);pDCSetTextColor(RGB(255, 0, 0));pDCTextOut( 40, 40, s);s.Format(职工编号: d”, m_nCurrEmp+1);pDC-TextOut(340, 40, s);pDC-MoveTo( 40, 70);pDC-LineTo(600, 70);/ 如果档案非空, 显示当前记录if(pDoc-m_nCount 0)/ 显示栏目名称pDC-SetTextColor(RGB(0, 0, 0));pDCTextOut(140, 90, 姓 名:);pDCTextOut(140,

26、 130, ”性 别:);pDC-TextOut(140, 170, 出生日期: ”);pDCTextOut(140, 210, 婚姻状态:”);pDCTextOut(140, 250, 部 门:);pDC-TextOut(140, 290, ”职 务:);pDC-TextOut(140, 330, ”工 资:);/ 显示栏目内容pDCSetTextColor(RGB(0, 0, 255);pDC-TextOut(300, 90, pDocm_empListm_nCurrEmp.m_strName);if(pDocm_empListm_nCurrEmp。m_nSex=0)pDC-TextOut

27、(300, 130, 男”);elsepDC-TextOut(300, 130, ”女”);s = pDoc-m_empListm_nCurrEmp.m_tBirthdate。Format(Y。%m。d”);pDC-TextOut(300, 170, s);if(pDoc-m_empListm_nCurrEmp.m_bMarried)pDC-TextOut(300, 210, 已婚”);elsepDCTextOut(300, 210, ”未婚”);pDC-TextOut(300, 250, pDoc-m_empListm_nCurrEmp.m_strDept);pDC-TextOut(300,

28、 290, pDocm_empListm_nCurrEmp.m_strPosition);s。Format(%8。2f, pDocm_empListm_nCurrEmp。m_fSalary);pDC-TextOut(300, 330, s);在编辑资源时,我们框架窗口添加了5个菜单选项,并将对应的消息响应函数映射到了视图类中。这些消息响应函数的代码如下:void CMy1501View:OnAppend() CMy1501Doc* pDoc = GetDocument();ASSERT_VALID(pDoc);CEmpDlg dlg;if(dlg。DoModal() = IDOK)pDocm_

29、nCount+;m_nCurrEmp = pDoc-m_nCount-1;pDocm_empListm_nCurrEmp.m_strName = dlg。m_strName;pDocm_empListm_nCurrEmp.m_nSex = dlg.m_nSex;pDocm_empListm_nCurrEmp。m_tBirthdate = dlg。m_tBirthdate;pDoc-m_empListm_nCurrEmp.m_bMarried = dlg。m_bMarried;pDocm_empListm_nCurrEmp。m_strDept = dlg。m_strDept;pDocm_empL

30、istm_nCurrEmp.m_strPosition = dlg。m_strPosition;pDoc-m_empListm_nCurrEmp.m_fSalary = dlg。m_fSalary;pDoc-SetModifiedFlag();Invalidate();/ 删除当前记录void CMy1501View:OnDelete() CMy1501Doc* pDoc = GetDocument();ASSERT_VALID(pDoc);if(pDocm_nCount)for(int i=m_nCurrEmp; ipDocm_nCount-1; i+)pDoc-m_empListi = p

31、Docm_empListi+1;pDocm_nCount;if(m_nCurrEmp pDocm_nCount1)m_nCurrEmp = pDoc-m_nCount-1;pDoc-SetModifiedFlag();Invalidate();/ 编辑当前记录void CMy1501View:OnEdit() CMy1501Doc pDoc = GetDocument();ASSERT_VALID(pDoc);if(pDocm_nCount)CEmpDlg dlg;dlg。m_strName = pDocm_empListm_nCurrEmp。m_strName;dlg.m_nSex = pD

32、oc-m_empListm_nCurrEmp.m_nSex;dlg.m_tBirthdate = pDocm_empListm_nCurrEmp.m_tBirthdate;dlg.m_bMarried = pDoc-m_empListm_nCurrEmp.m_bMarried;dlg。m_strDept = pDocm_empListm_nCurrEmp。m_strDept;dlg.m_strPosition = pDoc-m_empListm_nCurrEmp。m_strPosition;dlg.m_fSalary = pDoc-m_empListm_nCurrEmp。m_fSalary;if(dlg。DoModal() = IDOK)pDoc-m_empListm_nCurrEmp。m_strName = dlg。m_strName;pDoc-m_empListm_nCurrEmp.m_nSex = dlg.m_nSex;pDocm_empListm_nCurrEmp.m_tBirthdate = dlg。m_tBirthdate;pDoc-m_empListm_nCurrEmp.m_bMarried = dlg.m_bMarried;pDoc-m_empListm_nCurrEmp.m_strDept = dlg.m_strDept;pDoc-m_empListm_n

展开阅读全文
相似文档                                   自信AI助手自信AI助手
猜你喜欢                                   自信AI导航自信AI导航
搜索标签

当前位置:首页 > 通信科技 > 开发语言

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服