第 六 章 对话框与控件

104

Click here to load reader

Upload: milos

Post on 10-Jan-2016

114 views

Category:

Documents


10 download

DESCRIPTION

第 六 章 对话框与控件. VC++ 实用教程. 河北经贸大学 信息技术学院 2008.9. 教学目标. ◆掌握常用控件的使用方法; ◆掌握模式对话框与非模式对话框的创建与使用; ◆了解通用对话框的使用方法; ◆了解系统的集成方法; ◆熟练掌握基于模式对话框的应用程序的编程方法和步骤。. 本章主要内容. 4.1 对话框概述 4.2 静态控件 4.3 编辑框 4.4 按钮类 4.5 列表框控件 4.6 列表视图( CListCtrl )控件 4.7 组合框 (CComboBox) 控件 4.8 滚动类控件 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 第 六 章 对话框与控件

1

休息 4 对话框与控件 中国铁道出版社 前一页

第六章 第六章 对话框与控件对话框与控件河北经贸大学信息技术学院2008.9

VC++实用教程

Page 2: 第 六 章 对话框与控件

2

休息 前一页 4 对话框与控件  中国铁道出版社

教学目标◆ 掌握常用控件的使用方法;◆ 掌握模式对话框与非模式对话框的创建与使用;◆ 了解通用对话框的使用方法;◆ 了解系统的集成方法;◆ 熟练掌握基于模式对话框的应用程序的编程方法和步骤。

Page 3: 第 六 章 对话框与控件

3

休息 4 对话框与控件 中国铁道出版社 前一页

本章主要内容本章主要内容4.1 对话框概述4.2 静态控件4.3 编辑框4.4 按钮类4.5 列表框控件4.6 列表视图( CListCtrl )控件4.7 组合框 (CComboBox) 控件4.8 滚动类控件4.9 通用对话框和消息对话框习题四实验指导四

Page 4: 第 六 章 对话框与控件

4

休息 前一页 4 对话框与控件  中国铁道出版社

4.1 4.1 对话框概述对话框概述 对话框对话框 对话框编辑器对话框编辑器 对话框编程对话框编程 控件的创建与使用控件的创建与使用 访问控件访问控件

Page 5: 第 六 章 对话框与控件

5

休息 前一页 4 对话框与控件  中国铁道出版社

4.1.1 4.1.1 对话框对话框 可视化的界面,包含可视化的界面,包含 :: 按钮、文本框、复选框等。按钮、文本框、复选框等。 对话框是一个窗口,控件也是一个窗口对话框是一个窗口,控件也是一个窗口 对话框的两种消息:对话框的两种消息: WM_INITDIALOG:WM_INITDIALOG: 数据成员的初始化数据成员的初始化 WM_COMMANDWM_COMMAND :控件的消息:控件的消息 MFCMFC 对对话框的支持:对对话框的支持:对话框从对话框从 CDialogCDialog 基类中派生一个类, 基类中派生一个类,

MFCMFC 的的 CDialogCDialog 类封装了用于对话框的显示、关闭等常用操作的许类封装了用于对话框的显示、关闭等常用操作的许多功能函数;多功能函数; MFCMFC 程序框架;程序框架; ClassWizardClassWizard 类向导类向导

公共对话框公共对话框 : P103 : P103 表表 4-14-1 标准对话框控件 表标准对话框控件 表 4-24-2 用于对话框控件的 用于对话框控件的 CWndCWnd 成员函数 表成员函数 表 4-34-3 模式对话框和无模式对话框模式对话框和无模式对话框

Page 6: 第 六 章 对话框与控件

6

休息 前一页 4 对话框与控件  中国铁道出版社

对话框的类型对话框的类型 1. 模式对话框 弹出后,用户必须作出相应得操作,否则不可以继续。 用途广。 2. 无模式对话框 弹出后,一直保留在屏幕上,其他操作可继续,用的时候激活对话框即可。

两者的创建与显示方式不同:CPasswordDlg dlg1; Dlg1.DoModal () ;—— 模式CPasswordDlg *pDlg; pDlg->Create(IDD_DIALOG1,this); pDlg-> ShowWindow(true);—— 无模式两者的终止函数不一样: Cdialog::EndDialog------ 模式 CWnd::DestroyWindow----- 无模式 所占内存空间不同 :模式对话框 : 由系统自动分配内存,当对话框退出时,对话框对象自动删除。无模式对话框 : 则需要用户来指定内存,退出时用户删除对话框对象

Page 7: 第 六 章 对话框与控件

7

休息 前一页 4 对话框与控件  中国铁道出版社

4.1.2 4.1.2 对话框编辑器对话框编辑器 添加、选取、删除对话框控件; 改变控件的 Tab 键次序; 利用基准线、标尺及布局工具进行控件的布

局; 测试所编辑的对话框的性能。

Page 8: 第 六 章 对话框与控件

8

休息 前一页 4 对话框与控件  中国铁道出版社

对话框编程示例对话框编程示例 ---- 口令对话框

Page 9: 第 六 章 对话框与控件

9

休息 前一页 4 对话框与控件  中国铁道出版社

4.1.3 4.1.3 对话框编程对话框编程 1. 添加对话框资源 在单文档项目 Ex4-1中, Insert- 〉 resourc ( ctrl+R ) - 〉 Dialog 2. 编辑对话框属性 3. 向对话框内添加控件 —— 添加 / 选取 / 控件的布局 / 测试对话框 4. 使用 ClassWizard, 为对话框资源创建一个新类 CPasswordDialog 为控件 IDC_EDIT1 关联成员变量 CString m_Password

5. 在程序( Ex4_1.cpp )中使用模式对话框 #include "PasswordDialog.h“ bool CEx4_1App ::InitInstance () { …… CPasswordDialog Dlg; // 声明 CPasswordDialog 类的对象 if ( Dlg.DoModal() != IDOK ) return false; // 用户按下的不是 " 确认 " 按钮 if ( Dlg.m_Password != "123456" ) // 口令设为字符串 "123456" { AfxMessageBox(" 口令错误,确认后将退出程序 "); return false; } Return true; } 6. 编译运行

