第5章常用控件.ppt_第1页
第5章常用控件.ppt_第2页
第5章常用控件.ppt_第3页
第5章常用控件.ppt_第4页
第5章常用控件.ppt_第5页
已阅读5页,还剩88页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第5章常用控件 5 1控件的创建和基本使用方法5 2静态控件和按钮5 3编辑框和旋转按钮控件5 4列表框5 5组合框5 6进展条 滚动条和滑动条5 7日期时间控件 图像列表和标签控件 5 1控件的创建和基本使用方法 5 1 1控件的创建方法控件的创建方式有以下两种 在对话框模板中用编辑器指定控件 将对话框看作控件的父窗口 编程方式 即调用相应控件类的成员函数Create来创建 并在Create函数指定控件的父窗口指针 表5 1常用控件类 5 1控件的创建和基本使用方法 1 选择 文件 新建 选择MFCAppWizard exe 的项目类型 在工程框中输入项目名Ex DlgCtrls 如图 2 单击 确定 在出现的 Step1 对话框中选择 基本对话 应用程序类型 单击 完成 创建一个默认的基于对话框的应用程序项目 5 1控件的创建和基本使用方法 3 切换到ClassView页面 右击CEx DlgCtrlsDlg类名 如图 4 选择AddMemberVariable 在对话框中定义一个CButton类对象m btnWnd 如图 单击 OK 5 1控件的创建和基本使用方法 5 在ClassView页面中 双击OnInitDialog函数名 在函数中添加代码 BOOLCEx DlgCtrlsDlg OnInitDialog CDialog OnInitDialog m btnWnd Create 你好 WS CHILD WS VISIBLE BS PUSHBUTTON CRect 20 20 120 60 this 201 创建CFont font this GetFont 获取对话框的字体m btnWnd SetFont font 设置控件字体returnTRUE 对话框中的一些初始化代码都添加在Dialog函数中 Create用来创建一个按钮控件 第一个参数指定按钮的标题 第二个参数指定控件的风格 第三个参数指定它在父窗口中的位置和大小 第四个参数指定父窗口指针 最后一个参数是指定该控件的标识值 WS CHILD WS VISIBLE和BS PUSHBUTTON是系统内部定义的标识符 可以直接引用 按钮是作为对话框的一个子窗口来创建的 因此其风格中必需要有WS CHILD 子窗口风格 WS VISIBLE是使控件可见 BS PUSHBUTTON表示创建的是按键按钮 5 1控件的创建和基本使用方法 6 编译并运行 如图 5 1控件的创建和基本使用方法 5 1 2控件的消息及消息映射映射控件消息下面的步骤是在Ex DlgCtrls基础上进行的 1 打开Ex DlgCtrls应用程序项目 2 将项目工作区窗口切换到ResourseView页面 双击Dialog资源下的标识IDD EX DLGCTRLS DIALOG 打开该对话框资源模板 3 删除 TODO 在这里设置对话控制 控件 添加一个按钮控件 如图 4 按快捷键Ctrl W 查看 Classname 列表中是否选择了CEx DlgCtrlsDlg 在IDs列表中选择IDC BUTTON1 然后在Messages框中选择BN CLICKED消息 5 1控件的创建和基本使用方法 5 单击 AddFunction 按钮或双击BN CLICKED消息 出现 AddMemberFunction 对话框 在这里可以输入成员函数的名称 系统默认的函数名为OnButton1 如图 5 1控件的创建和基本使用方法 需要说明的是 l不同资源对象 控件 菜单命令等 所产生的消息是不相同的 例如 按钮控件IDC BUTTON1的消息有两个 BN CLICKED和BN DOUBLECLICKED 分别表示当用户单击或双击该按钮时产生的消息 l一般不需要对对话框中的 OK 与 Cancel 按钮进行消息映射 因为系统已自动设置了这两个按钮的动作 当用户单击这两个按钮都将自动关闭对话框 且 OK 按钮动作还使得对话框数据有效 6 单击 OK 在MFCClassWizard的 Memberfunctions 列表中将列出新增加的成员函数 选择此函数 单击 EditCode 或直接在函数名双击鼠标 开发环境的文档窗口中将自动打开该函数所在的源代码文件 并定位到该函数的实现代码处 在此成员函数中添加下列代码 voidCEx DlgCtrlsDlg OnButton1 MessageBox 你按下了 Button1 按钮 7 编译运行 单击 Button1 时 就会执行OnButton1函数 5 1控件的创建和基本使用方法 控件消息映射机制MFCClassWizard对上述按钮的消息映射作了哪些代码的添加 1 项目工作区FileView 展开HeadFiles所有项 双击CEx DlgCtrlsDlg类的头文件Ex DlgCtrlsDlg h 在Ex DlgCtrlsDlg h文档内容可以找到这样的代码 protected Generatedmessagemapfunctions AFX MSG CEx DlgCtrlsDlg afx msgvoidOnButton1 AFX MSGDECLARE MESSAGE MAP DECLARE MESSAGE MAP 声明对消息映射的支持 加粗语句对消息函数OnButton1的声明 afx msg是用来声明此函数是一个消息函数 AFX MSG CEx DlgCtrlsDlg 和 AFX MSG 用来标明它们之间的消息函数声明内容是由MFCClassWizard自动管理的 5 1控件的创建和基本使用方法 2 在项目工作区FileView页面中 展开SourceFiles所有项 双击CEx DlgCtrlsDlg类的源文件Ex DlgCtrlsDlg cpp 在Ex DlgCtrlsDlg h文档内容可以找到这样的代码 BEGIN MESSAGE MAP CEx DlgCtrlsDlg CDialog AFX MSG MAP CEx DlgCtrlsDlg ON BN CLICKED IDC BUTTON1 OnButton1 AFX MSG MAPEND MESSAGE MAP BEGIN MESSAGE MAP和END MESSAGE MAP之间是用来定义该类所支持的消息映射 BEGIN MESSAGE MAP带有两个参数 第一个参数指定需要支持消息映射的用户派生类 第二个参数指定该类的基类 ON BN CLICKED将按钮控件和消息函数一一关联 需要说明的是 MFC为应用程序中所用到的消息都有类似这样的消息宏定义 AFX MSG MAP CEx DlgCtrlsDlg 和 AFX MSG MAP 用来标明它们之间的消息映射内容是由MFCClassWizard自动管理 一个类中的所有消息的映射宏都将添加在这里 3 在Ex DlgCtrlsDlg cpp文件的后部分还有消息函数的实现代码 5 1控件的创建和基本使用方法 映射控件通用消息上述的过程是映射一个控件的某一个消息 也可以通过WM COMMAND消息的映射来处理一个或多个控件的通用消息 如下步骤 打开MFCClassWizard 在 Classname 列表中是否选择了CEx DlgCtrlsDlg 在IDs列表中选择CEx DlgCtrlsDlg 在Messages框中找到并双击OnCommand 如图 OnCommand函数是一个用来处理WM COMMAND消息的虚函数 添加的OnCommand函数是一个在类中实际调用的函数 可称为 实例函数 这样的映射操作 可以称之为 对虚函数OnCommand的重载 5 1控件的创建和基本使用方法 2 在OnCommand函数中添加下列代码 BOOLCEx DlgCtrlsDlg OnCommand WPARAMwParam LPARAMlParam WORDnCode HIWORD wParam 控件的通知消息WORDnID LOWORD wParam 控件的ID号if nID 201 它将控件的消息交由对话框其他函数处理 5 1控件的创建和基本使用方法 5 1 3控件的数据交换 DDX 和数据校验 DDV DDX将数据成员变量同对话类模板内的控件相联接 DDV用于数据的校验 例如它能自动校验数据成员变量数值的范围 并发出相应的警告 使用MFCClassWizard可以很容易地为一个控件定义关联变量并可设置其数据范围 例如 下面的步骤是为CEx DlgCtrlsDlg类的按钮控件IDC BUTTON1添加并使用其关联变量m RelBtn 1 打开MFCClassWizard 并切换到MemberVariables页面 如图 5 1控件的创建和基本使用方法 2 Classname为CEx DlgCtrlsDlg 选定所要关联的控件IDIDC BUTTON1 双击鼠标左键或单击 AddVariable 按钮 在对话框设置变量的名称 类别和数据类型 如图 说明 Category框内可选择Value或Control两种类型 Control所对应的变量类型就是MFC为该控件封装的控件类 Value所对应的是数值类型 不同的控件所提供的关联的数值类型各不相同 5 1控件的创建和基本使用方法 3 在Membervariablename框中填好与控件相关联的成员变量m RelBtn 单击 OK 又回到MFCClassWizard对话框的MemberVariables页面中 在ControlIDs列表中出现刚才添加的控件关联变量 说明 DDV DDX技术中 允许用户为同一个控件关联多个变量 但必须保证这些变量名是互不相同的 且这些变量在同一个类型不能有多个变量 添加的关联变量是一个数值类型 在MFCClassWizard对话框的MemberVariables页面下方还要求用户输入变量的范围 这就是控件的数据校验设置 例如 在CEx DlgCtrlsDlg对话框中任意添加一个编辑框控件 并取默认的ID号IDC EDIT1 为其关联一个CString类型的成员变量m strEdit后 如图 它要求在下方的MaximumCharacters框中设定该变量允许的最大字符个数 5 1控件的创建和基本使用方法 4 单击 确定 MFCClassWizard对上述操作作了三方面的修改 l在Ex DlgCtrlsDlg h文件中 添加控件关联变量的声明 代码如下面的加粗部分 DialogData AFX DATA CEx DlgCtrlsDlg enum IDD IDD EX DLGCTRLS DIALOG 枚举类型CButtonm RelBtn CStringm strEdit AFX DATAl在Ex DlgCtrlsDlg cpp中CEx DlgCtrlsDlg构造函数实现代码添加初始代码 CEx DlgCtrlsDlg CEx DlgCtrlsDlg CWnd pParent NULL CDialog CEx DlgCtrlsDlg IDD pParent AFX DATA INIT CEx DlgCtrlsDlg m strEdit T AFX DATA INIT 5 1控件的创建和基本使用方法 在Ex DlgCtrlsDlg cpp中的DoDataExchange内添加控件的DDX DDV代码 voidCEx DlgCtrlsDlg DoDataExchange CDataExchange pDX CDialog DoDataExchange pDX 调用此函数作为DDX的开始 AFX DATA MAP CEx DlgCtrlsDlg DDX Control pDX IDC BUTTON1 m RelBtn DDX Text pDX IDC EDIT1 m strEdit IDC EDIT1与m strEdit进行数据交换DDV MaxChars pDX m strEdit 20 校验m strEdit的最大字符不超过20 AFX DATA MAP 5 1控件的创建和基本使用方法 5 为控件定义一个关联的数据变量 就可使用CWnd UpdateData实现控件数据的输入和读取 例如 将CEx DlgCtrlsDlg OnButton1修改成下列代码 voidCEx DlgCtrlsDlg OnButton1 UpdateData 默认参数值是TRUEm RelBtn SetWindowText m strEdit UpdateData FALSE 数据由控件相关联的成员变量向控件传输 UpdateData TRUE 或不带参数的UpdateData 数据从控件向相关联的成员变量复制 添加的控件m RelBtn是一个CButton类对象 CButton类继承了其基类CWnd的特性 可以调用基类的成员函数SetWindowText来改变按钮控件的标题 6 运行程序 在编辑框中输入 Hello 单击 Button1 OnButton1函数中的UpdateData将编辑框内容保存到m strEdit变量中 从而执行下一条语句后按钮的名称就变成了编辑框控件中的内容 Hello 如图 5 2静态控件和按钮 5 2 1静态控件一个静态控件是用来显示一个字符串 框 矩形 图标 位图或增强的图元文件 它可以被用来作为标签 框或用来分隔其它的控件 一个静态控件一般不接收用户输入 也不产生通知消息 5 2静态控件和按钮 用户可以选择图片 类型 图像 资源两个组合框中的有关选项内容 并可将应用程序资源中的图标 位图等内容显示在该静态图片控件中 用户还可设置其风格来改变控件的外观以及图像在控件的位置等 例如 下面的示例过程是在用静态图片控件在对话框中添加一个水平蚀刻线 1 打开Ex DlgCtrls项目中的对话框资源模板IDD EX DLGCTRLS DIALOG 2 在该对话框适当的位置处添加一个静态图片控件 右击该控件 从弹出的快捷菜单中选择 属性 对话框 如图 5 2静态控件和按钮 3 在属性对话框中 选择 颜色 类型为Etched 然后关闭属性对话框 4 将鼠标移动到添加的静态图片控件的右下角位置 使鼠标指针变成 拖动鼠标使控件的大小变成一条水平线 单击对话框测试按钮 如图 5 2静态控件和按钮 5 2 2按钮在Windows常见的按钮有 按键按钮 单选按钮 复选框按钮 如图 不同按钮的作用按键按钮常被称为命令按钮 有两种风格 标准按键按钮和默认按键按钮 从外观上来说 默认按键按钮是在标准按键按钮的周围加上一个黑色边框 一般只把最常用的按键按钮设定为默认按键按钮 具体设定的方法是在按键按钮属性对话框的Style页面中选中 默认按钮 Defaultbutton 项 单选按钮的外形是在文本前有一个圆圈 它被选中时 单选按钮中就标上一个黑点 它可分为一般和自动两种类型 复选框当它被选中 复选框中就加上一个 标记 通常复选框只有选中和未选中两种状态 若复选框前面有一个灰色是 则这样的复选框是三态复选框 5 2静态控件和按钮 按钮的消息常见只有两个 BN CLICKED 单击 和BN DOUBLE CLICKED 双击 按钮选中操作最常用的按钮操作是设置或获取一个按钮或多个按钮的选中状态 CButton类的成员函数SetCheck和GetCheck分别用来设置或获取指定按钮的选中状态 其原型如下 voidSetCheck intnCheck intGetCheck const nCheck和GetCheck函数返回值 0表示不选中 1表示选中 2表示不确定 对多个单选按钮的选中状态的设置或获取 需要使用通用窗口类CWnd的成员函数CheckRadioButton和GetCheckedRadioButton 原型如下 voidCheckRadioButton intnIDFirstButton intnIDLastButton intnIDCheckButton intGetCheckedRadioButton intnIDFirstButton intnIDLastButton nIDFirstButton和nIDLastButton分别指定这组单选按钮的第一个和最后一个按钮ID值 nIDCheckButton用来指定要设置选中状态的按钮ID值 函数GetCheckedRadioButton返回被选中的按钮ID值 5 2静态控件和按钮 5 2 3实例 制作问卷调查 1 创建一个默认的基于对话框应用Ex Research 2 单击对话框编辑器工具栏上的切换网格按钮 标题改为 上网问卷调查 3 删除对话框的 TODO 在这里设置对话控制 控件 向对话框中添加组框 Group 控件 然后调整其大小和位置 4 右击添加的组框控件 选择 属性 将Caption属性内容由 Static 改成 你的年龄 在Styles属性中 水平对齐 属性用来指定文本的位置 5 在组框内添加4个单选按钮 在属性中将ID属性分别改成IDC AGE L18 IDC AGE 18T27 IDC AGE 28T38和IDC AGE M38 将其 标题 Caption属性内容改成 38 如图 5 2静态控件和按钮 6 添加一个静态文本 标题为 你使用的接入方式 添加4个单选按钮 标题分别是 FTTL或ADSL 单位LAN 拨号56K 和 其他 将ID属性改成 IDC CM FTTL IDC CM LAN IDC CM 56K和IDC CM OTHER 用对话框编辑器工具栏的按钮命令调整控件左右之间的间距 如图 7 添加一个组框 标题为 你上网主要是 添加四个复选框 其标题为 收发邮件 浏览资料 聊天游戏 和 其他 ID为IDC DO POP IDC DO READ IDC DO GAME和IDC DO OTHER 如图 8 单击测试对话框 将每一组中的第一个单选按钮的Group属性选中 5 2静态控件和按钮 9 分别将这二个问题中的第一个单选按钮的Group 组 属性均选中 如图是对第二个问题设置的结果 10 单击对话框编辑器工具栏上的切换辅助线按钮 将对话框中的控件调整到辅助线以内 单击工具栏上的测试对话框按钮 如图 11 将工作区切换到ClassView页面 双击OnInitDialog函数名 在此函数添加下列初始化代码 BOOLCEx ResearchDlg OnInitDialog CDialog OnInitDialog CheckRadioButton IDC AGE L18 IDC AGE M38 IDC AGE 18T27 CheckRadioButton IDC CM FTTL IDC CM OTHER IDC CM FTTL CButton pBtn CButton GetDlgItem IDC DO POP pBtn SetCheck 1 使 收发邮件 复选框选中returnTRUE 5 2静态控件和按钮 12 用MFCClassWizard在CEx ResearchDlg中添加IDO的BN CLICKED消息映射 添加代码 voidCEx ResearchDlg OnOK CStringstr strCtrl CString是操作字符串的MFC类 获取第一个问题的用户选择str 你的年龄 UINTnID GetCheckedRadioButton IDC AGE L18 IDC AGE M38 GetDlgItemText nID strCtrl 获取指定控件的标题文本str str strCtrl str str n你使用的接入方式 nID GetCheckedRadioButton IDC CM FTTL IDC CM OTHER GetDlgItemText nID strCtrl 获取指定控件的标题文本str str strCtrl 获取第三个问题的用户选择str str n你上网主要是 n UINTnCheckIDs 4 IDC DO POP IDC DO READ IDC DO GAME IDC DO OTHER CButton pBtn for inti 0 iGetCheck pBtn GetWindowText strCtrl str str strCtrl str str MessageBox str CDialog OnOK 5 2静态控件和按钮 13 编译并运行 出现 上网问卷调查 对话框 当回答问题后 按 确定 按钮 出现如图的消息对话框 显示用户选择的内容 5 3编辑框和旋转按钮控件 5 3 1编辑框的属性和通知消息编辑框的属性对话框 编辑框的Style属性 5 3编辑框和旋转按钮控件 编辑框的通知消息 5 3编辑框和旋转按钮控件 5 3 2编辑框的基本操作口令设置输入的字符都被一个口令字符代替显示 默认的口令字符是 应用程序可以用成员函数CEdit SetPasswordChar来定义自己的口令字符 函数原型 voidSetPasswordChar TCHARch 参数ch表示设定的口令字符 选择文本鼠标选择文本 在文本的一端按下鼠标左键并拖动鼠标 到另一端释放鼠标键 键盘选择文本 在按光标方向移动键的同时 按住Shift键 通过编程选择文本 调用成员函数CEdit SetSel 确定编辑框内文本的选择范围 相对应的还有CEdit GetSel 获取编辑框中当前被选择文本的开始和结束位置 和CEdit ReplaceSel 替换当前被选择的文本 设置编辑框的页面边距调用成员函数CEdit SetMargins实现 函数的原型 voidSetMargins UINTnLeft UINTnRight 参数nLeft和nRight用来指定左 右边距的像素大小 剪帖板操作编辑框通过CEdit类的Copy Paste和Cut成员函数实现文本的复制 粘贴 剪切 并自动支持键盘快捷操作 对应的快捷健为Ctrl C Ctrl V和Ctrl X 应用程序调用CEdit Undo函数时 还可撤消当前的操作 再调用一次该函数 则恢复刚才的操作 5 3编辑框和旋转按钮控件 获取多行编辑框文本获取多行编辑框控件的文本的两种方法 一种是使用DDX DDV 当将编辑框控件所关联的变量类型选定为CString后 则不管多行编辑框的文本有多少都可用此变量来保存 这种方法不能单独获得多行编辑框中的某一行文本 另一种方法是使用编辑框CEdit类的相关成员函数来获取文本 例如 下面的代码将显示编辑框中第二行的文本内容 charstr 100 if m Edit GetLineCount 2 判断多行编辑框的文本是否有两行以上 intnChars nChars m Edit LineLength m Edit LineIndex 1 m Edit GetLine 1 str nChars 获取第二行文本str nChars 0 MessageBox str 调用GetLine获得某行文本内容时 不能自动在文本后添加文本的结束符 0 因此需要首先获得某行文本的字符数 然后设置文本的结束符 5 3编辑框和旋转按钮控件 5 3 3旋转按钮控件旋转按钮控件常用的风格旋转按钮控件属性对话框 旋转按钮控件的Style属性旋转按钮控件属性对话框 5 3编辑框和旋转按钮控件 旋转按钮控件的基本操作成员函数SetBase用来设置基数的 这个基数值决定了伙伴窗口显示的数字是十进制还是十六进制 成功返回先前的基数值 无效返回一个非零值 原型如下 intSetBase intnBase 参数nBase表示控件的新的基数 与此函数相对应的成员函数GetBase是获取旋转按钮控件的基数 成员函数SetPos和SetRange设置旋转按钮控件的当前位置和范围 原型 intSetPos intnPos voidSetRange intnLower intnUpper nPos表示控件的新位置 nLower和nUpper表示控件的上限和下限 任何一个界限值都不能大于0 x7fff或小于 0 x7fff 成员函数GetPos和GetRange用来获取旋转按钮控件的当前位置和范围 旋转按钮控件的通知消息旋转按钮控件的通知消息只有一个 UDN DELTAPOS 它是在当控件的当前数值将要改变时向其父窗口发送的 5 3编辑框和旋转按钮控件 5 3 4实例 用对话框输入学生成绩具体步骤 1 创建一个默认的单文档应用程序Ex CtrlSDI 2 添加一个新的对话框资源 ID号改为IDD INPUT 标题为 学生成绩输入 将 OK 和 Cancel 按钮标题改为 确定 和 取消 3 将 确定 和 取消 移至对话框的下方 然后显示对话框网格 4 向对话框添加控件 调整控件的位置 如图 5 3编辑框和旋转按钮控件 5 选择 编排 TabOrder 或按快捷键Ctrl D 单击对话框中的控件 重新设置控件的Tab键次序 以保证旋转按钮控件的Tab键次序在相对应的编辑框 伙伴窗口 之后 如图 单击对话框或按Enter键结束TabOrder方式 5 3编辑框和旋转按钮控件 6 双击对话框模板空白处 为该对话框模板创建一个对话框类CInputDlg 7 在ClassWizard的MemberVariables页面中 确定Classname中是否已选择了CInputDlg 选中所需的控件ID号 双击鼠标或单击AddVariables按钮 依次为下列控件增加成员变量 5 3编辑框和旋转按钮控件 8 MesssageMaps页面中 为CInputDlg添加WM INITDIALOG消息映射 添加代码 BOOLCInputDlg OnInitDialog CDialog OnInitDialog m spinScore1 SetRange 0 100 设置旋转按钮控件范围m spinScore2 SetRange 0 100 m spinScore3 SetRange 0 100 returnTRUE 9 为CInputDlg增加IDC SPIN S1控件的UDN DELTAPOS消息映射 添加代码 voidCInputDlg OnDeltaposSpinS1 NMHDR pNMHDR LRESULT pResult NM UPDOWN pNMUpDown NM UPDOWN pNMHDR UpdateData TRUE 将控件的内容保存到变量中m fScore1 float pNMUpDown iDelta 0 5f if m fScore1100 0 m fScore1 100 0f UpdateData FALSE 将变量的内容显示在控件中 pResult 0 NM UPDOWN结构用于反映旋转控件的当前位置和增量大小 10 打开Ex CtrlSDI单文档应用程序的菜单资源 添加顶层菜单项 测试 T 在其下添加一个菜单项 学生成绩输入 I ID为ID TEST INPUT 5 3编辑框和旋转按钮控件 11 用MFCClassWizard为CMainFrame类添加菜单项ID TEST INPUT的COMMAND消息映射 添加代码 voidCMainFrame OnTestInput CInputDlgdlg if IDOK dlg DoModal 获取对话框数据CStringstr str Format s s 4 1f 4 1f 4 1f dlg m strName dlg m strNO dlg m fScore1 dlg m fScore2 dlg m fScore3 AfxMessageBox str if语句是判断用户是否单击对话框的 确定 Format通过格式操作使任意类型的数据转换成一个字符串 该函数的第一个参数是带格式的字符串 每一个格式符依次对应于该函数的后面参数表中的参数项 5 3编辑框和旋转按钮控件 12 在文件MainFrm cpp的前面添加CInputDlg类的包含语句 include Ex CtrlSDI h include MainFrm h include InputDlg h 13 编译并运行 结果如图5 26所示 单击成绩1的旋转按钮控件将以0 5增量来改变它的伙伴窗口的数值 而成绩2和成绩3的旋转按钮控件由于设置了Setbuddyinteger属性 因此它按默认增量1自动改变伙伴窗口的数值 5 4列表框 5 4 1列表框的风格和消息列表框的属性对话框 5 4列表框 5 4列表框 5 4 2列表框的基本操作添加列表项CListBox类成员函数AddString和InsertString向列表框增加列表项 函数原型 intAddString LPCTSTRlpszItem intInsertString intnIndex LPCTSTRlpszItem 列表项的字符串文本由参数lpszItem来指定 InsertString函数不会对列表项进行排序 若nIndex等于 1 则列表项添加在列表框末尾 AddString函数当列表框控件具有sort属性时会自动将添加的列表项进行排序 用户需要根据列表项使用其他数据 就要调用CListBox的SetItemData和SetItemDataPtr 它们能使用户数据和某个列表项关联起来 intSetItemData intnIndex DWORDdwItemData intSetItemDataPtr intnIndex void pData SetItemData是将一个32位数与某列表项 由nIndex指定 关联起来 SetItemDataPtr可以将用户的数组 结构体等大量的数据与列表项关联 GetItemData和GetItemDataPtr分别用来获取相关联的用户数据 删除列表项CListBox类成员函数DeleteString和ResetContent用来删除指定的列表项和清除列表框所有项目 函数原型 intDeleteString UINTnIndex nIndex指定要删除的列表项的索引voidResetContent 注意 若在添加列表项时使用SetItemDataPtr函数 不要忘记在进行删除操作时及时将关联数据所占的内存空间释放出来 5 4列表框 查找列表项CListBox类成员函数FindString和FindStringExact在列表框中查找匹配的列表项 intFindString intnStartAfter LPCTSTRlpszItem const intFindStringExact intnIndexStart LPCTSTRlpszFind const lpszFind和lpszItem指定要查找的列表项文本 nStartAfter和nIndexStart指定查找的开始位置 查到后 两个函数都将返回所匹配列表项的索引 列表框的单项选择当选中列表框中某个列表项 用户可以使用CListBox GetCurSel来获取这个结果 与该函数相对应的CListBox SetCurSel函数是用来设定某个列表项呈选中状态 高亮显示 intGetCurSel const 返回当前选择项的索引intSetCurSel intnSelect nSelect指定要设置的列表项索引 错误时这两个函数都将返回LB ERR 若要获取某个列表项的字符串 可使用下列函数 intGetText intnIndex LPTSTRlpszBuffer const voidGetText intnIndex CStringnIndex指定列表项索引 lpszBuffer和rString是用来存放列表项文本 5 4列表框 列表框的多项选择在列表框的Style属性中选中多选或扩展多选类型后 就可以在列表框中进行多项选择 获得选中的多个选项 需用MFCClassWizard映射列表框控件的LBN SELCHANGE消息 添加类似代码 voidCListBoxDlg OnSelchangeList1 intnCount m list GetSelCount 获取用户选中的项数if nCount LB ERR int buffer newint nCount 开辟缓冲区m list GetSelItems nCount buffer 将各个选项的索引号内容存放在缓冲区中CStringallStr str allStr Empty 字符串清空for inti 0 i nCount i m list GetText buffer i str 获得各个索引的项目文本allStr allStr str 处理项目文本 delete buffer 释放内存 MessageBox allStr 处理获得的文本 5 4列表框 5 4 3实例 城市邮政编码如图 单击 添加 城市名和邮政编码添加到列表框中 单击列表框的城市名 将在编辑框中显示出城市名和邮政编码 单击 修改 将以城市名作为列表框的查找关键字 找到后修改其邮政编码内容 步骤 1 打开前面创建的单文档程序项目Ex CtrlSDI 2 添加一个对话框资源IDD CITYZIP 标题定为 城市邮政编码 将此对话框类设为CCityDlg 3 删除原来的 Cancel 按钮 将 OK 按钮标题改为 退出 4 打开对话框网格 用编辑器为对话框添加控件 5 4列表框 5 打开ClassWizard的MemberVariables 在Classname中选择CCityDlg 选中所需的控件ID号 双击鼠标或单击AddVariables按钮 6 将项目工作区切换到ClassView页面 右击CCityDlg类名 从弹出的快捷菜单中选择 AddMemberFunction 弹出如图5 30所示的对话框 在FunctionType 函数类型 框中输入BOOL 在FunctionDeclaration 函数声明 框中输入IsValidate 单击 OK 5 4列表框 7 在CCityDlg IsValidate函数输入下列代码 BOOLCCityDlg IsValidate UpdateData m strCity TrimLeft if m strCity IsEmpty MessageBox 城市名输入无效 returnFALSE m strZip TrimLeft if m strZip IsEmpty MessageBox 邮政编码输入无效 returnFALSE returnTRUE TrimLeft是CString类的一个成员函数 用来去除字符串左边的空格 IsValidate函数是判断城市名和邮政编码编辑框中的内容是否是有效 5 4列表框 8 打开MFCClassWizard 切换到MesssageMaps页面 为按钮IDC BUTTON ADD添加BN CLICKED的消息映射 增加代码 voidCCityDlg OnButtonAdd if IsValidate return intnIndex m ListBox FindStringExact 1 m strCity if nIndex LB ERR MessageBox 该城市已添加 return nIndex m ListBox AddString m strCity m ListBox SetItemDataPtr nIndex newCString m strZip 函数SetItemDataPtr可以将用户的数组 包括字符串 结构体等大型数据与列表项相关联 调用时一般要用new运算符为对象分配内存 9 用MFCClassWizard为按钮IDC BUTTON CHANGE添加BN CLICKED的消息映射 增加代码 voidCCityDlg OnButtonChange if IsValidate return intnIndex m ListBox FindStringExact 1 m strCity if nIndex LB ERR delete CString m ListBox GetItemDataPtr nIndex m ListBox SetItemDataPtr nIndex newCString m strZip 5 4列表框 10 用MFCClassWizard为列表框IDC LIST1添加LBN SELCHANGE 当前选择项发生改变 的消息映射 并增加下列代码 voidCCityDlg OnSelchangeList1 intnIndex m ListBox GetCurSel if nIndex LB ERR m ListBox GetText nIndex m strCity m strZip CString m ListBox GetItemDataPtr nIndex UpdateData FALSE 11 用MFCClassWizard为对话框添加WM DESTROY的消息映射 增加代码 voidCCityDlg OnDestroy 此消息是当对话框关闭时发送的 for intnIndex m ListBox GetCount 1 nIndex 0 nIndex 删除所有与列表项相关联的CString数据 并释放内存delete CString m ListBox GetItemDataPtr nIndex CDialog OnDestroy 当对话框从屏幕消失后 对话框被清除时发送WM DESTROY消息 在此消息的映射函数中添加一些对象删除代码 以便在对话框清除前有效地释放内存空间 5 4列表框 12 打开Ex CtrlSDI单文档应用程序的菜单资源 在顶层菜单项 测试 14 在文件MainFrm cpp的前面添加CCityDlg类的包含语句 include MainFrm h include InputDlg h include CityDlg h 15 编译运行并测试 5 5组合框 5 5 1组合框的风格类型和消息组合框分为三类 简单组合框 下拉式组合框 下拉式列表框 如图 简单组合框和下拉式组合框都包含有列表框和编辑框 简单组合框中的列表框不需要下拉 是直接显示出来的 单击下拉式组合框中的下拉按钮时 下拉的列表框才被显示出来 下拉式列表框虽然具有下拉式的列表 却没有文字编辑功能 组合框还有其他一些风格 这些风格可在如图的组合框的属性对话框中设置 5 5组合框 5 5组合框 5 5 3实例 简单文件对话框实例的具体步骤如下 1 打开前面创建的单文档应用程序程序项目Ex CtrlSDI 2 添加一个对话框资源IDD SIMPLE 标题定为 简单文件对话框 将此对话框类设为CSimpFileDlg 3 将 OK 和 Cancel 按钮标题分别改为 确定 和 取消 4 打开对话框网格 用编辑器为对话框添加如下表所示的一些控件 组合框添加到对话框模板后 一定要单击组合框的下拉按钮 然后调整出现的下拉框大小 下拉框 5 5组合框 5 打开ClassWizard的MemberVariables页面 在Classname中选择CSimpFileDlg 选中所需的控件ID号 双击鼠标或单击AddVariables按钮 6 为CSimpFileDlg类添加成员函数ResetFileCombo 函数代码 voidCSimpFileDlg ResetFileCombo CStringstr m comboFile ResetContent 删除原来的全部项m comboFile Dir DDL READWRITE DDL READONLY DDL ARCHIVE str 将当前文件路径下的文件添加到组合框中 函数Dir将指定路径下的文件或文件夹名添加到组合框中 该函数有两个参数 第一参数指定相应的文件属性 第二个参数指定文件类型或其他通配字符 文件属性可以是一些预定义值或 组合 列表框类CListBox也有Dir成员函数 5 5组合框 7 为CSimpFileDlg类添加成员函数ResetFolderList 用来更新文件夹 目录 列表中的内容 函数代码如下 voidCSimpFileDlg ResetFolderList CStringstr m listFolder ResetContent 删除原来的全部项m listFolder Dir DDL DIRECTORY DDL EXCLUSIVE str 将当前文件路径下的文件夹添加到列表框中 8 用MFCClassWizard为组合框IDC COMBO TYPE添加CBN SELCHANGE 当前选择项发生改变 的消息映射 并增加下列代码 voidCSimpFileDlg OnSelchangeComboType intnIndex m comboType GetCurSel 获取当前选择项索引号if nIndex CB ERR CStringstr m comboType GetLBText nIndex str 获取当前选择项内容ResetFileCombo str 更新文件列表 5 5组合框 9 用MFCClassWizard为组合框IDC COMBO DRIVER添加CBN SELCHANGE的消息映射 增加代码 voidCSimpFileDlg OnSelchangeComboDriver intnIndex m comboDriver GetCurSel 获取当前选择项索引号if nIndex CB ERR CStringstr m comboDriver GetLBText nIndex str 获取当前选择项内容CStringstrPath strPath Format c str GetAt 2 SetCurrentDirectory strPath ResetFolderList 更新文件夹列表内容OnSelchangeComboType 按 文件类型 更新文件列表内容 若切换到D盘根目录 则应用 d 格式 因此用Format 函数来转换 GetAt用来获取字符串中指定位置的字符 str GetAt 2 是获取字符串str的第3个字符 SetCurrentDirectory是一个系统API函数 用来设置当前目录 函数参数用来指定目录的相对路径或绝对路径 函数SetCurrentDirectory调用前面加上的域作用符 是用来指定调用的函数是CSimpFileDlg类外部的函数 5 5组合框 10 用MFCClassWizard为列表框IDC LIST FOLDER添加LBN DBLCLK 双击列表项 的消息映射 并增加下列代码 voidCSimpFileDlg OnDblclkListFolder intnIndex m listFolder GetCurSel 获取当前选择项索引号if nIndex LB ERR CStringstr m listFolder GetText nIndex str 获取当前选择项内容CStringstrPath strPath str Mid 1 str GetLength 2 SetCurrentDirectory strPath 设置当前目录ResetFolderList 更新文件夹列表内容OnSelchangeComboType 按 文件类型 更新文件列表内容 必须将列表项文本内容的方括号去除 CString类的成员函数Mid是用来取字符串中间的内容 它有两个参数 第一个参数指定获

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论