1 / 96

第 六 章 对话框与控件

第 六 章 对话框与控件. VC++ 系统开发. 河北经贸大学 信息技术学院. 本章导读. 本章通过开发一个计算器和口令对话框程序,掌握 Button 、 Edit Box 和 Static Text 控件的使用方法 其他常用控件的使用技巧 , 如 List Control 基于对话框的应用程序的编程技术 模式对话框、非模式对话框和通用对话框的设计与调用。. 本章主要内容. 通用对话框 常用控件介绍 MyCalculator 程序 开发 MyCalculator 程序 口令对话框. 6.1 对话框概述. 对话框 对话框编辑器 对话框编程

zanna
Download Presentation

第 六 章 对话框与控件

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第六章对话框与控件 VC++系统开发 河北经贸大学 信息技术学院

  2. 本章导读 • 本章通过开发一个计算器和口令对话框程序,掌握Button、Edit Box和Static Text控件的使用方法 • 其他常用控件的使用技巧,如List Control • 基于对话框的应用程序的编程技术 • 模式对话框、非模式对话框和通用对话框的设计与调用。

  3. 本章主要内容 通用对话框 常用控件介绍 MyCalculator程序 开发MyCalculator程序 口令对话框

  4. 6.1 对话框概述 • 对话框 • 对话框编辑器 • 对话框编程 • 控件的创建与使用

  5. 6.1.1 对话框 P154 • 可视化的界面,包含:按钮、文本框、复选框等。 • 对话框是一个窗口,控件也是一个窗口 • 对话框的两种消息: WM_INITDIALOG:数据成员的初始化 WM_COMMAND:控件的消息 • MFC对对话框的支持:对话框从CDialog基类中派生一个类, MFC的CDialog类封装了用于对话框的显示、关闭等常用操作的许多功能函数;MFC程序框架;ClassWizard类向导 • 公共对话框: P154表6-1 • 对话框控件及其CWnd成员函数 表6-2/表6-3 • 模式对话框和无模式对话框

  6. 对话框的类型P156 • 1.模式对话框 弹出后,用户必须作出相应得操作,否则不可以继续。 用途广。 • 2.无模式对话框 弹出后,一直保留在屏幕上,其他操作可继续,用的时候激活对话框即可。 两者的终止函数不一样: Cdialog::EndDialog------模式 CWnd::DestroyWindow-----无模式 所占内存空间不同: 模式对话框: 由系统自动分配内存,当对话框退出时,对话框对象自动删除。 无模式对话框: 则需要用户来指定内存,退出时用户删除对话框对象

  7. 6.1.2 使用对话框编辑器 • 添加、选取、删除对话框控件; • 改变控件的Tab键次序; • 利用基准线、标尺及布局工具进行控件的布局; • 测试所编辑的对话框的性能。

  8. 对话框编程步骤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();

  9. 6.1.4 控件的创建与使用p164-168 步骤如下: • 将控件添加到对话框模板中 • 在对话框类中增加与控件相关联的数据成员 • 根据需要在对话框类中定义处理这些数据的成员变量 • 在对话框的OnInitDialog函数体中,为控件设置一些初始条件 m_MyBtn.SetWindowText("欢迎"); • 在对话框的控件消息处理函数中,添加控件处理代码

  10. 访问控件 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)

  11. 综合示例一 ----模式对话框与无模式对话框的编程(口令对话框) • 为MyHello程序添加”口令”对话框

  12. 预备知识 1.对话框类型 • 对话框是实现人机交互的重要手段,对话框不但可以接收消息,而且可以被移动和关闭. • 无模式对话框 • 模式对话框 允许用户在该对话框与应用程序其他窗口之间的切换 不允许用户在关闭对话框之前切换到应用程序的其他窗口

  13. 对话框设计方法 • 创建对话框资源,并添加各种所需控件; • 创建对话框类(CDialog)的派生类,并将其与已创建的对话框资源相连接; • 在派生类中添加所需的数据成员变量、数据交换函数(DDX)和数据验证函数(DDV) ; • 为对话框各控件添加消息响应函数,编写程序代码; • 为对话框的调用者添加对话框的调用。

  14. 数据交换和验证 2 运行对话框,修改文档对象 4 创建对话框模板 1 定义对话框类和公有成员变量  3 Public: 数据成员 文档对象 xxxxxxx xxxxxxx xxxxxxx xxxxxxx 对话框设计方法 对话框的工作原理 休息

  15. 对话框的调用 • 调用模式对话框 • CPasswordDialog m_Dlg;//声明对话框对象 • m_Dlg.DoModal();//显示模态对话框 • 用户必须单击”确定(OK)“或”取消(Cancel)”才能切换到其它窗口或对话框。

  16. 调用非模式对话框 • 在视图类的头文件中添加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);//显示非模态对话框 对话框的调用

  17. 编辑对话框资源 • Button ID: IDOK ; Caption: 确认 • Button ID: IDCANCEL ; Caption: 取消 • Static Text: ID : IDC_STATIC Caption: 请输入口令:

  18. 创建“口令”对话框类-----类向导 • 创建对话框类 右键单击对话框→Class Wizard →Adding Class对话框 →Create a new className:CPasswordDialogBase class:CDialogDialogID: IDD_PASSWORD_DIALOG • 创建了一个类(CPasswordDialog),两个文件(PasswordDialog.h和PasswordDialog.cpp)

  19. 为编辑框引入变量 • “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)

  20. 调用“口令”对话框 修改应用程序类的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”

  21. 显示非模式对话框 • 例如,在MyHello程序中,添加一菜单项,当点击该菜单项时,将口令对话框以非模式显示: • 编辑菜单ID:ID_MODALLESSCaption:非模式对话框

  22. 在视图类的头文件中添加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; }

  23. 编写调用非模式对话框代码 • “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);//显示非模态对话框

  24. 技术要点总结: • 对话框控件和相关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

  25. 改变对话框属性(P161) 技术要点 对话框左上角在父窗口中的坐标(居中) • 为控件设置初始条件(P165(4))在对话框的OnInitDialog函数体中,为控件设置初始条件 • 按钮控件的属性说明(P167) • 消息对话框(P204)

  26. 6.2 windows 标准控件 CStatic类控件的使用 CEdit类控件的使用 CButton类控件的使用 CListBox类控件的使用 CComBox类控件的使用

  27. windows 标准控件 • 属性 • 方法 • 事件 • 对话框类的成员变量-控件关联变量 • value • Control

  28. 访问控件的两种方法 • 采用控件关联变量 值变量 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);

  29. 1. CStatic类控件的使用 • Static Text:静态文本——作为标签 • Group Box:分组框——框架 • Pictrue:静态图片——显示位图或分割其他控件 • 默认ID为IDC_STATIC • 只有CStatic类控件的ID号可以重复 详见P169

  30. 为对话框添加背景图片 为对话框设置一幅背景图(Bitmap)有几种最常用的方法: • 使用Picture控件:方法简单,一定保证TabOrder为1 • 映射WM_CTLCOLOR消息,在OnCtlColor函数中返回一个图形刷子: • 映射WM_PAINT消息,在OnPaint函数中选入位图

  31. Picture控件 WM_PAINT WM_CTLCOLOR

  32. 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); }

  33. 利用对话框的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; //释放 }

  34. 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);

  35. 2. CEdit类控件的使用 • 用来输入和编辑文本 • 单行文本 • 多行文本  Multiline • 口令 详见P170

  36. CEdit类控件的属性 • Multiline • Number • Want return • Password • Read-only • Uppercase • Lowercase

  37. CEdit类控件的方法 • 口令设置: SetPasswordChar(#); • 选择文本 • 输入/输出文本 -----DDX技术,为编辑框添加值变量,通过使用UpdateData()完成控件与变量之间的数据传送。 ------定义CEdit类的对象或对象指针(P168) CWnd::SetWindowText(); CWnd:: GetWindowText();

  38. CanUndo() Clear() Copy() Cut() EmptyUndoBuffer() GetFirstVisibleLine() GetModify() GetPasswordChar() GetRect() GetSel() LimitText() LineFromChar() LineLength() LineScroll() Paste() ReplaceSel() SetModify() SetPasswordChar() SetReadOnly() SetSel() Undo() CEdit类控件的方法

  39. CEdit类控件的事件 (P171表6-11) • EN_CHANGE • EN_ERRSPACE • EN_HSCROLL • EN_KILLFOCUS • EN_MAXTEXT • EN_SETFOCUS • EN_UPDATE • EN_VSCROLL

  40. 3. CButton类控件的使用(P171) • 命令按钮(Pushbuttons) • 单选按钮(Radiobuttons) • 复选按钮(Checkboxes)

  41. 命令按钮 • 事件: • BN_CLICKED • 方法: • SetWindowText(字符串) • ShowWindow(SW_SHOW/ SW_HIDE); • EnableWindow(false/true); 例6-1 p172

  42. 一元二次方程求解 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); }

  43. 单选按钮 • 属性: • Group:与Tab order 管理一组控件 • 事件 • BN_CLICKED • 检查是否选中的方法 (1)IsDlgButtonChecked(ID) (2)连接变量的值:0,1,2,3... .. 注意事项:P172(1)(2)(3)

  44. 复选框 • 属性 • 事件 • 检查是否选中的方法 (1)IsDlgButtonChecked(ID) (2)连接变量的值: true/false • 例6-2(P174)

  45. 综合示例二-----一个简单的整数计算器 • 一个简单的整数运算计算器(演示)

  46. 编辑框与按钮类控件作业 一个功能较丰富的计算器程序设计 演示 休息

  47. 开发MyCalculator程序 用VC++6.0编写MFC应用程序,一般有三个步骤: • 创建工程:使用MFC AppWizard创建应用程序的基本框架; • 可视化设计:制做Windows风格的图形用户界面和各种控件; • 编写程序代码。

  48. 一、创建工程 • “File/New/Projects/MFC AppWizard[exe]/工程名:MyCalculator,位置:E:\MyVC\ch6” • “选择Dialog based/Next,标题:计算器“,其它接受默认设置; • ”Finish”完成

  49. 二、可视化设计 • “Project Workspace”窗口,选择“Resource View”标签,双击Dialog下的“IDD_MYCALCULATOR_DIALOG” • 从“IDD_MYCALCULATOR_DIALOG”对话框删除“OK” 和“ Cancel”及“TODO文本” 。 • 弹出控件工具箱(右击工具栏,选择Controls); • 向对话框添加按钮(Button)控件; • 右击Button1,选择属性

  50. 1.可视化设计 • 类似方法按右表定义,编辑对话框资源。设计结果如下图:

More Related