Page 10: 第 六 章 对话框与控件

10

休息 前一页 4 对话框与控件  中国铁道出版社

4.1.4 4.1.4 控件的创建与使用控件的创建与使用步骤如下: 将控件添加到对话框模板中 在对话框类中增加与控件相关联的数据成员 根据需要在对话框类中定义处理这些数据的成员变量 在对话框的 OnInitDialog 函数体中,为控件设置一些

初始条件 在对话框的控件消息处理函数中,添加控件处理代码

Page 11: 第 六 章 对话框与控件

11

休息 前一页 4 对话框与控件  中国铁道出版社

2. 控件的通用属性

Page 12: 第 六 章 对话框与控件

12

休息 前一页 4 对话框与控件  中国铁道出版社

3. 控件的消息 WM_COMMAND MSG 结构 typedef struct tagMSG{ HWND hwnd; // 接收到消息的窗口句柄 UINT message; .// 消息 WPARAM wParam; // 消息的附加信息,其含义取决于 message LPARAM lParam; // 消息的附加信息,其含义取决于 message DWORD time; // 消息发送时的时间 POINT pt; // 消息发送时,光标的屏幕坐标 }MSG;

Page 13: 第 六 章 对话框与控件

13

休息 前一页 4 对话框与控件  中国铁道出版社

4.1.5 访问控件 关联变量 ------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)

Page 14: 第 六 章 对话框与控件

14

休息 前一页 4 对话框与控件  中国铁道出版社

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

Page 15: 第 六 章 对话框与控件

15

休息 4 对话框与控件 中国铁道出版社 前一页

4.2 CStatic 类控件

静态控件概述 静态控件属性

Page 16: 第 六 章 对话框与控件

16

休息 前一页 4 对话框与控件  中国铁道出版社

1. CStatic 类控件的概述 Static Text: 静态文本——作为标签 Group Box :分组框——框架 Pictrue :静态图片——显示位图、图标或分割

其他控件 默认 ID 为 IDC_STATIC 只有 CStatic 类控件的 ID 号可以重复

Page 17: 第 六 章 对话框与控件

17

休息 前一页 4 对话框与控件  中国铁道出版社

静态图片控件的 General 属性对话框

Page 18: 第 六 章 对话框与控件

18

休息 前一页 4 对话框与控件  中国铁道出版社

为对话框添加背景图片

使用 Picture 控件:方法简单,一定保证 TabOrder 为 1 映射 WM_CTLCOLOR 消息,在 OnCtlColor 函数中返

回一个图形刷子: 映射 WM_PAINT 消息,在 OnPaint 函数中选入位图

为对话框设置一幅背景图( Bitmap )有几种最常用的方法:

Page 19: 第 六 章 对话框与控件

19

休息 前一页 4 对话框与控件  中国铁道出版社

Picture 控件

WM_CTLCOLOR

WM_PAINT

Page 20: 第 六 章 对话框与控件

20

休息 前一页 4 对话框与控件  中国铁道出版社

HBRUSH CBitmapBKDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { if (nCtlColor == CTLCOLOR_DLG ) return (HBRUSH)m_BKBrush.GetSafeHandle(); return CDialog::OnCtlColor(pDC,pWnd,nCtlColor);}

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;

}

利用对话框的

OnC

tlColor() CTLCOLOR_BTN

CTLCOLOR_DLGCTLCOLOR_EDITCTLCOLOR_LISTBOXCTLCOLOR_MSGBOXCTLCOLOR_SCRLLBARCTLCOLOR_STATIC

Private:CBrush m_BKBrush

Page 21: 第 六 章 对话框与控件

21

休息 前一页 4 对话框与控件  中国铁道出版社

