960 likes | 1.1k Views
第 六 章 对话框与控件. VC++ 系统开发. 河北经贸大学 信息技术学院. 本章导读. 本章通过开发一个计算器和口令对话框程序,掌握 Button 、 Edit Box 和 Static Text 控件的使用方法 其他常用控件的使用技巧 , 如 List Control 基于对话框的应用程序的编程技术 模式对话框、非模式对话框和通用对话框的设计与调用。. 本章主要内容. 通用对话框 常用控件介绍 MyCalculator 程序 开发 MyCalculator 程序 口令对话框. 6.1 对话框概述. 对话框 对话框编辑器 对话框编程
E N D
第六章对话框与控件 VC++系统开发 河北经贸大学 信息技术学院
本章导读 • 本章通过开发一个计算器和口令对话框程序,掌握Button、Edit Box和Static Text控件的使用方法 • 其他常用控件的使用技巧,如List Control • 基于对话框的应用程序的编程技术 • 模式对话框、非模式对话框和通用对话框的设计与调用。
本章主要内容 通用对话框 常用控件介绍 MyCalculator程序 开发MyCalculator程序 口令对话框
6.1 对话框概述 • 对话框 • 对话框编辑器 • 对话框编程 • 控件的创建与使用
6.1.1 对话框 P154 • 可视化的界面,包含:按钮、文本框、复选框等。 • 对话框是一个窗口,控件也是一个窗口 • 对话框的两种消息: WM_INITDIALOG:数据成员的初始化 WM_COMMAND:控件的消息 • MFC对对话框的支持:对话框从CDialog基类中派生一个类, MFC的CDialog类封装了用于对话框的显示、关闭等常用操作的许多功能函数;MFC程序框架;ClassWizard类向导 • 公共对话框: P154表6-1 • 对话框控件及其CWnd成员函数 表6-2/表6-3 • 模式对话框和无模式对话框
对话框的类型P156 • 1.模式对话框 弹出后,用户必须作出相应得操作,否则不可以继续。 用途广。 • 2.无模式对话框 弹出后,一直保留在屏幕上,其他操作可继续,用的时候激活对话框即可。 两者的终止函数不一样: Cdialog::EndDialog------模式 CWnd::DestroyWindow-----无模式 所占内存空间不同: 模式对话框: 由系统自动分配内存,当对话框退出时,对话框对象自动删除。 无模式对话框: 则需要用户来指定内存,退出时用户删除对话框对象
6.1.2 使用对话框编辑器 • 添加、选取、删除对话框控件; • 改变控件的Tab键次序; • 利用基准线、标尺及布局工具进行控件的布局; • 测试所编辑的对话框的性能。
对话框编程步骤p160-164 • 添加对话框资源 在单文档项目MyHello中,Insert-〉resourc(ctrl+R)-〉Dialog • 编辑对话框属性 • 向对话框内添加控件 ——添加/选取/控件的布局/测试对话框 • 使用ClassWizard,为对话框资源创建一个新类CMyDlg,为控件进行消息映射 afx_msg void OnButton1(); //向导完成 ON_BN_CLICKED(IDC_BUTTON1, OnButton1) //向导完成 • 在OnButton1()中添加用户代码 MessageBox("欢迎进入对话框的设计!"); • 在程序(MyHello.cpp)中使用模式对话框 #include “MyDlg.h” CMyDlg Dlg; // MyHelloApp::InitInstance() Dlg.DoModal();
6.1.4 控件的创建与使用p164-168 步骤如下: • 将控件添加到对话框模板中 • 在对话框类中增加与控件相关联的数据成员 • 根据需要在对话框类中定义处理这些数据的成员变量 • 在对话框的OnInitDialog函数体中,为控件设置一些初始条件 m_MyBtn.SetWindowText("欢迎"); • 在对话框的控件消息处理函数中,添加控件处理代码
访问控件 P168 • 关联变量------ClassWizard添加 控件变量——控件类对象,一个窗口对象 m_MyBtn.SetWindowText(“这是一个命令按钮”); 值变量——普通类型CString、int… • DDX对话数据交换与DDV对话数据验证 UpdateData(TRUE); //对于值变量,控件中的值传递变量 UpdateData(FALSE); • 控件窗口指针 CEdit *pEdFirst=(CEdit *) GetDlgItem(ID_FIRSTNAME); 例如 DDX_Text(pDX, IDC_PASSWORD_EDIT, m_password)
综合示例一 ----模式对话框与无模式对话框的编程(口令对话框) • 为MyHello程序添加”口令”对话框
预备知识 1.对话框类型 • 对话框是实现人机交互的重要手段,对话框不但可以接收消息,而且可以被移动和关闭. • 无模式对话框 • 模式对话框 允许用户在该对话框与应用程序其他窗口之间的切换 不允许用户在关闭对话框之前切换到应用程序的其他窗口
对话框设计方法 • 创建对话框资源,并添加各种所需控件; • 创建对话框类(CDialog)的派生类,并将其与已创建的对话框资源相连接; • 在派生类中添加所需的数据成员变量、数据交换函数(DDX)和数据验证函数(DDV) ; • 为对话框各控件添加消息响应函数,编写程序代码; • 为对话框的调用者添加对话框的调用。
数据交换和验证 2 运行对话框,修改文档对象 4 创建对话框模板 1 定义对话框类和公有成员变量 3 Public: 数据成员 文档对象 xxxxxxx xxxxxxx xxxxxxx xxxxxxx 对话框设计方法 对话框的工作原理 休息
对话框的调用 • 调用模式对话框 • CPasswordDialog m_Dlg;//声明对话框对象 • m_Dlg.DoModal();//显示模态对话框 • 用户必须单击”确定(OK)“或”取消(Cancel)”才能切换到其它窗口或对话框。
调用非模式对话框 • 在视图类的头文件中添加CPasswordDialog的指针变量:CPasswordDialog *m_Dlg; //指针 • 在视图类的构造函数中将其初始化m_Dlg=NULL; • 在调用函数中添加如下代码if(m_Dlg==NULL){m_Dlg=new CPasswordDialog;// 动态创建m_Dlg->Create(IDD_PASSWORD_DIALOG,this);}m_Dlg->ShowWindow(SW_SHOW);//显示非模态对话框 对话框的调用
编辑对话框资源 • Button ID: IDOK ; Caption: 确认 • Button ID: IDCANCEL ; Caption: 取消 • Static Text: ID : IDC_STATIC Caption: 请输入口令:
创建“口令”对话框类-----类向导 • 创建对话框类 右键单击对话框→Class Wizard →Adding Class对话框 →Create a new className:CPasswordDialogBase class:CDialogDialogID: IDD_PASSWORD_DIALOG • 创建了一个类(CPasswordDialog),两个文件(PasswordDialog.h和PasswordDialog.cpp)
为编辑框引入变量 • “Member Variable”标签页Class name:CPasswordDialogControl IDs:IDC_PASSWORD_EDIT • 单击”Add Variable……”,显示Add Member Variable对话框 • Variable name:m_Password • Category: Value • Variable type:CString 创建: DDX_Text(pDX, IDC_PASSWORD_EDIT, m_password)
调用“口令”对话框 修改应用程序类的InitInstance()函数 BOOL CMyHelloApp::InitInstance() { …… CPasswordDialog Dlg; //声明CPasswordDialog类的对象 if(Dlg.DoModal() != IDOK) return false;//用户按下的不是"确认"按钮 if(Dlg.m_Password != "123456") //口令设为字符串"123456" {AfxMessageBox("口令错误,确认后将退出程序"); return false; } return TRUE; } 模式对话框的调用 在MyHello.cpp头部加入包含语句#include”PasswordDialog.h”
显示非模式对话框 • 例如,在MyHello程序中,添加一菜单项,当点击该菜单项时,将口令对话框以非模式显示: • 编辑菜单ID:ID_MODALLESSCaption:非模式对话框
在视图类的头文件中添加CPasswordDialog的指针变量在视图类的头文件中添加CPasswordDialog的指针变量 • CPasswordDialog *m_pModallessDlg; • 需要在MyHelloView.h中加入: • #include "PasswordDialog.h" • 修改视图类的构造函数和析构函数 • 构造函数:m_pModallessDlg=NULL; • //初始化指针 • 析构函数:if(m_pModallessDlg!=NULL) • delete m_pModallessDlg;//释放空间 或者: if(m_pModallessDlg!=NULL){ m_pModallessDlg->DestroyWindow(); m_pModallessDlg=NULL; }
编写调用非模式对话框代码 • “View/ClassWizard/MFC ClassWizard” • Object IDS:ID_NOMODALLESS • Class name:CMyHelloView • Messages:COMMAND • 添加了消息响应函数”OnModalless()”,单击”Edit Code” • 编写代码如下: • if(m_pModallessDlg==NULL) • {m_pModallessDlg=new CPasswordDialog;// 动态创建 • m_pModallessDlg->Create(IDD_DIALOG1,this);} • m_pModallessDlg->ShowWindow(SW_SHOW);//显示非模态对话框
技术要点总结: • 对话框控件和相关MFC类(P155,表6-2) • 用于对话框控件的CWnd成员函数(P155,表6-3) • 对话框编辑器 • 控件工具箱:”右击工具栏/control”“Tools/Customize…/ToolsBars/Control” • 修改控件的Tab键次序:”编排(Layout)/Tab Order”;或Ctrl+D按新的次序依此用鼠标单击各个控件,新的Tab键次序即可生成. • 控件布局工具栏:P159,图6-5,设置Layout/Guide Setings • 测试对话框:Ctrl+T
改变对话框属性(P161) 技术要点 对话框左上角在父窗口中的坐标(居中) • 为控件设置初始条件(P165(4))在对话框的OnInitDialog函数体中,为控件设置初始条件 • 按钮控件的属性说明(P167) • 消息对话框(P204)
6.2 windows 标准控件 CStatic类控件的使用 CEdit类控件的使用 CButton类控件的使用 CListBox类控件的使用 CComBox类控件的使用
windows 标准控件 • 属性 • 方法 • 事件 • 对话框类的成员变量-控件关联变量 • value • Control
访问控件的两种方法 • 采用控件关联变量 值变量 m_iA=10; UpdateData(false); 控件变量 m_EditA.SetWindowText(“10”); • 获取控件窗口指针 CEdit* pEditName=GetDlgItem(IDC_NAME); pEditName->SetWindowText(“ZHANG”); SetDlgItemText(IDC_NAME, m_Name); GetDlgItemText(IDC_NAME, m_Name);
1. CStatic类控件的使用 • Static Text:静态文本——作为标签 • Group Box:分组框——框架 • Pictrue:静态图片——显示位图或分割其他控件 • 默认ID为IDC_STATIC • 只有CStatic类控件的ID号可以重复 详见P169
为对话框添加背景图片 为对话框设置一幅背景图(Bitmap)有几种最常用的方法: • 使用Picture控件:方法简单,一定保证TabOrder为1 • 映射WM_CTLCOLOR消息,在OnCtlColor函数中返回一个图形刷子: • 映射WM_PAINT消息,在OnPaint函数中选入位图
Picture控件 WM_PAINT WM_CTLCOLOR
CBitmapBKDlg::CBitmapBKDlg(CWnd* pParent /*=NULL*/): CDialog(CBitmapBKDlg::IDD, pParent) { …….. CBitmap* pBitmap = new CBitmap; // ASSERT(pBitmap); pBitmap->LoadBitmap(IDB_BACKGROUD); m_BKBrush.CreatePatternBrush(pBitmap); delete pBitmap; } 利用对话框的OnCtlColor() CTLCOLOR_BTN CTLCOLOR_DLG CTLCOLOR_EDIT CTLCOLOR_LISTBOX CTLCOLOR_MSGBOX CTLCOLOR_SCRLLBAR CTLCOLOR_STATIC Private: CBrush m_BKBrush HBRUSH CBitmapBKDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { if (nCtlColor == CTLCOLOR_DLG ) return (HBRUSH)m_BKBrush.GetSafeHandle(); return CDialog::OnCtlColor(pDC,pWnd,nCtlColor); }
利用对话框的OnPaint() void CxxxDlg::OnPaint() { CPaintDC dc(this); // device context for painting CRect rc; GetClientRect(&rc); //获取客户窗口区域 CBitmap *BackBitmap=new CBitmap; //背景位图 BackBitmap->LoadBitmap(IDB_BITMAP1); CDC * m_dc=new CDC; //内存设备环境 m_dc->CreateCompatibleDC(&dc); //兼容 m_dc->SelectObject(BackBitmap); //位图选入环境 dc.BitBlt(0,0,rc.right,rc.bottom,m_dc,0,0,SRCCOPY); delete m_dc; //释放 delete BackBitmap; //释放 }
CDC绘图操作 • CDC::BitBlt从源设备环境拷贝一幅位图到当前设备环境 • BOOL BitBlt ( int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, DWORD dwRop ); • CDC::StretchBlt从源设备环境(矩形)拷贝一幅位图到当前设备环境(矩形),如果必要,延伸或压缩 • BOOLStretchBlt(intx,inty,intnWidth,intnHeight,CDC*pSrcDC,intxSrc,intySrc,intnSrcWidth,intnSrcHeight,DWORDdwRop);
2. CEdit类控件的使用 • 用来输入和编辑文本 • 单行文本 • 多行文本 Multiline • 口令 详见P170
CEdit类控件的属性 • Multiline • Number • Want return • Password • Read-only • Uppercase • Lowercase
CEdit类控件的方法 • 口令设置: SetPasswordChar(#); • 选择文本 • 输入/输出文本 -----DDX技术,为编辑框添加值变量,通过使用UpdateData()完成控件与变量之间的数据传送。 ------定义CEdit类的对象或对象指针(P168) CWnd::SetWindowText(); CWnd:: GetWindowText();
CanUndo() Clear() Copy() Cut() EmptyUndoBuffer() GetFirstVisibleLine() GetModify() GetPasswordChar() GetRect() GetSel() LimitText() LineFromChar() LineLength() LineScroll() Paste() ReplaceSel() SetModify() SetPasswordChar() SetReadOnly() SetSel() Undo() CEdit类控件的方法
CEdit类控件的事件 (P171表6-11) • EN_CHANGE • EN_ERRSPACE • EN_HSCROLL • EN_KILLFOCUS • EN_MAXTEXT • EN_SETFOCUS • EN_UPDATE • EN_VSCROLL
3. CButton类控件的使用(P171) • 命令按钮(Pushbuttons) • 单选按钮(Radiobuttons) • 复选按钮(Checkboxes)
命令按钮 • 事件: • BN_CLICKED • 方法: • SetWindowText(字符串) • ShowWindow(SW_SHOW/ SW_HIDE); • EnableWindow(false/true); 例6-1 p172
一元二次方程求解 void CEx6_2Dlg::OnButton1() { // TODO: Add your control notification handler code here UpdateData(); int disc; double re,im; disc=m_B*m_B-4*m_A*m_C; re=(double)-m_B/(2*m_A); im=(double)sqrt(abs(disc))/(2*m_A); if(disc>=0) { m_X1.Format("X1=%6.2f",re+im); m_X2.Format("X2=%6.2f",re-im); } else { m_X1.Format("X1=%6.2f+%6.2f i", re,im); m_X2.Format("X2=%6.2f-%6.2f i", re,im); } UpdateData(FALSE); }
单选按钮 • 属性: • Group:与Tab order 管理一组控件 • 事件 • BN_CLICKED • 检查是否选中的方法 (1)IsDlgButtonChecked(ID) (2)连接变量的值:0,1,2,3... .. 注意事项:P172(1)(2)(3)
复选框 • 属性 • 事件 • 检查是否选中的方法 (1)IsDlgButtonChecked(ID) (2)连接变量的值: true/false • 例6-2(P174)
综合示例二-----一个简单的整数计算器 • 一个简单的整数运算计算器(演示)
编辑框与按钮类控件作业 一个功能较丰富的计算器程序设计 演示 休息
开发MyCalculator程序 用VC++6.0编写MFC应用程序,一般有三个步骤: • 创建工程:使用MFC AppWizard创建应用程序的基本框架; • 可视化设计:制做Windows风格的图形用户界面和各种控件; • 编写程序代码。
一、创建工程 • “File/New/Projects/MFC AppWizard[exe]/工程名:MyCalculator,位置:E:\MyVC\ch6” • “选择Dialog based/Next,标题:计算器“,其它接受默认设置; • ”Finish”完成
二、可视化设计 • “Project Workspace”窗口,选择“Resource View”标签,双击Dialog下的“IDD_MYCALCULATOR_DIALOG” • 从“IDD_MYCALCULATOR_DIALOG”对话框删除“OK” 和“ Cancel”及“TODO文本” 。 • 弹出控件工具箱(右击工具栏,选择Controls); • 向对话框添加按钮(Button)控件; • 右击Button1,选择属性
1.可视化设计 • 类似方法按右表定义,编辑对话框资源。设计结果如下图: