第2章 对话框与控件 返回目录
概念 对话框是一个弹出式窗口,它一般用于用户输入或与用户进行交互活动的场合 模态 对 话 框 非模态 不允许用户在关闭对话框之前切换到应用程序的其他窗口 模态 对 话 框 允许用户在该对话框与应用程序其他窗口之间的切换,非模式对话框从WinMain函数的消息循环中接收输入 非模态
对话框的实现步骤 第一步:设计对话框模版资源 增加或删除控件; 设置控件属性 测试对话框的运行效果 第二步:设计对话框类 创建对话框类 创建对话框成员变量 对话框的初始化 第三步:运行对话框
对话框的CDialog类 CDialog类是所有对话框类的基类。它是由CWND类派生来的。CDialog中有许多成员函数,其中最重要的有以下5个: CDialog::DoModal( ):用于激活模态对话框,显示对话框窗口,在此对话框关闭前,用户不能与应用程序的其他窗口交互。函数返回一个int型数值,当函数无法建立对话框时返回-1,发生错误时返回IDABORT。
对话框的CDialog类 CDialog::OnInitDialog( ):用于响应WM_INITDIALOG消息。在Create()或DoModal()函数调用期间,系统会发送WM_INITDIALOG给对话框,在对话框显示之前执行初始化操作。 CDialog::OnOK( ):当用户单击“OK” 按钮(ID为IDOK)时,调用该函数。
对话框的CDialog类 CDialog::OnCancel( ):当用户单击“Cancel”(取消)按钮或按“Esc”键时被调用。在模态对话框下,将自动终止模态对话框。 CDialog::Create( ):根据对话框资源模版创建非模态对话框窗口并立即返回。如果对话框不是Visible属性,还需要调用CWnd::ShowWindow()函数显示非模态对话框。
创建对话框 创建对话框的方法有如下两种:
利用AppWizard建立对话框
创建对话框 在SDI或MDI方式下,单击项目工作区窗口中的“ResourceView”选项卡,展开“Dialog”选项,可在里面手动添加用户自定义对话框。 下面举例介绍如何在SDI界面下创建一个对话框。 【例2-1】 利用SDI方式增加一个对话框。
对话框中的控件 控件是在系统内部定义的能够完成特定功能的控制程序单元。在应用程序中使用控件不仅简化了编程,还能完成常用的各种功能。为了更好地发挥控件的作用,用户应理解和掌握控件的属性、消息以及创建和使用的方法。
对话框中的控件 在进行对话框的界面设计时,Visual C++ 6.0中已经提供了控件工具。当用户新建一个对话框时,控件工具栏一般会自动弹出。
控件工具栏
对话框中的控件 Visual C++ 6.0提供了很多控件,而且每个控件都有大量的属性和事件。下面将介绍一些常用的控件。
静态控件 静态控件用来显示字符串、框、矩形、图标、位图或增强的图元文件。它可以被用来作为标签、框或分隔其他的控件。静态控件一般不接收用户输入,也不产生通知消息。
静态控件
静态控件
按钮 它由CButton类进行管理,使用CButton::SetButtonStyle和CButton::GetButtonStyle函数能够在应用程序中动态地设置和查询按钮状态。
按钮 如果按钮具有焦点,还可使用鼠标左键、“Enter”键或空格键触发该按钮的Click事件。通过设置窗体的AcceptButton或CancelButton属性,无论该按钮是否有焦点,都可以通过按“Enter”键或“Esc”键来触发按钮的Click事件。
按钮 在按钮映射的消息中,常见的有两个:BN_CLICKED(单击按钮)、BN_DOUBLECLICKED(双击按钮)。 下面将介绍Visual C++ 6.0在对话框中添加按钮及按钮属性的设置方法。
按钮 控件的对话框中含有许多属性,对于大多数控件来说,这些属性一般都有“General”(一般属性)、“Styles”(控件的风格)和“Extended Styles”(控件的扩展风格)3个选项卡。其中“General”和“Styles”是用来设定控件的外观和辅助功能的,不同的控件具有不同的风格和扩展风格,但控件的一般属性是基本相同的,它通常有标识符框、标题框等内容。
按钮 各项具体说明如下: “ID”文本框:控件的标识符。每种控件都有缺省的ID,例如按钮控件为IDC_BUTTON1。
按钮
按钮
编辑框 编辑框(Edit Box) 是用户通过键盘和鼠标输入和编辑文字的矩形窗口,用户可通过它进行文字、数字或口令的输入,也可使用它编辑或修改简单的文本文件。选择编辑框后,编辑框中将显示默认文本和闪烁的光标,光标处用以表示开始输入文本的位置。然后用户就可用键盘或鼠标来输入文本、移动光标、选择、移动或删除的文本。
编辑框 编辑框通常用于编辑文本,不过也可使其成为只读控件。编辑框能够显示多行数据、对文本换行使其符合控件的大小和添加基本的格式设置等。但是编辑框中显示或输入的文本只能采用一种格式。
编辑框 Text属性是编辑框最重要的属性,因为要显示的文本就包含在Text属性中。默认情况下,最多可在一个编辑框中输入2048个字符。如果将MultiLine属性设置为True,则最多可输入32KB的文本。Text属性可在设计窗体时使用属性窗口设置,也可在运行时用代码设置或通过用户输入来设置。在运行时通过读取Text属性可以获得编辑框的当前内容。
编辑框 设置编辑框的页面边距可使文本在编辑框显示更具满意效果,这在多行编辑控件中尤为重要,应用程序可以通过调用成员函数CEdit::SetMargins来实现,这个函数的原型如下: Void SetMargins(UINT nLeft, (UINT nRight);
编辑框 其中,参数nLeft和nRight分别用来指定左、右边距的像素宽度。 口令设置在编辑控件中不同于一般的文本编辑控件,用户输入的每个字符都被一个特殊的字符代替显示,这个特殊的字符称为口令字符。
编辑框 缺省的口令字符是“*”,应用程序可以用成员函数Cedit::SetPasswordChar来定义自己的口令字符,其函数的原型如下: Void SetPasswordChar(TCHAR ch);
单选项
单选项 当单击单选项时,其Checked属性被设置为True,并调用Click事件处理程序。当Checked属性的值更改时,将触发CheckedChanged事件。如果AutoCheck属性被设置为True(默认),那么当选择该单选项时,将自动清除该组中其他单选项。
单选项 通常只有在使用验证代码以确保选定的单选项是允许的选项时,才将该属性设置为False。用Text属性可以设置控件内显示的文本,该属性也可以包含访问键快捷方式,即前面带有“&”符号的字母,这样用户就可以通过同时按“Alt”键和访问键来“单击”控件。
单选项 如果将Appearance属性设置为Button,将使单选项的外观像按钮一样,即当选中它时,它看起来已被按下。单选项也可以使用Image和ImageList属性组合来显示图像。
复选框
复选框 复选框和单选项的相似之处在于:它们都是供用户选择的选项。其不同之处在于:在单选项组中一次只能选择一个单选项,而在一组复选框中则可同时选择任意多项。
复选框 复选框有两个重要属性Checked和CheckState。Checked属性返回True或False。CheckState属性返回CheckState. Checked或CheckState. Unchecked。如果ThreeState属性被设置为True,CheckState属性还可返回CheckState.Indeterminate,此时,复选框显示为浅灰色状态,通常表示该选项下的多个子选项未完全选中。
组合框
组合框
组合框 组合框的风格及类型 组合框常见操作 组合框的通知消息
组合框的风格及类型 按照组合框的主要风格特征,可把组合框分为3类:简单组合框、下拉式组合框、下拉式列表框。
组合框的风格及类型 简单组合框和下拉式组合框都包含有列表框和编辑控件,但是简单组合框中的列表框不需要单击下拉按钮,是直接显示出来的;而当用户单击下拉式组合框中的下拉按钮时,下拉的列表框才被显示出来。下拉式列表框虽然具有下拉式的列表,却没有文字编辑功能。
组合框的风格及类型 组合框还有其他一些风格,这些风格可以在组合框的属性对话框中设置。
组合框的风格及类型 组合框中“Styles”选项卡下各选项的属性说明如下: “Y类”下拉列表框:设置组合框的类型,有Simple(简单)、Dropdown(下拉)、DropList(下拉列表框)3种。 “Owner draw” 下拉列表框:自画组合框,缺省为No。
组合框的风格及类型
组合框的风格及类型
组合框的风格及类型
组合框的风格及类型
组合框常见操作 组合框的操作是调用CComboBox成员函数来实现的。其CcomboBox类常用成员函数说明如下: int AddString(LPCTSTR lpszString):向组合框添加字符串。错误时返回CB_ERR;空间不够时返回CB_ERRSPACE。
组合框常见操作 int DeleteString(UINT nIndex):删除指定的索引项,返回剩下的列表项总数,错误时返回CB_ERR。 int InsertString(int nIndex,LPCTSTR lpszString):在指定的位置处插入字符串,若nIndex=-1时,即向组合框尾部添加。
组合框常见操作 Void ResetContent():删除组合框的全部项和编辑文本。 int SetCurSel(int nSelect):设置当前选择项。 int GetCount() const:获得组合框的项数。
组合框的通知消息 在组合框的通知消息中,有操作列表框发出的也有操作编辑框发出的。现说明如下: CBN_CLOSEUP:当组合框的列表关闭时发送此消息。 CBN_DBLCLK:当双击组合框的某项字符串时发送此消息。
组合框的通知消息 CBN_DROPDOWN:当组合框的列表打开时发送此消息。 CBN_SELENDCANCEL:当前选择项被取消时发送此消息。 CBN_SELENDOK:当用户选择一个项并按下“Enter”键或单击下拉箭头隐藏列表框时发送此消息。
组合框的通知消息 CBN_KILLFOCUS:当组合框失去键盘输入焦点时发送此消息。 CBN_SELCHANGE:当组合框的当前选择项将要改变时发送此消息。 CBN_SETFOCUS:当组合框获得键盘输入焦点时发送此消息。
在对话框中添加和编辑控件 控件是在系统内部定义的能够完成特定功能的控制程序单元。在应用程序中使用控件不仅能简化编程,还可完成常用的各种功能。 添加控件的方法 控件的移动、删除和复制 对话框中的控件布局
添加控件的方法 在对话框中添加控件的方法有如下两种: 在控件工具栏中选择某控件,此时的鼠标箭头在对话框中变成“+”形状。在对话框指定位置单击鼠标左键,则此控件被添加到对话框的相应位置,再拖动选择框可改变控件的大小和位置。
添加控件的方法 在控件工具栏中选择某控件,并按住鼠标键不放,在移动鼠标到对话框的指定位置的过程中,用户会看到一个虚线框,下面带有该控件的标记,然后释放鼠标,新添加的控件就出现在对话框中。
控件的移动、删除和复制 当单个控件或多个控件被选择后,按键盘的方向键或用鼠标拖动控件的选择框可移动控件。若在鼠标拖动过程中按住“Ctrl”键可复制控件,按“Delete”键可删除控件。
对话框中的控件布局 Visual C++ 6.0提供了一系列编辑对话框的控件布局工具。现说明如下:
对话框中的控件布局
对话框中的控件布局
对话框中的控件布局 与布局工具相对应的菜单命令,可选择“编排”命令下的命令选项,而且大部分的命令都有相应的快捷键,现说明如下: Align:对齐控制。 Space Evently:空间分布。 Make Same Size:使多个控件具有相同尺寸。
对话框中的控件布局 Arrange Buttons:按钮布置。 Center in Dialog:在对话框内居中。 Size in Content:按内容定义尺寸。 Auto Size:自动大小。
对话框中的控件布局 Flip:翻转。 Tab Order:设置“Tab”键顺序。 Guide Settings:网格、标尺等辅助工具的设置。 Test:测试对话框性能。
常用控件的应用例程 【例2-2】 为【例2-1】新建的对话框增加控件,构成一个学生个人信息登记的操作界面,包含学生姓名、学号、性别、学院及其他信息。
对话框的编程 前面已经为对话框添加了控件,在程序运行中我们仍然无法看到对话框,无法对对话框界面进行操作。为了使对话框工作起来,使用户和对话框实现交互功能,需要对对话框进行编程。
对话框的编程 【例2-3】 为【例2-1】在菜单栏中增加 “显示对话框”菜单项,下拉子菜单为“显示”。选择“显示”命令,打开用户自定义对话框。在对话框中进行相应信息的输入,单击按钮,在“信息”对应的文本框中显示输入的学生信息。 到这里,已经可以看到用户定义的对话框,下面增加代码实现用户与对话框的交互。
【例2-3】的运行结果
上 机 练 习 在对话框模式下创建一个简单的计算器,能进行加、减、乘、除运算.
lianxi2_1运行结果
习 题 在对话框模式下,建立一个用户登陆界面,当用户名为“学生”,口令为“student”时,打开“regist”对话框。
习 题 (2)编写一个程序,其中有一个汽车类vehicle,它具有一个需要传递参数的构造函数,类中的数据成员包括:车轮个数wheels和车重weight作为保护成员;小车类car是它的私有派生类,其中包含载人数passengers;卡车类truck是vehicle的私有派生类,其中包含载人数passengers和载重量payload。每个类都需有相关数据的输出方法。
3.1 2.2 对话框应用实例 【2.4】创建对话框 功能:在程序主界面出现之前弹出【密码】对话框,输入用户密码.如密码输入正确,程序继续执行,否则程序终止。(设密码为1925) 返回第3章
2.2.1 CWnd 类中有关对话框处理的常用函数 DoDataExchange:实现对话框框数据交换,不能直接调用,必须被UpdateData()函数调用。 UpdateData :实现控件与控件变量之间的数据的传送。 UpdateData(TRUE):将控件中的数据传送到变量中。 UpdateData(FALSE):将变量的值传送给控件。
程序的实现步骤 利用AppWizard生成单文档程序(Dialog ) 编辑口令对话框资源 添加控件和关联变量 添加代码
3.1 步骤1 生成程序框架(Dialog ) 项目名称: test3 选择单文档界面应用程序
步骤2 编辑口令对话框资源 3.1 ID: IDD_PASSWORD_DIALOG Caption: “口令” 步骤2 编辑口令对话框资源 ID: IDD_PASSWORD_DIALOG Caption: “口令” Class: CPasswordDialog 添加控件: IDC_STATIC Static Text Caption:请输入口令 IDC_STATIC Static Text Caption:口令为一个0 - 9999之间的整数 Client edge、Static edge和Modal frame选中 IDC_PASSWORD_EDIT Edit Box Password :选中 IDOK Button Caption:确定 IDCANCEL Button Caption:取消
步骤3 添加控件关联变量 步骤4 显示对话框 3.1 IDC_PASSWORD_EDIT int m_Password 步骤3 添加控件关联变量 IDC_PASSWORD_EDIT int m_Password Minimum Value : 0 Maximum Value : 9999 步骤4 显示对话框 在文件test3.cpp的头部,加入下面的包含语句 #include “PasswordDialog.h”
步骤4 显示对话框 3.1 { CpasswordDialog dlg; if (dlg.DoModal()==IDOK) 步骤4 显示对话框 BOOL test3::InitInstance() { CpasswordDialog dlg; if (dlg.DoModal()==IDOK) if (dlg.m_password !=1995) MessageBox(NULL,"口令错误!","错误",MB_ICONERROR+MB_OK); return FALSE; } else return TRUE;
3.2 程序的实现步骤 在上一节程序的基础上 添加菜单资源和菜单响应函数 编辑对话框资源和创建对话框类 添加消息响应函数和代码
步骤1 添加菜单资源和菜单响应函数 在“查看(V)”菜单中添加以下菜单项 Separator 3.2 步骤1 添加菜单资源和菜单响应函数 在“查看(V)”菜单中添加以下菜单项 Separator ID_VIEW_MODALDIALOG 模态对话框(&M)… ID_VIEW_MODALLESSDIALOG 非模态对话框(&E)… ID_VIEW_PROGRESSDIALOG 进度条对话框(&R)… ID_VIEW_PROPERTIES 属性页对话框(&P)… ID_VIEW_COMMONDIALOG 通用对话框(&C)…
步骤2 编辑对话框资源 3.2 ID: IDD_MODAL_DIALOG Caption: “Modal Dialog” 步骤2 编辑对话框资源 ID: IDD_MODAL_DIALOG Caption: “Modal Dialog” Class: CDialogModal 添加控件: IDC_SEX1 Radio Button Caption: 男 Group:选中 IDC_SEX2 Radio Button Caption: 女 IDC_INSTEREST1 Check Box Caption: 登山 Group:选中 IDC_INSTEREST2 Check Box Caption: 游泳 IDC_INSTEREST3 Check Box Caption: 看书 IDC_INSTEREST4 Check Box Caption: 玩游戏 IDC_COMBO Combo Box IDC_EDIT Edit Box
步骤3 添加控件关联变量 步骤4 显示对话框 3.2 IDC_COMBO CComboBox m_Combo; 步骤3 添加控件关联变量 IDC_COMBO CComboBox m_Combo; IDC_SEX1 CButton m_Radio; IDC_EDIT CString m_Edit; 步骤4 显示对话框 1. 菜单响应函数 void CDialogView::OnViewModaldialog() { CDialogModal m_Dlg; m_Dlg.DoModal(); }
3.2 2. 对话框响应函数 BOOL CDialogModal::OnInitDialog() { 2. 对话框响应函数 BOOL CDialogModal::OnInitDialog() { CDialog::OnInitDialog(); // TODO: Add extra initialization here m_Radio.SetCheck(1); //把"男"设置为默认值 m_Combo.InsertString(0,"小学"); //往Combo Box加入选项 m_Combo.InsertString(1,"初中"); m_Combo.InsertString(2,"高中"); m_Combo.InsertString(3,"大学"); m_Combo.InsertString(4,"本科以上..."); m_Combo.SetCurSel(0); //把"小学"设置为默认值 return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE }
3.2 void CDialogModal::OnOk() { // TODO: Add your control notification handler code here CString str; str.Empty(); if(m_Radio.GetCheck()) str += "先生"; else str += "小姐"; str += "你好,你的爱好:"; BOOL flag=0; CButton *p; //得到指向IDC_INSTEREST1的指针 p = (CButton *)GetDlgItem(IDC_INSTEREST1); if(p->GetCheck()) //判断"登山"是否被选中 str += "登山 "; flag = 1; } 3.2
//得到指向IDC_INSTEREST2的指针 p = (CButton *)GetDlgItem(IDC_INSTEREST2); if(p->GetCheck()) //判断"游泳"是否被选中 { str += "游泳 "; flag = 1; } //得到指向IDC_INSTEREST3的指针 p = (CButton *)GetDlgItem(IDC_INSTEREST3); if(p->GetCheck()) //判断"看书"是否被选中 str += "看书 "; //得到指向IDC_INSTEREST4的指针 p = (CButton *)GetDlgItem(IDC_INSTEREST4); if(p->GetCheck()) //判断"玩游戏"是否被选中 str += "玩游戏 ";
if (!flag) { str += "不知道"; str += ",学历:"; int number; CString temp; number = m_Combo.GetCurSel(); //得到当前被选中项的序号m_Combo.GetLBText(number,temp); //得到序号为number的项的內容 str += temp; m_Edit = str; UpdateData(false); //更新文本框中的内容 }
3.3 3.3 非模态对话框 概念 非模态对话框弹出后,程序可以在不关闭该对话框的情况下继续执行,在转入到应用程序其他部分的代码时可以不需要用户做出响应。非模态对话框一般用来显示信息,或者实时地进行一些设置。 返回第3章
3.2 程序的实现步骤 在上一节程序的基础上 编辑对话框资源和创建对话框类 显示非模态对话框 实现对话框的功能
步骤1 编辑对话框资源 3.3 ID: IDD_MODALLESS_DIALOG Caption: “Modalless Dialog” 步骤1 编辑对话框资源 ID: IDD_MODALLESS_DIALOG Caption: “Modalless Dialog” Class: CDialogModalless 添加控件: ID号 控件 属性 IDC_TREE Tree Control 选中复选框Has buttons,Has lines和Lines at root IDC_LIST List Control Styles|View:Report ID_OK Button Caption:确定
步骤2 显示非模态对话框 1.在视类中添加对话框成员指针 ,并包含对话框头文件 public: 3.3 步骤2 显示非模态对话框 1.在视类中添加对话框成员指针 ,并包含对话框头文件 public: CDialogModalless * m_pModallessDlg; 并包含对话框头文件 #include“DialogModalless.h” 2.添加消息响应函数
3.3 void CDialogView::OnViewModallessdialog() { // TODO: Add your command handler code here //如果指针指向NULL,说明对话框还没有创建,则动态创建 if(m_pModallessDlg==NULL) m_pModallessDlg=new CDialogModalless; m_pModallessDlg->Create(IDD_MODALLESS_DIALOG,this); } //显示非模态对话框 m_pModallessDlg->ShowWindow(SW_SHOW);
3.3 3.修改视类的构造函数和析构函数 CDialogView::CDialogView() { // TODO: add construction code here m_pModallessDlg = NULL; //初始化指针 } CDialogView::~CDialogView() if(m_pModallessDlg != NULL) delete m_pModallessDlg; //释放空间
步骤3 实现对话框的功能 3.3 1.添加控件关联变量 控件 变量类型 变量名 IDC_LIST CListCtrl m_List 步骤3 实现对话框的功能 1.添加控件关联变量 控件 变量类型 变量名 IDC_LIST CListCtrl m_List IDC_Tree CTeeCtrl m_Tree 2. 添加消息响应函数
3.3 BOOL CDialogModalless::OnInitDialog() { CDialog::OnInitDialog(); // TODO: Add extra initialization here //往List控件中插入一列 m_List.InsertColumn(0, "文件名", LVCFMT_LEFT, 150, -1); TV_INSERTSTRUCT TreeItem; HTREEITEM hTreeItem; TreeItem.hInsertAfter = TVI_LAST; TreeItem.item.mask = TVIF_TEXT|TVIF_PARAM;
//第一级 CString str = "D:\\"; TreeItem.hParent = TVI_ROOT; //父级为根部 TreeItem.item.pszText = str.GetBuffer(50); //设置字符缓冲区的大小并赋值 TreeItem.item.lParam = 1; //对于根目录,设置为1 hTreeItem = m_Tree.InsertItem(&TreeItem); //插入Tree控件中 int number = 0; //计算文件的个数 CFileFind file; BOOL bfind; CString temp;
//第二级 TreeItem.hParent = hTreeItem; TreeItem.item.lParam = 10;//对于子目录,设置为10 bfind = file.FindFile("D:\\*.*"); //查找D:盘根目录下的所有文件和目录 while(bfind)//如果找到 { bfind = file.FindNextFile(); //查找下一个 if(file.IsDirectory()) //判断是否为目录 //得到目录名并拷贝字符串 strcpy(TreeItem.item.pszText,file.GetFileName()); hTreeItem = m_Tree.InsertItem(&TreeItem); //插入Tree控件 }
else { //如不是目录,插入List控件 str = file.GetFileName(); //得到文件名 m_List.InsertItem(number,str); //把文件名插入第number行 number++; } return TRUE;}
void CDialogModalless::OnSelchangedTree(NMHDR. pNMHDR, LRESULT void CDialogModalless::OnSelchangedTree(NMHDR* pNMHDR, LRESULT* pResult) { NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR; // TODO: Add your control notification handler code here CString temp,str; //获取当前被选择的tree view项 HTREEITEM CurItem = m_Tree.GetSelectedItem(); TV_ITEM TreeItem; TreeItem.hItem = CurItem; m_Tree.GetItem(&TreeItem); //获取指定tree view项的属性 //获得当前选中项的文本 temp = m_Tree.GetItemText(m_Tree.GetSelectedItem()); long CurlParam = TreeItem.lParam; //当前条目的序号 if(CurlParam != 1) //如果是子目录 //获取当前被选择项的父项 TreeItem.hItem = m_Tree.GetParentItem(m_Tree.GetSelectedItem()); m_Tree.GetItem(&TreeItem); CurItem = TreeItem.hItem; str = m_Tree.GetItemText(CurItem); str += temp; str += "\\"; } else str = temp; m_List.DeleteAllItems(); //删除控件中的所有项 CFileFind file; BOOL bFind; int number = 0; str += "*.*"; bFind = file.FindFile(str); //在str目录下查找 while(bFind) //如果找到 bFind = file.FindNextFile(); if(!file.IsDirectory()) //判断是否为目录 //如不是目录,插入List控件 temp = file.GetFileName(); //得到文件名 m_List.InsertItem(number,temp); //把文件名插入第number行 number++; UpdateData(false); //更新控件中的值 *pResult = 0; 3.3
3.4 进度条对话框 程序的实现步骤 在上一节程序的基础上 编辑对话框资源和创建对话框类 显示进度条对话框 实现对话框的功能 3.4 3.4 进度条对话框 程序的实现步骤 在上一节程序的基础上 编辑对话框资源和创建对话框类 显示进度条对话框 实现对话框的功能 返回第3章
步骤1 编辑对话框资源 3.4 ID: IDD_PROGRESS_DIALOG Caption: “Progress Dialog” 步骤1 编辑对话框资源 ID: IDD_PROGRESS_DIALOG Caption: “Progress Dialog” Class: CDialogProgress 添加控件: ID号 控件 属性 IDC_PROGRESS Progress Border:选中 IDC_TIME_SLIDER Slider IDC_EDIT Edit Box IDC_PERCENT_SPIN Spin 选中Auto buddy和Set buddy integer IDC_PROGRESS_BUTTON Button Caption:进度条演示 IDC_QUIT_BUTTON Caption:退出
步骤2 显示进度条对话框 3.4 1.在视类中包含对话框头文件 #include "DialogProgress.h" 2.添加消息响应函数 步骤2 显示进度条对话框 1.在视类中包含对话框头文件 #include "DialogProgress.h" 2.添加消息响应函数 void CDialogView::OnViewProgressdialog() { // TODO: Add your command handler code here CDialogProgress dlg; dlg.DoModal(); }
步骤3 实现对话框的功能 3.4 1.添加控件关联变量 控件 变量类型 变量名 步骤3 实现对话框的功能 1.添加控件关联变量 控件 变量类型 变量名 IDC_PERCENT_SPIN CSpinButtonCtrl m_Spin IDC_PROGRESS CProgressCtrl m_Progrees IDC_TIME_SLIDER CSliderCtrl m_Time 2. 添加消息响应函数
3.4 BOOL CDialogProgress::OnInitDialog() { CDialog::OnInitDialog(); // TODO: Add extra initialization here m_Spin.SetRange(1,50); //给Spin控件设置数值范围 //把文本框的初始值设为1 GetDlgItem(IDC_EDIT)->SetWindowText("1"); m_Time.SetRange( 0, 10 ); //设置滑动的数值范围 m_Time.SetPos( 1 ); //设滑动控件的初始值设为1 m_Progress.SetRange( 0, 100 ); //设进度条的数值范围 return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE }
3.4 void CDialogProgress::OnProgressButton() { // TODO: Add your control notification handler code here CString temp; GetDlgItem(IDC_EDIT)->GetWindowText(temp); //得到文本框中的内容 int percent = atoi(temp); if( (percent<1) || (percent > 50) ) //判断文本框中的内容是否在设定的范围之内 MessageBox("输入的数据超出范围!","Waring",MB_ICONWARNING|MB_OK); GetDlgItem(IDC_EDIT)->SetFocus(); //把焦点设在文本框上 return; //中断程序的运行,返回 } int nPercent, nTime, nCurPos = 0; nPercent = m_Spin.GetPos(); //得到Spin控件的值 nTime = m_Time.GetPos(); //得到滑动条上当前的值 m_Progress.SetPos( 0 ); //设置进度条当前的位置为0 while( (nCurPos+=nPercent) < 100 ) m_Progress.OffsetPos( nPercent ); //在进度条上偏移nPercent位置 Sleep( 1000 * nTime / 10 ); //延迟一定的时间间隔 m_Progress.SetPos( 100 ); //设置进度条当前的位置为100 3.4
3.5 3.5 属性页对话框 概念 属性页对话框将多个对话框集中起来,通过标签或按钮来激活各个页面。主要分为一般属性页对话框和向导对话框两类。在一般属性页对话框中,页面的切换通过点击不同的标签实现,在向导对话框中,页面的选择是通过点击“上一页”(Back)、“下一页”(Next)、“完成”(Finish)和“取消”(Cance)等按钮实现的。 返回第3章
3.5 程序的实现步骤 在上一节程序的基础上 编辑对话框资源和创建对话框类 显示属性页对话框 实现对话框的功能
步骤1 编辑对话框资源 3.5 ID: IDD_TAB_DIALOG Caption: “Tab Dialog” 步骤1 编辑对话框资源 ID: IDD_TAB_DIALOG Caption: “Tab Dialog” Class: CDialogTab 添加控件: ID号 控 件 属 性 IDC_TAB Tab Control Border:选中 IDC_STATIC1 Static Tex t Caption:学生守则:\n 1 ...\n 2 ...\n 3 ...\n 4 ...\n ...... ,Client edge:选中 IDC_SCROLLBAR Vertical Scroll Bar IDC_STATIC2 Static Text Caption:市民公约:\n1 ...\n 2 ...\n 3 ...\n 4 ...\n ...... ,Client edge:选中 ID_BUTTON_CANCEL Button Caption:退出
步骤2 显示属性页对话框 3.5 1.在视类中包含对话框头文件 #include "DialogTab.h" 2.添加消息响应函数 步骤2 显示属性页对话框 1.在视类中包含对话框头文件 #include "DialogTab.h" 2.添加消息响应函数 void CDialogView::OnViewTab() { // TODO: Add your command handler code here CDialogTab dlg; dlg.DoModal(); }
步骤3 实现对话框的功能 3.5 1.添加控件关联变量 控件 变量类型 变量名 步骤3 实现对话框的功能 1.添加控件关联变量 控件 变量类型 变量名 IDC_SCROLLBAR CScrollBar m_ScrollBar IDC_TAB CTabCtrl m_Tab 2. 添加消息响应函数
3.5 BOOL CDialogTab::OnInitDialog() { CDialog::OnInitDialog(); // TODO: Add extra initialization here //对Tab控件进行初始化 TC_ITEM *m_pTCItem; m_pTCItem = new TC_ITEM; m_pTCItem->mask = TCIF_TEXT; //接收的值为文本 m_pTCItem->pszText = "学生守则"; //标签的名字 m_Tab.InsertItem(0,m_pTCItem); //插入一个新的标签 m_pTCItem->pszText = "市民公约"; m_Tab.InsertItem(1,m_pTCItem); //显示IDC_STATIC1、IDC_SCROLLBAR两个控件 GetDlgItem(IDC_STATIC1)->ShowWindow(SW_SHOW); GetDlgItem(IDC_SCROLLBAR)->ShowWindow(SW_SHOW); //隐藏IDC_STATIC2控件 GetDlgItem(IDC_STATIC2)->ShowWindow(SW_HIDE); //对滚动条进行初始化 m_ScrollBar.SetScrollRange(1,10); //设置滚动条的范围 m_ScrollBar.SetScrollPos(1); //设置当前滚动条的位置 return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } 3.5
3.5 void CDialogTab::OnSelchangeTab(NMHDR* pNMHDR, LRESULT* pResult) { // TODO: Add your control notification handler code here //当前Tab控件所选中的标签 if( m_Tab.GetCurSel() == 0 ) //显示IDC_STATIC1、IDC_SCROLLBAR两个控件 GetDlgItem(IDC_STATIC1)->ShowWindow(SW_SHOW); GetDlgItem(IDC_SCROLLBAR)->ShowWindow(SW_SHOW); //隐藏IDC_STATIC2控件 GetDlgItem(IDC_STATIC2)->ShowWindow(SW_HIDE); } else //隐藏IDC_STATIC1、IDC_SCROLLBAR两个控件 GetDlgItem(IDC_STATIC1)->ShowWindow(SW_HIDE); GetDlgItem(IDC_SCROLLBAR)->ShowWindow(SW_HIDE); //显示IDC_STATIC2控件 GetDlgItem(IDC_STATIC2)->ShowWindow(SW_SHOW); *pResult = 0; 3.5
3.5 void CDialogTab::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { // TODO: Add your message handler code here and/or call default //对滚动条进行重新定位 switch(nSBCode) case SB_THUMBPOSITION: //滚动的绝对位置 pScrollBar->SetScrollPos(nPos); //设置滚动条的位置 break; } case SB_LINEUP: //单击滚动条的上箭头 //把滚动条设置为当前位置减1的位置 pScrollBar->SetScrollPos(pScrollBar->GetScrollPos() - 1); case SB_LINEDOWN: //单击滚动条的下箭头 //把滚动条设置为当前位置加1的位置 pScrollBar->SetScrollPos(pScrollBar->GetScrollPos() + 1); case SB_PAGEUP: //单击滚动条当前位置的上面 //把滚动条设置为当前位置减5的位置 pScrollBar->SetScrollPos(pScrollBar->GetScrollPos() - 5); case SB_PAGEDOWN: //单击滚动条当前位置的下面 //把滚动条设置为当前位置加5的位置 pScrollBar->SetScrollPos(pScrollBar->GetScrollPos() + 5); CDialog::OnVScroll(nSBCode, nPos, pScrollBar);
3.6 3.6 使用通用对话框 概念 在MFC中,提供了一些通用对话框类来实现Windows系统提供的通用对话框,包括文件对话框、颜色对话框、字体对话框、打印对话框和查找与替换对话框等,这些通用对话框类都是从CCommonDialog类派生出来的。对于每个通用对话框,都可以实现相应的特定功能。 返回第3章
3.6 程序的实现步骤 在上一节程序的基础上 编辑对话框资源和创建对话框类 显示对话框 实现对话框的功能
步骤1 编辑对话框资源 3.6 ID: IDD_COMMON_DIALOG Caption: “Common Dialog” 步骤1 编辑对话框资源 ID: IDD_COMMON_DIALOG Caption: “Common Dialog” Class: CDialogCommon 添加控件: ID号 控 件 属 性 IDC_STATIC Static Text Caption:请选择一个文本文件 IDC_EDIT Edit Box Read-only:选中 IDC_OPEN_BUTTON Button Caption:打开 ID_QUIT Caption:退出
步骤2 显示对话框 3.6 1.在视类中包含对话框头文件 #include "DialogCommon.h" 2.添加消息响应函数 步骤2 显示对话框 1.在视类中包含对话框头文件 #include "DialogCommon.h" 2.添加消息响应函数 void CDialogView::OnViewCommondialog() { // TODO: Add your command handler code here CDialogCommon dlg; dlg.DoModal(); }
步骤3 实现对话框的功能 3.6 void CDialogCommon::OnOpenButton() { 步骤3 实现对话框的功能 void CDialogCommon::OnOpenButton() { // TODO: Add your control notification handler code here //声明一个CFileDialog对象,并设置他的格式 CFileDialog cdlg(true, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, "text file(*.txt)|*.txt|All file(*.*)|*.*||", this); if(cdlg.DoModal() == IDOK) //单击OK按钮 //从文件对话框中取得文件名并显示在文本框中 GetDlgItem(IDC_EDIT)->SetWindowText(cdlg.GetPathName()); UpdateData(false); //更新 }
3.6 void CDialogCommon::OnQuit() { // TODO: Add your control notification handler code here OnOK(); } 返回第3章