void CxxxDlg::OnPaint() {

CPaintDC dc(this); // device context for paintingCRect 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; // 释放}

利用对话框的

On

Pain

t()

Page 22: 第 六 章 对话框与控件

22

休息 前一页 4 对话框与控件  中国铁道出版社

CDC 绘图操作 CDC::BitBlt 从源设备环境拷贝一幅位图到当前设备环境 BOOL BitBlt ( int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, DWORD dwRop );

CDC::StretchBlt 从源设备环境(矩形)拷贝一幅位图到当前设备环境(矩形),如果必要,延伸或压缩

BOOL StretchBlt( int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, DWORD dwRop );

Page 23: 第 六 章 对话框与控件

23

休息 前一页 4 对话框与控件  中国铁道出版社

4.3 编辑框 概述 属性和风格 基本操作 编辑控件的通知消息

Page 24: 第 六 章 对话框与控件

24

休息 前一页 4 对话框与控件  中国铁道出版社

CEdit 类控件的操作 口令设置 用来输入和编辑文本 单行文本 多行文本   Multiline

Page 25: 第 六 章 对话框与控件

25

休息 前一页 4 对话框与控件  中国铁道出版社

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

Page 26: 第 六 章 对话框与控件

26

休息 前一页 4 对话框与控件  中国铁道出版社

CEdit 类控件的方法 口令设置 : SetPasswordChar(#); 选择文本 输入 / 输出文本 -----DDX 技术 , 为编辑框添加值变量 , 通过使用

UpdateData() 完成控件与变量之间的数据传送。 ------ 定义 CEdit 类的对象或对象指针( P168 ) CWnd :: SetWindowText (); CWnd :: GetWindowText ();

Page 27: 第 六 章 对话框与控件

27

休息 前一页 4 对话框与控件  中国铁道出版社

CEdit 类控件的方法 CanUndo() Clear() Copy() Cut() EmptyUndoBuffer() GetFirstVisibleLine() GetModify() GetPasswordChar() GetRect() GetSel()

LimitText() LineFromChar() LineLength() LineScroll() Paste() ReplaceSel() SetModify() SetPasswordChar() SetReadOnly() SetSel() Undo()

Page 28: 第 六 章 对话框与控件

28

休息 前一页 4 对话框与控件  中国铁道出版社

CEdit 类控件的消息 EN_CHANGE EN_ERRSPACE EN_HSCROLL EN_KILLFOCUS EN_MAXTEXT EN_SETFOCUS EN_UPDATE EN_VSCROLL

Page 29: 第 六 章 对话框与控件

29

休息 前一页 4 对话框与控件  中国铁道出版社

4.4 按钮类 (CButton) 控件 按钮类控件概述 按钮类的消息 示例

Page 30: 第 六 章 对话框与控件

30

休息 前一页 4 对话框与控件  中国铁道出版社

CButton 类控件的概述

命令按钮 (Pushbuttons) 单选按钮 (Radiobuttons) 复选按钮 (Checkboxes)

Page 31: 第 六 章 对话框与控件

31

休息 前一页 4 对话框与控件  中国铁道出版社

命令按钮 事件: BN_CLICKED 方法: SetWindowText( 字符串 ) ShowWindow(SW_SHOW/ SW_HIDE); EnableWindow(false/true);

Page 32: 第 六 章 对话框与控件

32

休息 前一页 4 对话框与控件  中国铁道出版社

例 4.2 一元二次方程求解

Page 33: 第 六 章 对话框与控件

33

休息 前一页 4 对话框与控件  中国铁道出版社

例 4.2 一元二次方程求解void CEx4_2Dlg::OnButton1()

{ // TODO: Add your control notification handler code here UpdateData(); // 将控件显示的数据传递给成员变量int disc; double realpart,imagepart; // 实部、虚部disc=m_b*m_b-4*m_a*m_c; realpart=(double)-m_b/(2*m_a);imagepart=( double)sqrt(abs(disc))/ (2*m_a);if (disc>=0) // 如果 disc 大于等于 0{ m_x1.Format("x1=%6.2f ", realpart + imagepart); m_x2.Format("x2=%6.2f ", realpart - imagepart);

}

else // 如果 disc 小于 0{ m_x1.Format("x1=%6.2f+%6.2fi",realpart,imagepart); m_x2.Format("x2=%6.2f-%6.2fi",realpart,imagepart);

}UpdateData(FALSE); // 将成员变量数据传递给控件,并显示}

Page 34: 第 六 章 对话框与控件

34

休息 前一页 4 对话框与控件  中国铁道出版社

单选按钮 属性:

Group: 与 Tab order 管理一组控件 事件

BN_CLICKED 检查是否选中的方法( 1 ) IsDlgButtonChecked(ID)( 2 )连接变量的值: 0 , 1 , 2 , 3... ..注意事项

Page 35: 第 六 章 对话框与控件

35

休息 前一页 4 对话框与控件  中国铁道出版社

复选框 属性 事件 检查是否选中的方法( 1 ) IsDlgButtonChecked(ID)

( 2 )连接变量的值:  true/false

Page 36: 第 六 章 对话框与控件

36

休息 前一页 4 对话框与控件  中国铁道出版社

【例 4.3 】单选按钮、复选按钮的使用

Page 37: 第 六 章 对话框与控件

37

休息 前一页 4 对话框与控件  中国铁道出版社

综合示例 -----功能较丰富的计算器

Page 38: 第 六 章 对话框与控件

38

休息 前一页 4 对话框与控件  中国铁道出版社

开发 MyCalculator 程序

创建工程 : 使用 MFC AppWizard 创建应用程序的基本框架;

可视化设计 :制做Windows风格的图形用户界面和各种控件;

编写程序代码。

用 VC++6.0 编写MFC 应用程序,一般有三个步骤:

Page 39: 第 六 章 对话框与控件

39

休息 前一页 4 对话框与控件  中国铁道出版社

“File/New/Projects/MFC AppWizard[exe]/ 工程名: MyCalculator, 位置: E:\MyVC\ch6”

“选择 Dialog based/Next, 标题:计算器“,其它接受默认设置;

”Finish”完成

一、创建工程一、创建工程

Page 40: 第 六 章 对话框与控件

40

休息 前一页 4 对话框与控件  中国铁道出版社

1. “Project Workspace” 窗口,选择“ Resource View” 标签,双击 Dialog 下的“ IDD_MYCALCULATOR_DIALOG”

2. 从“ IDD_MYCALCULATOR_DIALOG” 对话框删除“ OK” 和“ Cancel” 及“ TODO 文本” 。

3. 弹出控件工具箱(右击工具栏 , 选择 Controls) ;4. 向对话框添加按钮 (Button) 控件;5. 右击 Button1 ,选择属性

二、可视化设计二、可视化设计

Page 41: 第 六 章 对话框与控件

41

休息 前一页 4 对话框与控件  中国铁道出版社

类似方法按右表定义,编辑对话框资源。设计结果如下图:

对象 ID 属性 Caption 属性

Button IDC_BUTTON0 0

Button IDC_BUTTON1 1

…… …… ……

Button IDC_BUTTON9 9

Button IDC_BUTTON_POINT .

Button IDC_BUTTON_SIGN +/-

Button IDC_BUTTON_ADD +

Button IDC_BUTTON_MINUS -

Button IDC_BUTTON_MUTIPLY *

Button IDC_BUTTON_DIV /

Button IDC_BUTTON_CLEAR C

Button IDC_BUTTON_SQRT sqrt

Button IDC_BUTTON_RECI 1/x

Button IDC_BUTTON_EQUAL =

Edit Box IDC_DISPLAY( 只读) Edit

1.1. 可视化设计可视化设计

Page 42: 第 六 章 对话框与控件

42

休息 前一页 4 对话框与控件  中国铁道出版社

“View/ClassWizard/Member Variable”

Class name:CMyCalculatorDlg

Ctrol IDS:IDC_DISPLAY

Category:Value 单击 Add variable… 进行如下设置

2.2. 为编辑框“为编辑框“ IDC_DISPLAY”IDC_DISPLAY” 引入变量引入变量

Page 43: 第 六 章 对话框与控件

43

休息 前一页 4 对话框与控件  中国铁道出版社

添加变量添加变量 在“CMyCalculatorDlg.h” 中 , 为为 CMyCalculatorDlgCMyCalculatorDlg

类类加入四个变量( protected ):

3.3. 为为 CMyCalculatorDlgCMyCalculatorDlg 类添加数据成员类添加数据成员

double m_first;// 存储一次运算的第一个操作数及一次运算的结果

double m_second;// 存储一次运算的第二个操作数 CString m_operator;// 存储运算符 double m_coff;// 存储小数点的系数权值

Page 44: 第 六 章 对话框与控件

44

休息 前一页 4 对话框与控件  中国铁道出版社

在构造函数中初始化成员变量CMyCalculatorDlg::CMyCalculatorDlg(CWnd* pParent /*=NULL*/): CDialog(CMyCalculatorDlg::IDD, pParent){ //{{AFX_DATA_INIT(CMyCalculatorDlg)

m_display = _T("0.0");m_first = 0.0;m_second= 0.0;m_operator=_T("+");m_coff = 1.0;//}}AFX_DATA_INIT// Note that LoadIcon does not require a subsequent

DestroyIcon in Win32m_hIcon = AfxGetApp()-

>LoadIcon(IDR_MAINFRAME);}

注此函数在“ CMyCalculatorDlg.cpp” 中

Page 45: 第 六 章 对话框与控件

45

休息 前一页 4 对话框与控件  中国铁道出版社

用向导添加用向导添加 “View/ClassWizard/Message Maps” Class name:CMyCaculatorDlg Object IDS:IDC_BUTTON0 Message:BN_CLICKED 单击” Add Function”

4.4. 为为 ButtonButton 按钮的按钮的 BN_CLICKEDBN_CLICKED 事件添加响应函事件添加响应函数数

BEGIN_MESSAGE_MAP(CMyCalculatorDlg, CDialog)//{{AFX_MSG_MAP(CMyCalculatorDlg)……ON_BN_CLICKED(IDC_BUTTON0, OnButton0)……//}}AFX_MSG_MAP

END_MESSAGE_MAP()

直接在 MyCalculatorDlg.cpp 中添加,如下

Page 46: 第 六 章 对话框与控件

46

休息 前一页 4 对话框与控件  中国铁道出版社

在” MFC ClassWizard” 对话框的” Message Maps” 标签页,选中消息响应函数,单击“ Edit Code”

三、编写程序代码三、编写程序代码

在工作区的” ClassView” 下, CMyCalculatorDlg类中双击相应的响应函数。

直接在 MyCalculatorDlg.cpp 文件中填写对应函数的函数体。

程序代码见演示

添加响应函数后,在 MyCalculatorDlg.cpp 文件中进行了函数的定义,函数体为空,可用以下几种方法填写代码。

Page 47: 第 六 章 对话框与控件

47

休息 前一页 4 对话框与控件  中国铁道出版社

数字” N” 的消息响应函数 (N=0,1,…9)void CMyCalculatorDlg::OnButtonN() { if( m_coff == 1.0)

m_second = m_second*10 + N;// 作为整数输入数字时else { m_second = m_second + N*m_coff; // 作为小数输入数字 m_coff *= 0.1;}UpdateDisplay(m_second);//更新编辑框的数字显示

}

编写程序代码编写程序代码

Page 48: 第 六 章 对话框与控件

48

休息 前一页 4 对话框与控件  中国铁道出版社

如数字” 8” 的消息响应函数void CMyCalculatorDlg::OnButton8()

{ if(m_coff=1.0) m_second=m_second*10+8;else { m_second=m_second+m_coff*8; m_coff*=0.1;}UpdateDisplay(m_second);}

编写程序代码编写程序代码

输入 123.123

1*10+2=12

12*10+3=123

. 0.1

1

123+0.1*1=123.1

123.1+0.01*2=123.12

123.12*0.001*3=123.123

Page 49: 第 六 章 对话框与控件

49

休息 前一页 4 对话框与控件  中国铁道出版社

运算符按钮的消息响应函数:将前一次数据与当前数据进行运算,作为下次的第一操作数,并在编辑框显示。算法如下: m_first 与 m_second 作 m_operator运算后→ m_first; 0 → m_second; m_first→m_display 当前点击的运算符→ m_operator; 将小数的权值变量 m_coff 置 1.0. 详见演示

Page 50: 第 六 章 对话框与控件

50

休息 前一页 4 对话框与控件  中国铁道出版社

如” +”运算符void CMyCalculatorDlg::OnButtonAdd(){ Calculate(); m_operator="+";}

void CMyCalculator::Calculate(){ switch(m_operator.GetAt(0)) { case '+':m_first+=m_second;break; case '-':m_first-=m_second;break; case '*':m_first*=m_second;break;

右击” CMyCalculatorDlg”类 , 选择” Add Member

Function”

注 :Calculate();

类的成员函数

Page 51: 第 六 章 对话框与控件

51

休息 前一页 4 对话框与控件  中国铁道出版社

如” +”运算符

case '/': if(fabs(m_second)<=0.000001) {m_display=" 除数不能为 0"; UpdateData(false); return; } m_first/=m_second;break;}m_second=0.0;m_coff=1.0;UpdateDisplay(m_first);//更新编辑框显示内容

}

需要在MyCalculatorDlg.cpp 中

添加 math.h 文件

Page 52: 第 六 章 对话框与控件

52

休息 前一页 4 对话框与控件  中国铁道出版社

UpdateDisplay() 添加方法同上void CMyCalculatorDlg::UpdateDisplay(double lVal){ m_display.Format(_T("%f"),lVal); int i=m_display.GetLength();//格式化输出 , 将输出结果后的零截去 while(m_display.GetAt(i-1)=='0') { m_display.Delete(i-1,1);i--; }UpdateData(false);//更新编辑框变量 m_display}

Page 53: 第 六 章 对话框与控件

53

休息 前一页 4 对话框与控件  中国铁道出版社

为” =“ 按钮的消息响应函数添加代码:算法如下: m_first 与 m_second 作 m_operator运算后→ m_first;

m_first→m_display ( 显示 ) 0 → m_second; 0 → m_second;

0 →m_first;

将小数的权值变量 m_coff 置 1.0. 输入的运算符→ m_operator

详见演示 为其它按钮的消息响应函数添加代码:见演示

Page 54: 第 六 章 对话框与控件

54

休息 前一页 4 对话框与控件  中国铁道出版社

为“。”按钮添加消息处理函数void CMyCalculatorDlg::OnButtonReciprocal() //1/x 按钮的消息处理函数{ if(fabs(m_second)<0.000001) {m_display = " 除数不能为零 "; UpdateData(false); return; } m_second= 1.0/m_second; UpdateDisplay(m_second);}

void CMyCalculatorDlg::OnButtonPoint() { m_coff = 0.1 ;

}

Page 55: 第 六 章 对话框与控件

55

休息 前一页 4 对话框与控件  中国铁道出版社

关于 UpdateData 函数: CDialog 的基类 CWnd 的成员函数,函数原型 BOOL UpdateData(BOOL bSaveAndValidate=TRUE);

一般在对话框的派生类中,利用 UpdateData() 进行控件和相应变量之间的数据传递

UpdateData(TRUE);// 将控件中的数据传递给相应的变量

UpdateData(FALSE);// 将变量中的数据传递给相应的控件

技术要点技术要点

Page 56: 第 六 章 对话框与控件

56

休息 前一页 4 对话框与控件  中国铁道出版社

关于消息响应函数: 用 MFC ClassWizard 为对话框中某按钮的

BN_CLICKED 事件添加消息处理函数时, MFC ClassWizard 作了三件事:

(1) 在类的定义 MyCalculatorDlg.h 中添加了消息响应函数的函数原型;

(2) 在类的实现文件 MyCalculatorDlg.cpp 中,添加了函数体;

(3) 在类的实现文件 MyCalculatorDlg.cpp 中,添加了消息映射。

技术要点技术要点

Page 57: 第 六 章 对话框与控件

57

休息 前一页 4 对话框与控件  中国铁道出版社

数据交换和校验数据交换和校验:: 对话框数据交换 (DDX) 可以实现对话框中控件数

值的初始化和获取用户的数据输入。 对话框数据校验 (DDV) 可以实现对对话框中数值

进行校验 。如为 IDC_DISPLAY 的 Edit Box 控件创建了 m_display 变量,数据类型为 CString,则 ClassWizard自动在文件MyCalculatorDlg.cpp 中创建了相应的对话框数据交换代码:

技术要点技术要点

Page 58: 第 六 章 对话框与控件

58

休息 前一页 4 对话框与控件  中国铁道出版社

数据交换和校验:

void CMyCalculatorDlg::DoDataExchange(CDataExchange*

pDX)

{ CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(CMyCalculatorDlg)

DDX_Text(pDX, IDC_DISPLAY, m_display);

//}}AFX_DATA_MAP

}

技术要点技术要点

在代码中,利用 CWnd::UpdateData() 进行控件和相应变量之间的数据传递 UpdateData(TRUE);// 将控件中的数据传递给相应的变量UpdateData(FALSE);// 将变量中的数据传递给相应的控件

Page 59: 第 六 章 对话框与控件

59

休息 前一页 4 对话框与控件  中国铁道出版社

字符串 CString 类: CString 类中的字符是 TCHAR 类型的。

构造函数: CString();//产生一个空的 CString 对象 CString(const CString&stringSrc); // 用另一个 CString 对象的

值初始化对象 .

CString(TCHAR ch,int nRepeat=1);// 重复字符 CString(LPCTSTR lpch,int nLength); // 字符数组指定长度 CString(const unsigned char *psz); // 无符号字符指针 CString(LPCWSTR lpsz); //Unicode 字符串 CString(LPCSTR lpsz); //ANSI 字符串

技术要点技术要点

Page 60: 第 六 章 对话框与控件

60

休息 前一页 4 对话框与控件  中国铁道出版社

常用成员函数:常用成员函数: int GetLength() const;// 测试长度 BOOL IsEmpty() const; // 测试为空 void Empty(); // 置空 TCHAR GetAt(int nIndex) const; 获取指定位置处字符 void SetAt(int nIndex,TCHAR ch); 设定字符 MakeUpper(); 变为大写 MakeLower(); 变为小写 int Compare(LPCTSTR lpsz) const; 字符串比较 int CompareNoCase(LPCTSTR lpsz) const; 字符串比较 ,忽略大小写

技术要点技术要点

Page 61: 第 六 章 对话框与控件

61

休息 前一页 4 对话框与控件  中国铁道出版社

例例 11 CString m_str1=“ 下午” ,m_str2=“ 好 !”; CString m_str3=m_str1+m_str2; 例例 22CString m_str1=“a”,m_str2=“b!”;int result=m_str1.Compare(m_str2); 字符串比较if(result==0) AfxMessageBox(“ 两者相同” );else if (result>0)

AfxMessageBox(“m_str1>m_str2”); else AfxMessageBox(“m_str1<m_str2”);

技术要点技术要点

Page 62: 第 六 章 对话框与控件

62

休息 前一页 4 对话框与控件  中国铁道出版社

利用 ON_COMMAND_RANGE宏,可以处理一系列控件对同一消息处理函数的响应,用以下方法修改程序:

优化优化 MyCalculatorMyCalculator 程序程序

(1) 在 MyCalculatorDlg.h 中“ {{AFX_MSG(C MyCalculatorDlg)” 与” }}AFX_MSG”之间添加下面语句:

afx_msg void OnOperandInput(UINT nID); (2) 在 MyCalculatorDlg.cpp 中 “ {{AFX_MSG_MAP(C

MyCalculatorDlg)” 与” }}AFX_MSG_MAP” 间添加下面语句

ON_COMMAND_RANGE(IDC_BUTTON0,IDCBUTTON9,OnOperandInput);

(3) 在 Resource.h 文件中定义 #define IDC_BUTTON0 1000 …… #define IDC_BUTTON9 1009

起始值 结束值

消息响应函数

Page 63: 第 六 章 对话框与控件

63

休息 前一页 4 对话框与控件  中国铁道出版社

优化优化 MyCalculatorMyCalculator 程序程序void CCalculatorDlg::OnOperandInput(UINT nID)

{int n=nID%10;

if(m_coff=1.0)

m_second=m_second*10+n;

else

{ m_second=m_second+m_coff*n;

m_coff*=0.1;

}

UpdateDisplay(m_second);

}

Page 64: 第 六 章 对话框与控件

64

休息 前一页 4 对话框与控件  中国铁道出版社

完成计算器的设计 优化 MyCalculator 程序

操作练习操作练习

Page 65: 第 六 章 对话框与控件

65

休息 前一页 4 对话框与控件  中国铁道出版社

4.5 列表框控件CListBox

概述 属性 列表框 (CListBox) 的基本操作 列表框的通知消息 示例

Page 66: 第 六 章 对话框与控件

66

休息 前一页 4 对话框与控件  中国铁道出版社

CListBox 类控件属性

Sort :列表框项目排序 multi-column :有水平滚动条的多列列表框 Horizontal scroll :创建水平滚动条 vertical scroll want key input :向父窗口发送消息 disable no scroll

列表框控件提供一个项目列表,用户可以从中选择一个或多个项目。

Page 67: 第 六 章 对话框与控件

67

休息 前一页 4 对话框与控件  中国铁道出版社

CListBox 控件的常用操作 AddString() InsertString() DeleteString() ResetContent() FindString() FindStringExact() SelectString()

添加列表项

删除列表项

查找列表项

Page 68: 第 六 章 对话框与控件

68

休息 前一页 4 对话框与控件  中国铁道出版社

列表框的单项选择函数 GetCurSel() 返回列表框中当前选择字符串的

基于 0 的索引

SetCurSel() 设定选中列表项字符串

Page 69: 第 六 章 对话框与控件

69

休息 前一页 4 对话框与控件  中国铁道出版社

列表框多项选择函数 GetSelCount() 返回多选列表框中当前选择的

字符串的数目 GetSetItems() : SetSel()

Page 70: 第 六 章 对话框与控件

70

休息 前一页 4 对话框与控件  中国铁道出版社

CListBox 类控件消息 LBN_DBLCLK LBN_ERRSPACE LBN_KILLFOCUS LBN_SELCANCEL LBN_SELCHANGE LBN_SETFOCUS

Page 71: 第 六 章 对话框与控件

71

休息 前一页 4 对话框与控件  中国铁道出版社

单选列表框获取数据int nSelection=m_ListBox.GetCurSel()

m_ListBox.GetText(nSelection,m_Text);

其中:int 型获得选择项序号CString 型 获得选择项文本项

Page 72: 第 六 章 对话框与控件

72

休息 前一页 4 对话框与控件  中国铁道出版社

【例 4.4 】列表框的使用

Page 73: 第 六 章 对话框与控件

73

休息 前一页 4 对话框与控件  中国铁道出版社

4.6 列表视图( CListCtrl )控件概述 风格及类型属性 列表控件常见的操作 消息 示例

Page 74: 第 六 章 对话框与控件

74

休息 前一页 4 对话框与控件  中国铁道出版社

CListCtrl 控件的用法 Windows 资源管理器中的“查看”标签下

的“大图标、小图标、列表、详细资源”就是一个列表控件的典型应用。显示记录

列表控件的风格 列表控件的 2 个数据结构 列表控件的常用操作 列表控件的消息 列表控件的具体编程

Page 75: 第 六 章 对话框与控件

75

休息 前一页 4 对话框与控件  中国铁道出版社

【例 4.5 】 CListCtrl 控件的使用

Page 76: 第 六 章 对话框与控件

76

休息 前一页 4 对话框与控件  中国铁道出版社

void CEx4_5Dlg:: OnButtonInit() // 初始化 { // 设置列表框控件的扩展风格 DWORD dwExStyle=LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES| LVS_EX_HEADERDRAGDROP|LVS_EX_ONECLICKACTIVATE ; m_List.ModifyStyle(0,LVS_REPORT|LVS_SINGLESEL| LVS_SHOWSELALWAYS); // 设置列表框控件的颜色 m_List.SetExtendedStyle(dwExStyle); m_List.SetTextColor(RGB(200,200,0)); m_List.SetBkColor(RGB(240,247,233)); // 初始化列表,插入 4 列 m_List.InsertColumn(0," 姓名 ",LVCFMT_CENTER,65,0); m_List.InsertColumn(1," 数学 ",LVCFMT_CENTER,65,0); m_List.InsertColumn(2," 英语 ",LVCFMT_CENTER,65,0); m_List.InsertColumn(3," 总分 ",LVCFMT_CENTER,65,0);

}

Page 77: 第 六 章 对话框与控件

77

休息 前一页 4 对话框与控件  中国铁道出版社

void CEx4_5Dlg::OnButtonSum() // 合计 { // 获取当前的记录条数 int nIndex=m_List.GetItemCount(); int sum=0; for(int i=0;i<nIndex;i++) { sum=sum+atoi(m_List.GetItemText(i,1)); sum=sum+atoi(m_List.GetItemText(i,2)); CString s1; s1.Format("%d",sum); m_List.SetItemText(i,3,s1); }

}

Page 78: 第 六 章 对话框与控件

78

休息 前一页 4 对话框与控件  中国铁道出版社

void CEx4_5Dlg::OnButtonAdd() 添加项目行 { UpdateData(); // 获取当前的记录条数 // 定义项目(行)的数据结构 int nIndex=m_List.GetItemCount(); LV_ITEM lvItem; lvItem.mask=LVIF_TEXT; lvItem.iItem=nIndex; // 第 nIndex 行 lvItem.iSubItem=0; //第 1 列 lvItem.pszText=(char *)(LPCTSTR)m_Name; // 在最后一行插入记录 m_List.InsertItem(&lvItem);

// 设置该行其他列的值 m_List.SetItemText(nIndex,1,m_Math); m_List.SetItemText(nIndex,2,m_English); m_Name=""; m_Math=""; m_English=""; UpdateData(FALSE); }

Page 79: 第 六 章 对话框与控件

79

休息 前一页 4 对话框与控件  中国铁道出版社

void CEx4_5Dlg::OnButtonEdit() //修改 { // TODO: Add your control notification handler code here UpdateData(); int nItem=m_List.GetNextItem(-1,LVNI_SELECTED); if(nItem!=-1) { m_List.SetItemText(nItem,0,m_Name); m_List.SetItemText(nItem,1,m_Math); m_List.SetItemText(nItem,2,m_English);

}

}

Page 80: 第 六 章 对话框与控件

80

休息 前一页 4 对话框与控件  中国铁道出版社

void CEx4_5Dlg::OnButtonDel() // 删除选定的项目 { // TODO: Add your control notification handler code here int nItem=m_List.GetNextItem(-1,LVNI_SELECTED); if(nItem!=-1) { m_List.DeleteItem(nItem); } m_Name=""; m_Math=""; m_English=""; UpdateData(FALSE);

}

Page 81: 第 六 章 对话框与控件

81

休息 前一页 4 对话框与控件  中国铁道出版社

单击列表控件 void CEx4_5Dlg ::OnClickList(NMHDR* pNMHDR, LRESULT* pResult) { // TODO: Add your control notification handler code here int nItem=m_List.GetNextItem(-1,LVNI_SELECTED); if(nItem!=-1) { m_Name=m_List.GetItemText(nItem,0); m_Math=m_List.GetItemText(nItem,1); m_English=m_List.GetItemText(nItem,2);

} UpdateData(FALSE); ////////// *pResult = 0; }

Page 82: 第 六 章 对话框与控件

82

休息 前一页 4 对话框与控件  中国铁道出版社

4.7 组合框 (CComboBox) 控件 概述 风格及类型属性 组合框常见的操作 消息 示例

Page 83: 第 六 章 对话框与控件

83

休息 前一页 4 对话框与控件  中国铁道出版社

CComBox 控件 编辑框+列表框

用户可以通过在组合框中输入文本来选定项目,也可以直接从列表框中选定项目。如果项目数超过了组合框中可显示的数目控件上自动添加滚动条。

类型: Simple :简单组合框,列表框直接显示出来 Dropdown :下拉式组合框,点击下拉按钮 Drop List :下拉式列表框,无文字编辑功能

Page 84: 第 六 章 对话框与控件

84

休息 前一页 4 对话框与控件  中国铁道出版社

CComBox 类控件事件 CBN_DBLCLK CBN_ERRSPACE CBN_KILLFOCUS CBN_SELECTCANCEL CBN_SELECTCHANGE CBN_SETFOCUS CBN_CLOSEUP CBN_DROPDOWN CBN_EDITCHANGE CBN_EDITUPDATE 例 6-4 ( P185 )

Page 85: 第 六 章 对话框与控件

85

休息 前一页 4 对话框与控件  中国铁道出版社

【例 4.6 】组合框的使用

Page 86: 第 六 章 对话框与控件

86

休息 前一页 4 对话框与控件  中国铁道出版社

4.8 滚动类控件 概述 属性 操作 消息 WM_HSCROLL 和 WM_VSCROLL 示例

Page 87: 第 六 章 对话框与控件

87

休息 前一页 4 对话框与控件  中国铁道出版社

滚动类控件 CScrollBar/CSlider/CSpin

SB_BOTTOM / SB_RIGHT SB_TOP / SB_LEFT SB_LINEDOWN/ SB_LINERIGHT

单击滚动条向下箭头时 SB_LINEUP / SB_LINELEFT SB_PAGEDOWN/SB_PAGERIGHT

单击向下箭头与滚动块之间区域 SB_PAGEUP / SB_PAGELEFT SB_THUMBPOSITION SB_THUMBTRACK//拖动滚动滑块时 SB_ENDSCROLL

滚动条的事件

Page 88: 第 六 章 对话框与控件

88

休息 前一页 4 对话框与控件  中国铁道出版社

CScrollBar 控件的方法 EnableScrollBar() GetScrollInfo() GetScrollLimit() GetScrollPos() GetScrollRange() SetScrollInfo() SetScrollPos() SetScrollRange() ShowScrollBar()

Page 89: 第 六 章 对话框与控件

89

休息 前一页 4 对话框与控件  中国铁道出版社

【例 4.7 】滚动 条的使用

Page 90: 第 六 章 对话框与控件

90

休息 前一页 4 对话框与控件  中国铁道出版社

滚动 条初始化 BOOL CEx4_7Dlg::OnInitDialog() { // TODO: Add extra initialization here // 设置颜色的初始值 m_Red_Edit=100; m_Green_Edit=100; m_Blue_Edit=100; // 设置滚动 条的滚动范围 m_Red_Scroll.SetScrollRange(0,255); m_Green_Scroll.SetScrollRange(0,255); m_Blue_Scroll.SetScrollRange(0,255); // 设置滚动 条滑块的位置 m_Red_Scroll.SetScrollPos(100); m_Green_Scroll.SetScrollPos(100); m_Blue_Scroll.SetScrollPos(100); // 将数据传送给控件显示 UpdateData(FALSE); return TRUE; // return TRUE unless you set the focus to a control }

Page 91: 第 六 章 对话框与控件

91

休息 前一页 4 对话框与控件  中国铁道出版社

滚动 条的垂直滚动 消息 void CEx4_7Dlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { // TODO: Add your message handler code here and/or call default // 获取滚动 条的位置,赋值给编辑框控件变量 m_Red_Edit=m_Red_Scroll.GetScrollPos(); m_Green_Edit=m_Green_Scroll.GetScrollPos(); m_Blue_Edit=m_Blue_Scroll.GetScrollPos(); // 判断哪个滚动 条滚动 ,并将滑块的位置赋值给编辑框控件变量 if (pScrollBar==&m_Red_Scroll) { switch(nSBCode) { case SB_THUMBTRACK: m_Red_Scroll.SetScrollPos(nPos); m_Red_Edit=nPos; break; } }

Page 92: 第 六 章 对话框与控件

92

休息 前一页 4 对话框与控件  中国铁道出版社

if (pScrollBar==&m_Green_Scroll) { switch(nSBCode) { case SB_THUMBTRACK: m_Green_Scroll.SetScrollPos(nPos);

m_Green_Edit=nPos; break; } } if (pScrollBar==&m_Blue_Scroll) { switch(nSBCode) { case SB_THUMBTRACK: m_Blue_Scroll.SetScrollPos(nPos); m_Blue_Edit=nPos; break; case SB_LINEDOWN: m_Blue_Edit+=1; m_Blue_Scroll.SetScrollPos(m_Blue_Edit); break; } }

Page 93: 第 六 章 对话框与控件

93

休息 前一页 4 对话框与控件  中国铁道出版社

更新控件 画图 在编辑框中显示 UpdateData(false); CDC* pDC=GetDC(); // 获取设备环境指针 CBrush newBrush; // 定义新画刷 CPen newPen; // 定义新画笔

newBrush.CreateSolidBrush(RGB(m_Red_Edit,m_Green_Edit,m_Blue_Edit));

newPen.CreatePen(PS_SOLID,1,RGB(m_Red_Edit,m_Green_Edit,m_Blue_Edit));

pDC->SelectObject(&newPen); // 选入新画笔 pDC->SelectObject(&newBrush); // 选入新画刷 pDC->Ellipse(70,20,170,180); //画椭圆 ReleaseDC(pDC); // 释放设备环境指针 CDialog::OnVScroll(nSBCode, nPos, pScrollBar); }

Page 94: 第 六 章 对话框与控件

94

休息 前一页 4 对话框与控件  中国铁道出版社

【例 4.8 】滚动 条、滑动条和旋转按钮的使用

Page 95: 第 六 章 对话框与控件

95

休息 前一页 4 对话框与控件  中国铁道出版社

4.9 通用对话框和消息对话框 通用对话框 消息对话框 示例

Page 96: 第 六 章 对话框与控件

96

休息 前一页 4 对话框与控件  中国铁道出版社

通用对话框通用对话框 CColorDialog:颜色对话框 CFileDialog:打开 /保存 / 新建文件 CFindReplaceDialog: 查找 /替换 CFontDialog: 字体 CPrintDialog:打印 CPageSetupDialog:页面设置 他们都是从一个公共的基类 CCommandDialog派生而

来,其资源全部包含在 \windows\system\commdlg.dll 中。其共同特点是 : 从用户处获取信息 ,但并不对信息做处理。

要对信息进行处理需要用户添加代码。

见见 P154P154 表表 6-16-1

Page 97: 第 六 章 对话框与控件

97

休息 前一页 4 对话框与控件  中国铁道出版社

【例 4.9 】文件对话框 void CEx4_9Dlg::OnButton1() // 当单击打开按钮时 { CFileDialog dlg(true,NULL,NULL,OFN_HIDEREADONLY|

OFN_OVERWRITEPROMPT, "text file(*.txt)|*.txt|All file(*.*)|*.*|", this); // 显示文件打开对话框 if (dlg.DoModal()==IDOK) // 如果选中了打开按钮 { GetDlgItem(IDC_FILENAME)-

>SetWindowText(dlg.GetPathName()); // 在静态文本控件 IDC_FILENAME 中显示选择的文件路径名 } }

文件对话框类文件对话框类文件对话框类文件对话框类

Page 98: 第 六 章 对话框与控件

98

休息 前一页 4 对话框与控件  中国铁道出版社

消息对话框

Page 99: 第 六 章 对话框与控件

99

休息 前一页 4 对话框与控件  中国铁道出版社

示例

Page 100: 第 六 章 对话框与控件

100

休息 前一页 4 对话框与控件  中国铁道出版社

void CEx4_10Dlg::OnColorButton() { CColorDialog dlg; if (dlg.DoModal()= =IDOK); { COLORREF m_color; m_color=dlg.GetColor(); CWnd * pWnd=GetDlgItem(IDC_EXAMPLE); CDC *pdc; pdc=pWnd->GetDC(); pdc->SetTextColor(m_color); pdc->SetBkMode(1); // 设置背景模式为穿透方式 pdc->TextOut(20,20,"This is a color example"); ReleaseDC(pDC); } }

Page 101: 第 六 章 对话框与控件

101

休息 前一页 4 对话框与控件  中国铁道出版社

拓展 系统集成(一)

Page 102: 第 六 章 对话框与控件

102

休息 前一页 4 对话框与控件  中国铁道出版社

步骤 新建对话框应用程序 ; 将各个子系统的 EXE 文件复制到 debug/ 项目文件夹下 ;

添加命令按纽 添加命令消息处理函数的代码如下 :

ShellExecute(NULL,NULL,"MyCalculator.exe",NULL,NULL,SW_SHOWNORMAL);

Page 103: 第 六 章 对话框与控件

103

休息 前一页 4 对话框与控件  中国铁道出版社

系统集成(二) 新建对话框应用程序,布局主界面 插入一个新的对话框资源,添加类 CDlg1 插入另一个对话框资源,添加类 CDlg2 插入另一个对话框资源,添加类 CDlg3 插入另一个对话框资源,添加类 CDlg4 编写主界面的按钮消息处理函数,模式对话框的调

用 CDlg1 dlg1.DoModal();

Page 104: 第 六 章 对话框与控件

104

休息 前一页 4 对话框与控件  中国铁道出版社

习题四 1 2 3 4