《Windows标准控件在可视化编程中的应用》由会员分享,可在线阅读,更多相关《Windows标准控件在可视化编程中的应用(132页珍藏版)》请在金锄头文库上搜索。
1、1第第9 9章章 Windows Windows 标准控件在可视化编程标准控件在可视化编程中的应用中的应用2控件是控件是Windows图形用户界图形用户界面的主要组成部分之一,用户通面的主要组成部分之一,用户通过操作控件对象完成与应用程序过操作控件对象完成与应用程序之间的交互。控件的使用集中体之间的交互。控件的使用集中体现了现了Windows系统面向对象的系统面向对象的特点特点39.1概述概述9.1.1 9.1.1 在程序界面中增加控件方法在程序界面中增加控件方法1.使用类的成员函数完成控件的增加使用类的成员函数完成控件的增加使用控件类定义一个实例对象使用控件类定义一个实例对象Cbuttonm
2、ybtn;调用该类的调用该类的Create()函数创建相函数创建相应的控件应的控件Mybtn.Create(DWORDdwStyle,constRECT&rect,CWnd*pParentWnd,UINTnID);使用使用ShowWindow()函数显示该函数显示该控件控件ShowWindow()调用调用MoveWindow()、SetWindowPos()、SetWindowText()等等函数等窗口管理函数来移动、显示或隐藏控件、改变控件的函数等窗口管理函数来移动、显示或隐藏控件、改变控件的位置、尺寸以及其它操作位置、尺寸以及其它操作4窗口类名窗口类简介CButtonCButton代表一个
3、按钮的小长方形的子窗口(按钮控件)CComboBoxCComboBox代表一个选择列表框的子窗口(组合框控件)CEditCEdit代表一个接收用户输入的文本输入子窗口(编辑框控件)CListBoxCListBox代表字符串列表的子窗口(列表框控件)CScrollBarCScrollBar代表一个滚动条的子窗口(滚动条控件)CStaic CStaic 代表一个显示静态文本的子窗口(静态控件)系统预定义的窗口类系统预定义的窗口类2.使用可视化工具在基于对话框的应用程序中添加控件59.1.2为控件添加消息映射为控件添加消息映射消息映射消息映射:对控件进行操作,从而引发各种事件,在应用程序中添加控件的
4、消息响应的方法,并将之绑定的机制。如:ON_BN_CLICKED(IDC_BUTTON1, OnBnClickedButton1)6标明了消息的类型标明了消息的类型控件的控件的ID处理消息的函数处理消息的函数在对话框对应的头文件中申明处理事件的函数;在对话框对应的头文件中申明处理事件的函数;如:如:afx_msgvoidOnBnClickedButton1();消息映射形式:消息映射形式:BEGIN_MESSAGE_MAPON_BN_CLICKED(IDC_BUTTON1,OnBnClickedButton1)END_MESSAGE_MAP7子窗口子窗口控件控件消息通知代码消息通知代码对应事件
5、简介对应事件简介按按钮控控件件BN_CLICKEDBN_CLICKED用用户在按在按钮子窗口中子窗口中单击BN_DOUBLECLICKBN_DOUBLECLICKEDED用用户在按在按钮子窗口中双子窗口中双击编辑框框控件控件EN_CHANGEEN_CHANGE用用户在在编辑框框子子窗窗口口中中更更改改了了输入入框中的数据框中的数据EN_ERRSPACEEN_ERRSPACE编辑框的空框的空间已用完已用完EN_HSCROLLEN_HSCROLL水平水平滚动条被按下并被激活条被按下并被激活EN_KILLFOCUSEN_KILLFOCUS编辑框失去框失去输入焦点入焦点EN_MAXTEXTEN_MAX
6、TEXT输入入的的正正文文数数超超过了了编辑框框的的最最大大容量容量EN_SETFOCUSEN_SETFOCUS编辑框子窗口框子窗口获得得输入焦点入焦点EN_UPDATEEN_UPDATE编辑框子窗口将更新框子窗口将更新显示内容示内容EN_VSCROLLEN_VSCROLL垂直垂直滚动条被按下并激活条被按下并激活8子窗口子窗口控件控件消息通知代码消息通知代码对应事件简介对应事件简介列表框列表框控件控件LBN_DBLCLKLBN_DBLCLK字符串列表框中的字符串被双字符串列表框中的字符串被双击LBN_ERRSPACELBN_ERRSPACE分分配配给字字符符串串列列表表框框的的内内存存已已经用
7、用完完LBN_KILLFOCUSLBN_KILLFOCUS字符串列表框失去焦点字符串列表框失去焦点LBN_SELCHANGELBN_SELCHANGE在在字字符符串串列列表表框框进行行的的选择发生生了了改改变LBN_SELCANCELLBN_SELCANCEL在在列列表表框框中中取取消消某某个个选择时发出出的的消息消息LBN_SETFOCUSLBN_SETFOCUS字符串列表框字符串列表框获得得输入焦点入焦点组合框合框控件控件CBN_DBLCLKCBN_DBLCLK选择组合合框中的字符串被双框中的字符串被双击CBN_DROPDOWNCBN_DROPDOWN选择组合合框将被取消框将被取消CBN_
8、EDITCHANGECBN_EDITCHANGE 选择组合合框中的正文将被修框中的正文将被修该CBN_EDITUPDATECBN_EDITUPDATE 选择组合合框中的正文将被更新框中的正文将被更新CBN_ERRSPACECBN_ERRSPACE分配分配给选择组合合框的内存已用完框的内存已用完CBN_KILLFOCUSCBN_KILLFOCUS选择组合合框失去焦点框失去焦点9子窗口控子窗口控件件消息通知代码消息通知代码对应事件简介对应事件简介组合框控合框控件件CBN_SELENDCANCCBN_SELENDCANCELEL当当用用户选择了了列列表表框框中中的的某某一一项后后又又选了了其其他他控
9、控键或或关关闭对话框框,此此时发出此消息出此消息CBN_SELCHANGECBN_SELCHANGE选择列表框中的列表框中的选择项发生改生改变CBN_SELENDOKCBN_SELENDOK用用户选择了了某某一一项,或或选择后后关关闭了了组合合框后框后发送的消息送的消息CBN_CLOSEUPCBN_CLOSEUP组合框关合框关闭时发送的消息送的消息CBN_SETFOCUSCBN_SETFOCUS选择组合合框框获得焦点得焦点滚动条条控控件件没有与没有与滚动条相关的通知代条相关的通知代码静静态控件控件 没有与静没有与静态文本框相关的通知代文本框相关的通知代码控件及其相应的通知代码控件及其相应的通知
10、代码10为控件的事件添加消息映射为控件的事件添加消息映射11为处理消息的成理消息的成员函数添加代函数添加代码voidvoid Cch07_1_2Dlg:OnBnClickedExit() Cch07_1_2Dlg:OnBnClickedExit() OnOK();OnOK();9.1.3 在应用程序中使用控件1.使用GetDlgItem函数根据控件ID来获取控件的地址。GetDlgItem函数的原型为:virtual CWnd* GetDlgItem( int nID ) const;CEdit *pEdit; /定义一个指向CEdit控件指针pEdit=(C Edit *)GetDlgIte
11、m(IDD_EDIT1); /获取ID为IDD_EDIT1编辑框的指针 pEdit-SetSel(2,5); /使用控件指针122、为控件定义标识符、为控件定义标识符如果控件使用频繁,可为控件指定一个标识符。控件类型有两种:一种是控件类型,这样定义的控件标识符就是控件类的实例对象,可以用标识符访问类的所有成员;另一种是将控件定义为一个C+数据类型,如将编辑框定义为CString类型。1314控件定义为控件定义为value类型的刷新问题:类型的刷新问题:刷新操作都是通过刷新操作都是通过DDX技术来完成,技术来完成,DDX是将控件是将控件ID和控件变量绑定的一种技术,其数据交换通过和控件变量绑定的
12、一种技术,其数据交换通过DoDataExchange()函数:()函数:VoidDoDataExchange(CDataExchange*pDX) CDialog:DoDataExchange(pDX);DDX_Control(pDX,IDC_EDIT1,m_edit);DDX_Text(pDX,IDC_EDIT2,m_name);UpdateData(true)UpdateData(false)9.1.4自定义控件类自定义控件类控件类可以被继承的类,派生出新的控件类,就可以扩展控件类的功能。操作步骤:1、在项目上单击快捷菜单,选择“添加-类”,进入类向导,选择“MFC类”,然后,单击“添加”
13、按钮162、指定派生类的基类,输入新类的名称、指定派生类的基类,输入新类的名称3、增加类的成员,扩展控件类的功能;、增加类的成员,扩展控件类的功能;4、为控件定义变量,在变量类型中输入自定、为控件定义变量,在变量类型中输入自定义的控件类义的控件类179.2按钮控件及其应用按钮控件及其应用按钮按钮控件控件普通按钮普通按钮圆按钮圆按钮复选框按钮复选框按钮组框按钮组框按钮自绘按钮自绘按钮189.2.1按钮控件的创建过程按钮控件的创建过程CButton类的成员函数类的成员函数Create负责创建负责创建按钮控件,该函数的声明为:按钮控件,该函数的声明为:BOOLCreate(LPCTSTRlpszCa
14、ption,/指定了按钮显示的指定了按钮显示的正文正文DWORDdwStyle,/按钮的风格按钮的风格constRECT&rect,/按钮的位置按钮的位置和大小和大小CWnd*pParentWnd,/指向父窗口,指向父窗口,UINTnID/按钮的按钮的ID)19按钮控件消息按钮控件消息:ON_BN_CLICKEDON_BN_DBLCLICKEDON_COMMAND两个两个类似类似按钮按钮是最是最常见常见的控的控件之件之一一复选框复选框单选按钮单选按钮下压式按钮下压式按钮分组框分组框常用于只有两种常用于只有两种完全相反状态完全相反状态的情况下的情况下适用于同一组属性相适用于同一组属性相同的数据中
15、选一个数据同的数据中选一个数据适用于消息的发送适用于消息的发送没有太多的操作没有太多的操作只是在窗口中划只是在窗口中划分区域范围分区域范围20GetCheck()SetCheck()GetBitmap()SetBitmap()GetButtonStyle()SetButtonStyle()GetCursor()SetCursor()GetIcon()SetIcon()GetState()SetState()CButton类的类的成员函成员函数数在知道按钮在知道按钮ID的前的前提下,还可使用与提下,还可使用与按钮有关的按钮有关的CWnd成员函数来设置或成员函数来设置或查询按钮状态查询按钮状态Ch
16、eckDlgButtonCheckRadioButtonGetCheckedRadioButtonIsDlgButtonCheckedGetWindowTexGetWindowTextLengthSetWindowText21MFC还提供了一个还提供了一个CBitmapButton的类,的类,允许用户以图标的方式显示按钮,它是允许用户以图标的方式显示按钮,它是在在CButton下派生的下派生的MFC调用方法调用方法DrawItem()在按钮上在按钮上绘制位图绘制位图,LoadBitmaps()方法为一个方法为一个CBitmapButton对象附上位图,对象附上位图,最多可以有最多可以有4个位图
17、个位图自定义自定义按钮按钮229.2.2按钮控件示例按钮控件示例23主要步骤:主要步骤:1.创建基于对话框项目创建基于对话框项目2.设置按钮的属性设置按钮的属性IDCaptionGroupAutoIDC_BUTTON1这里是一个按钮,按我吧!这里是一个按钮,按我吧!IDC_BUTTON2这是缺省按钮,按下看看吧!这是缺省按钮,按下看看吧!IDC_RADIO1自动单选按钮自动单选按钮1IDC_RADIO2自动单选按钮自动单选按钮2IDC_RADIO3单选按钮单选按钮1IDC_RADIO3单选按钮单选按钮2IDC_CHECK1自动复选按钮自动复选按钮1IDC_CHECK2复选按钮复选按钮224添加
18、成员变量添加成员变量控件控件ID变量量类型型成成员变量名量名IDC_BUTTON1CButtonM_btn1IDC_BUTTON2CButtonM_btn2IDC_RADIO3CButtonM_rad3IDC_RADIO4CButtonM_rad4IDC_CHECK2CButtonM_chk2添加消息响应函数添加消息响应函数控件控件ID成成员变量名量名消息消息处理函数理函数IDC_BUTTON1M_btn1OnBnClickedButton1IDC_BUTTON2M_btn2OnBnClickedButton2IDC_RADIO3M_rad3OnBnClickedRadio3IDC_RADIO
19、4M_rad4OnBnClickedRadio4IDC_CHECK2M_chk2OnBnClickedCheck225voidCch07_1Dlg:OnBnClickedButton1()m_btn1.SetWindowText(L你已按下了按钮!你已按下了按钮!);voidCch07_1Dlg:OnBnClickedButton2()m_btn2.SetWindowText(L按钮已被按下!按钮已被按下!);voidCch07_1Dlg:OnBnClickedRadio3()m_rad3.SetCheck(1);m_rad4.SetCheck(0);26voidCch07_1Dlg:OnBn
20、ClickedRadio4()m_rad3.SetCheck(0);m_rad4.SetCheck(1);voidCch07_1Dlg:OnBnClickedCheck2()if(m_chk2.GetCheck()m_chk2.SetCheck(0);elsem_chk2.SetCheck(1); 279.3滚动条控件滚动条控件滚滚动动条条是是一一个个交交互互式式的的、高高度度可可视视化化的的控控件件它包括一个滑块、滚动条的两端的按钮等。它包括一个滑块、滚动条的两端的按钮等。滚动条控件滚动条控件与与属于窗口的滚动条属于窗口的滚动条是不一样的是不一样的处于窗口的滚处于窗口的滚动条是由该窗动条是由
21、该窗口创建、管理口创建、管理和释放的和释放的滚动条控件是由滚动条控件是由用户创建、管理用户创建、管理和释放的和释放的289.3.1滚动条类的结构及其方法滚动条类的结构及其方法滚动条可以通过通知代滚动条可以通过通知代码来创建,也可以用对码来创建,也可以用对话框资源模板来创建话框资源模板来创建29常用滚动条动作标识及其说明常用滚动条动作标识及其说明SB_TOP/SB_BOTTOM:滚动到滚动条最顶:滚动到滚动条最顶/底端底端SB_LINEUP/SB_LINEDOWN:向上:向上/下滚动一行下滚动一行SB_LEFT/SB_RIGHT:滚动到左:滚动到左/右边右边SB_LINELEFT/SB_LINE
22、RIGHT:向左:向左/右滚动一行右滚动一行SB_PAGEUP/SB_PAGEDOWN:向上:向上/下滚动一页下滚动一页SB_PAGELEFT/SB_PAGERIGHT:向向左左/右右滚滚动动一一页页SB_THUMBPOSITION:滚动框移动到新位置:滚动框移动到新位置SB_THUMBTRACK:滚动框被拖动:滚动框被拖动SB_ENDSCROLL:滚动到最终位置:滚动到最终位置309.3.2创建与初始化滚动条类创建与初始化滚动条类创建创建CScrollBar对象的一般步骤对象的一般步骤(1)用用C+关键字关键字new和构造函数和构造函数CScrollBar:CScrollBar()为一个为一
23、个ScrollBar对象分配一个对象分配一个实例实例(2)初始化初始化CScrollBar对象,将一对象,将一个个Windows滚动条赋予它,并用滚动条赋予它,并用CScroll:Create()方法设置参数和样式方法设置参数和样式分配一个滚动条控件对象并返回指向该对象的指针分配一个滚动条控件对象并返回指向该对象的指针CScrollBar:pMyScroll=new CScrollBarCScrollBar:pMyScroll=new CScrollBar调用调用CScrollBar:Create()方法初始化指针方法初始化指针BOOL Create(BOOL Create(DWORD dwS
24、tyleDWORD dwStyle, ,const RECT& rectconst RECT& rect, ,CWnd *pParentWndCWnd *pParentWnd, ,UINT nIDUINT nID););滚动条窗滚动条窗口的样式口的样式表示控件的表示控件的大小和位置大小和位置指向控件所属指向控件所属窗口的指针窗口的指针父窗口与滚动父窗口与滚动条通信的标识条通信的标识31在设置滚动条控件时,要通过如下方法设置其范围在设置滚动条控件时,要通过如下方法设置其范围CScrollBar:SetScrollRange()例如,设置滚动范围为例如,设置滚动范围为-100到到100的垂直滚动条
25、的垂直滚动条pMyScroll-SetScrollRange(SB_VERT,-100,100);pMyScroll-SetScrollRange(SB_VERT,-100,100);通过通过SetScrollPos()设置滚动块当前位置设置滚动块当前位置例如,滚动快的位置在例如,滚动快的位置在-100到到100的中间,即为的中间,即为0的位置的位置pMyScroller-SetScrollPos(0);pMyScroller-SetScrollPos(0);329.3.3滚动条类编程实例滚动条类编程实例标题为标题为Application of ScrollBar滚动条的滚滚动条的滚动范围设为
26、动范围设为0到到20单击滚动块与单击滚动块与箭头之间的区箭头之间的区域。滚动块上域。滚动块上移或下移三格,移或下移三格,编辑框中的数编辑框中的数字加字加3或减或减3单击向上或向下的单击向上或向下的箭头,滚动块向上箭头,滚动块向上或向下移动一格,或向下移动一格,编辑框中的数字加编辑框中的数字加1或减或减1按住滚动块上按住滚动块上下拖动。编辑下拖动。编辑框中的数字随框中的数字随着随之变化着随之变化当前值为当前值为10单击单击Up按钮,按钮,滚动块移到最滚动块移到最上边,编辑框上边,编辑框的数字变为的数字变为0单击单击Down按钮,按钮,滚动块移到最下滚动块移到最下边,编辑框的数边,编辑框的数字变为
27、字变为20单击单击Reset按按钮,滑块移到钮,滑块移到中间,编辑框中间,编辑框的数字变为的数字变为10单击单击Exit按按钮,退出应钮,退出应用程序用程序33(1)应用程序的可视化编程部分应用程序的可视化编程部分对象对象ID变量名及类型变量名及类型Caption只读只读滚动条滚动条IDC_SCROLLBARm_scrollbar(control)无无编辑框编辑框IDC_EDIT1m_dispinfo(control)无无Top按钮按钮IDC_BTN_TOP&TopBottom按钮按钮 IDC_BTN_BOTTOM&BottomReset按钮按钮IDC_BTN RESET&ResetExit按
28、钮按钮IDC_BTN EXIT&Exit34(2)应用程序的代码编程部分应用程序的代码编程部分在在Cch07_2Dlg类中加入一个成员函数类中加入一个成员函数ChangeDisplayInfo(intpos),用于将数值型参数用于将数值型参数pos显示到编辑框控件中显示到编辑框控件中void Cch07_2Dlg:ChangeDisplayInfo(int pos)TCHAR sPos10;_itow(pos,sPos,10);m_dispinfo.SetSel(0,-1);m_dispinfo.ReplaceSel(sPos);UpdateData(FALSE); /将与控件绑定的变量内容显
29、示到屏幕上将与控件绑定的变量内容显示到屏幕上函数函数_itow(pos,sPos,10)是将数值是将数值pos按十进制形式转化到字符串按十进制形式转化到字符串sPos中,中,SetSel()和和ReplaceSel()是是CEdit类的成员函数,类的成员函数,SetSel(0,-1)表示选中编辑框中的所有内容,表示选中编辑框中的所有内容,ReplaceSel(sPos)表示用表示用sPos的的值去替换编辑框中的内容。值去替换编辑框中的内容。37BOOLCch07_2Dlg:OnInitDialog() CDialog:OnInitDialog();SetIcon(m_hIcon,TRUE);S
30、etIcon(m_hIcon,FALSE);m_scrollbar.SetScrollRange(0,20);m_scrollbar.SetScrollPos(10);ChangeDisplayInfo(m_scrollbar.GetScrollPos();return TRUE;(b) (b) 初始化滚动条初始化滚动条在Cch07_2Dlg的属性框中选择“消息”选项卡,选择“WM_VSCROLL”消息,单击右侧的向下的箭头按钮,然后添加一个成员函数OnVScroll39(3)给滚动条消息添加代码给滚动条消息添加代码voidCch07_2Dlg:OnVScroll(UINTnSBCode,UI
31、NTnPos,CScrollBar*pScrollBar) int iNowPos;switch(nSBCode)if(pScrollBar=&m_scrollbar)case SB_THUMBTRACK:m_scrollbar.SetScrollPos(nPos);ChangeDisplayInfo(m_scrollbar.GetScrollPos();40case SB_LINEDOWN:iNowPos=m_scrollbar.GetScrollPos();iNowPos=iNowPos+1;if(iNowPos20)iNowPos=20;m_scrollbar.SetScrollPos(
32、iNowPos);ChangeDisplayInfo(m_scrollbar.GetScrollPos();break;41case SB_LINEUP:/单击滚动条向上的箭头单击滚动条向上的箭头iNowPos=m_scrollbar.GetScrollPos();iNowPos=iNowPos-1;if(iNowPos20)iNowPos=20;m_scrollbar.SetScrollPos(iNowPos);ChangeDisplayInfo(m_scrollbar.GetScrollPos();break;43case SB_PAGEUP:/单击滚动条上面的箭头与滚动块之间的区域单击滚
33、动条上面的箭头与滚动块之间的区域iNowPos=m_scrollbar.GetScrollPos();iNowPos=iNowPos-3;if(iNowPosSetRange(0,100);pSpin-SetPos(50);pSpin-GetBuddy()-SetWindowText(L5.0);returnTRUE;设置设置Spin的范围是的范围是0100,当前位置是当前位置是50,同时设置它,同时设置它的配对控件的显示值的配对控件的显示值102在对话框中添加在对话框中添加WM_VSCROLLWM_VSCROLL消息的响应:消息的响应:voidCEx9_9Dlg:OnVScroll()if(
34、pScrollBar-GetDlgCtrlID()=IDC_SPIN1)CStringstrValue;strValue.Format(L%3.1f,(double)nPos/10.0);(CSpinButtonCtrl*)pScrollBar)-GetBuddy()-SetWindowText(strValue);CDialog:OnVScroll(nSBCode,nPos,pScrollBar);1039.8.3Progress控件的使用控件的使用 进进度度控控件件是是一一个个用用来来指指示示长长时时间间操操作作的的进进展展程程度度的的控控件件。MFC中中表表示示进进度度控控制制的的是是C
35、ProgressCtrl类类进度条有一个进度条有一个范围范围和和当前位置当前位置。范围表示整个范围表示整个操作的持续时间操作的持续时间,当前位置表示当前进行到的当前位置表示当前进行到的位置位置,进度条根据当前位置来判断进行的百分,进度条根据当前位置来判断进行的百分比,来显示进度比,来显示进度104添加一个添加一个Progress控件,保持默认控件,保持默认ID,设置,设置Smooth属性。在旁边添加一个按钮,设置属性。在旁边添加一个按钮,设置ID为为“IDC_BUTTON_START”,Caption为为“开始开始”在在OnInitDialog中添加如下代码:中添加如下代码:CProgress
36、Ctrl*pProg=(CProgressCtrl*)GetDlgItem(IDC_PROGRESS1);pProg-SetRange(0,100);pProg-SetPos(50);为为“开始开始”按钮添加点击事件实现代码:按钮添加点击事件实现代码:voidCEx9_9Dlg:OnButtonStar()CProgressCtrl*pProg=(CProgressCtrl*)GetDlgItem(IDC_PROGRESS1);pProg-SetPos(0);SetTimer(1000,100,NULL);105在在CCtrlDlg中添加对中添加对WM_TIMER消息的响应函数:消息的响应函数
37、:voidCEx9_9Dlg:OnTimer(UINTnIDEvent) if(nIDEvent = 1000)CProgressCtrl* pProg = (CProgressCtrl*) GetDlgItem(IDC_PROGRESS1);pProg-SetPos(pProg-GetPos()+1);if(pProg-GetPos() = 100)KillTimer(nIDEvent);AfxMessageBox(进行完毕进行完毕);CDialog:OnTimer(nIDEvent);每隔每隔0.1秒,秒,进度条前进度条前进一步进一步1069.8.4Slider控件的使用控件的使用滑滑块块
38、控控件件可可以以使使用用户户通通过过拖拖动动滑滑块块来来快快速速获获得得指指定定的的数数据据。当当用用户户滑滑动动滑滑块块的的时候,控件将发送消息来指示变化。时候,控件将发送消息来指示变化。滑块控件在你滑块控件在你选择一系列离散选择一系列离散值或者一段连续值或者一段连续范围内的时候十范围内的时候十分有用。分有用。CProgressCtrl类的主要成员 成员成员描述描述CProgressCtrl构造CProgressCtrl对象。Create创建进度条。SetRange设置表示范围。SetPos设置当前位置。SetStep设置渐进步长。StepIt前进一步。108在对话框上增加一个在对话框上增加
39、一个Slider控件,设置控件,设置Point属性为属性为“Bottom/Right”,然后在旁边添加一个,然后在旁边添加一个Static控件,控件,ID设置为设置为IDC_STATIC_SLIDER。该控件用来显示滑。该控件用来显示滑块的当前位置。块的当前位置。在在OnInitDialog函数中添加如下代函数中添加如下代码:CProgressCtrl* pProg =(CProgressCtrl*) GetDlgItem(IDC_PROGRESS1);pProg-SetRange(0, 100);pProg-SetPos(50);为开始按开始按钮添加点添加点击事件,事件,实现代代码如下:如下
40、:voidCEx9_9Dlg:OnButtonStar()CProgressCtrl* pProg = (CProgressCtrl*) GetDlgItem(IDC_PROGRESS1);pProg-SetPos(0);SetTimer(2008,100,NULL);109为为了了响响应应滑滑块块移移动动的的消消息息,添添加加WM_HSCROLL消消息息的的响响应应(Slider是是水水平平的的,如如果果是是垂垂直直的的,则则需需要响应要响应WM_VSCROLL)。实现如下:)。实现如下:voidCEx9_9Dlg:OnHScroll()if(pScrollBar-GetDlgCtrlID(
41、) = IDC_SLIDER1) CSliderCtrl* pSlide = (CSliderCtrl*) pScrollBar;CString strText;strText.Format(L%d, pSlide-GetPos();SetDlgItemText(IDC_STATIC_SLIDER,strText);CDialog:OnHScroll(nSBCode,nPos,pScrollBar);1109.8.5DateTimePicker控件的使用控件的使用DateTimerPicker可以用来接收日期或可以用来接收日期或者时间输入。用户可以直接按照指定的者时间输入。用户可以直接按照指定
42、的形式输入,也可以在弹出的日历控件中形式输入,也可以在弹出的日历控件中选择日期。选择日期。如果让用户以如果让用户以字符串形式输字符串形式输入,则由于输入,则由于输入的多样性,入的多样性,程序不好解析程序不好解析111成成员描述描述CDateTimeCtrl构造CDateTimeCtrl对象。Create创建进日期控件。SetMothCalColor设置内嵌的日历控件的颜色,包括背景、文字等颜色。SetFormat设置显示日期的格式。SetRange设置日期范围。GetTime获得表示的时间。CDateTimeCtrl类主要成员类主要成员112在对话框上添加一个在对话框上添加一个DateTime
43、Picker控件,控件,设置设置Format为为“ShortDate”,选择,选择“UseSpinControl”,如果不选择使用,如果不选择使用Spin控件,则用控件,则用户在弹出的日历控件中进行输入。在该控件户在弹出的日历控件中进行输入。在该控件旁边添加一个按钮,旁边添加一个按钮,ID为为“IDC_BUTTON_TIME”,Caption为为“报时报时”。在在OnInitDialog中添加如下代码:中添加如下代码:CDateTimeCtrl*pDT=(CDateTimeCtrl*)GetDlgItem(IDC_DATETIMEPICKER1);CStringformatStr=_T(今天是
44、今天是:yy/MM/dd);pDT-SetFormat(formatStr);113添加对添加对【报时报时】按钮的点击事件的响应函数:按钮的点击事件的响应函数:voidCEx9_9Dlg:OnButtonTime()CDateTimeCtrl*pDT=(CDateTimeCtrl*)GetDlgItem(IDC_DATETIMEPICKER1);CTimet;pDT-GetTime(t);CStrings=t.Format(L%A,%B%d,%Y%H:%M:%S);AfxMessageBox(s);1149.8.6ListControl控件的使用控件的使用列表控件列表控件115列表控件是列表控
45、件是Windows应用程序中最常用应用程序中最常用的控件之一。最常见的用途就是资源管的控件之一。最常见的用途就是资源管理器右边的文件列表。理器右边的文件列表。MFC中使用中使用CListCtrl类来封装列表控件类来封装列表控件的功能。的功能。列表控件通常可以包括一个图标和一列表控件通常可以包括一个图标和一个标签。此外,每一项还可以具有其它附个标签。此外,每一项还可以具有其它附加信息,例如资源管理器中文件的具体信加信息,例如资源管理器中文件的具体信息就是附加信息。息就是附加信息。116列表控列表控件的视件的视图风格图风格图标视图:图标视图:每项显示每项显示3232图标,在图标,在图标下面显示标签
46、。用户可以将图标图标下面显示标签。用户可以将图标拖放到视图内任何位置拖放到视图内任何位置小图标视图:小图标视图:每项显示每项显示1616图标,图标,在图标右边显示标签。用户可以将在图标右边显示标签。用户可以将图标拖放到视图内任何位置图标拖放到视图内任何位置列表视图:列表视图:每项显示每项显示1616图标,在图标,在图标右边显示标签。每一项按列排图标右边显示标签。每一项按列排列,不能随意拖动图标列,不能随意拖动图标报表视图:报表视图:每项占一行,第一列是每项占一行,第一列是主项,显示主项,显示1616图标,在图标右侧图标,在图标右侧显示标签。右边的列显示子项,具显示标签。右边的列显示子项,具体由
47、程序来决定体由程序来决定117成员成员描述描述成员成员描述描述CListCtrlCListCtrl构构 造造 CListCtrlCListCtrl对对象象SetItemTextSetItemText设设置置列列表表项项的的标标签签文字文字CreateCreate创建列表控件创建列表控件GetHotItemGetHotItem获获得得当当前前位位于于鼠鼠标标之下的列表项之下的列表项SetBkColorSetBkColor设置背景颜色设置背景颜色GetSelectionMarGetSelectionMark k获获得得当当前前选选择择的的列列表项表项SetImageListSetImageList
48、设置图像列表设置图像列表SubItemHitTestSubItemHitTest获获得得指指定定点点下下的的列列表项表项SetItemSetItem设置列表项数据设置列表项数据SetBkImageSetBkImage设置背景图片设置背景图片GetItemRectGetItemRect获获得得列列表表项项的的所所占占区域区域InsertItemInsertItem插入列表项插入列表项GetEditControGetEditControl l获获得得当当前前正正在在编编辑辑的的列列表表项项的的EditEdit控控件件EditLabelEditLabel启启动动显显示示编编辑辑标标签签文字文字Set
49、TextColorSetTextColor设置文字颜色设置文字颜色CreateDragImageCreateDragImage创创建建用用于于拖拖放放的的图图片片SetTextBkColoSetTextBkColor r设置文字背景颜色设置文字背景颜色列表控件的主要成员列表控件的主要成员118为使用列表控件,首先需要创建图标资源,在为使用列表控件,首先需要创建图标资源,在ResourceView的的Icon一栏内创建一栏内创建8个图标资个图标资源源在在Cex9_9Dlg类中增加成员如下:类中增加成员如下:CImageListm_imageList;在在OnInitDialog函数中添加初始化图
50、片列表的代码:函数中添加初始化图片列表的代码:HICONhIcon8;intn;m_imageList.Create(16,16,0,8,8);hIcon0=AfxGetApp()-LoadIcon(IDI_ICON_WHITE);hIcon1=AfxGetApp()-LoadIcon(IDI_ICON_BLACK);hIcon2=AfxGetApp()-LoadIcon(IDI_ICON_RED);hIcon3=AfxGetApp()-LoadIcon(IDI_ICON_BLUE);hIcon4=AfxGetApp()-LoadIcon(IDI_ICON_YELLOW);hIcon5=Afx
51、GetApp()-LoadIcon(IDI_ICON_CYAN);hIcon6=AfxGetApp()-LoadIcon(IDI_ICON_PURPLE);hIcon7=AfxGetApp()-LoadIcon(IDI_ICON_GREEN);for(n=0;nSetImageList(&m_imageList,LVSIL_SMALL);/设置小图标图片列设置小图标图片列表表for(n=0;nInsertItem(n,colorn,n);pList-SetBkColor(RGB(0,255,255);/设置背设置背景色景色pList-SetTextBkColor(RGB(255,0,255);
52、/设置文字的背景色设置文字的背景色现在编译运行已经可以看到列表的运行效果了。现在编译运行已经可以看到列表的运行效果了。121在在 列列 表表 控控 件件 下下 添添 加加 static控控 件件 , ID为为IDC_STATIC_LIST。 对对 列列 表表 控控 件件 添添 加加 对对LVN_ITEMCHANGED消息的响应:消息的响应:voidCEx9_9Dlg:OnItemchangedList1() NM_LISTVIEW*pNMListView=(NM_LISTVIEW*)pNMHDR;/TODO:AddyourcontrolnotificationhandlercodehereCL
53、istCtrl*pList=(CListCtrl*)GetDlgItem(IDC_LIST1);intnSelected=pNMListView-iItem;if(nSelected=0)CStringstrItem=pList-GetItemText(nSelected,0);SetDlgItemText(IDC_STATIC_LIST,strItem);*pResult=0;122在在设设置置控控件件属属性性时时,设设置置了了Editlabels属属性性,下下面面是是对列表控件的对列表控件的NM_RCLICK消息的响应:消息的响应:voidCEx9_9Dlg:OnRclickList1()
54、/TODO:AddyourcontrolnotificationhandlercodehereNM_LISTVIEW*pNMListView=(NM_LISTVIEW*)pNMHDR;CListCtrl*pList=(CListCtrl*)GetDlgItem(IDC_LIST1);intnSelected=pNMListView-iItem;if(nSelected=0)pList-EditLabel(nSelected);*pResult=0;123运运行行程程序序,右右击击某某一一项项,已已可可以以编编辑辑标标签签了了,但但无无法法保保存存编编辑辑效效果果。若若要要保保存存,需需要要响响
55、应应列列表表控控件件的的LVN_ENDLABELEDIT消消息息,在在这这里里可可以以判判断断新新输输入入的文字是否合法,然后设置标签为编辑得到的文字:的文字是否合法,然后设置标签为编辑得到的文字:voidCEx9_9Dlg:OnEndlabeleditList1() LV_DISPINFO*pDispInfo=(LV_DISPINFO*)pNMHDR;/TODO:AddyourcontrolnotificationhandlercodehereLVITEMAitem=pDispInfo-item;CStringstr=item.pszText;str.TrimLeft();str.TrimR
56、ight();if(str.GetLength()0)CListCtrl*pList=(CListCtrl*)GetDlgItem(IDC_LIST1);pList-SetItemText(item.iItem,item.iSubItem,item.pszText);*pResult=0;1249.8.7TreeControl控件的使用控件的使用树状视图控件是一种用来显示层次结构的控件,树状视图控件是一种用来显示层次结构的控件,例如例如Windows资源管理器左边的视图。视资源管理器左边的视图。视图中的每一项包图中的每一项包括一个标签,位括一个标签,位图是可选的,每图是可选的,每项还可以附加若
57、项还可以附加若干子项。点击每干子项。点击每一项,可展开或一项,可展开或合拢当前树节点合拢当前树节点125本例中继续使用本例中继续使用ListControl中的图标。接下来在对中的图标。接下来在对话框中添加树状控件,其话框中添加树状控件,其ID为为IDC_TREE1,选中,选中Hasbuttons、Haslines、Linesatroot和和Editlabels属性属性 Has buttons Has buttons:决定可展开项之前是否有:决定可展开项之前是否有“+ +”、“”按钮按钮 Has LinesHas Lines:决定相关节点之间是否显示虚线连接:决定相关节点之间是否显示虚线连接 L
58、ines at rootLines at root:决定位于第一层的节点之间是否有虚线连接:决定位于第一层的节点之间是否有虚线连接Editlabels:表示标签是否可编辑表示标签是否可编辑126然后在然后在OnInitDialog函数中添加如下代码:函数中添加如下代码:CTreeCtrl*pTree=(CTreeCtrl*)GetDlgItem(IDC_TREE1);pTree-SetImageList(&m_imageList,TVSIL_NORMAL);/设置设置图片列表图片列表TV_INSERTSTRUCTtvinsert;/创建待插入的创建待插入的TV_INSERTSTRUCT结构结构
59、tvinsert.hParent=NULL;/无父结点无父结点tvinsert.hInsertAfter=TVI_LAST;/插入到本层最后插入到本层最后tvinsert.item.mask=TVIF_IMAGE|TVIF_SELECTEDIMAGE|TVIF_TEXT;/掩码掩码:图标图标/选中图标选中图标/文字文字tvinsert.item.hItem=NULL;/句柄为空句柄为空tvinsert.item.state=0;/状态状态tvinsert.item.stateMask=0;/状态掩码,不使用这状态掩码,不使用这两项两项tvinsert.item.cchTextMax=6;/最大
60、文字长度,忽略最大文字长度,忽略tvinsert.item.iSelectedImage=1;/选中图标索引选中图标索引tvinsert.item.cChildren=0;/没有子节点没有子节点tvinsert.item.lParam=0;/自定义数据自定义数据127/创建第一层创建第一层tvinsert.item.iImage=2;/一般图标一般图标tvinsert.item.pszText=Lfather;/插入第一层第一个节点插入第一层第一个节点HTREEITEMhDad=pTree-InsertItem(&tvinsert);tvinsert.item.pszText=Lmother;
61、/插入第一层第二个节点插入第一层第二个节点HTREEITEMhMom=pTree-InsertItem(&tvinsert);/创建第二层创建第二层tvinsert.hParent=hDad;/父节点为父节点为fathertvinsert.item.iImage=3;/一般图标一般图标tvinsert.item.pszText=son;/插入第二层插入第二层father的第一个节点的第一个节点pTree-InsertItem(&tvinsert);tvinsert.item.pszText=Ldaughter;/插入第二层的第二个节点插入第二层的第二个节点pTree-InsertItem(&t
62、vinsert);tvinsert.hParent=hMom;/父结点为父结点为mothertvinsert.item.iImage=4;128tvinsert.item.pszText=Lson“;/插入第二层的第一个节点插入第二层的第一个节点pTree-InsertItem(&tvinsert);tvinsert.item.pszText=Ldaughter;/插入第二层的第二个节点插入第二层的第二个节点pTree-InsertItem(&tvinsert);tvinsert.item.pszText=Lcartoon;/插入第二层的第三个节点插入第二层的第三个节点HTREEITEMhOt
63、her=pTree-InsertItem(&tvinsert);/创建第三层创建第三层tvinsert.hParent=hOther;/父结点为父结点为cartoontvinsert.item.iImage=7;tvinsert.item.pszText=LTom“;/插入第三层的第一个节点插入第三层的第一个节点TompTree-InsertItem(&tvinsert);tvinsert.item.pszText=LJerry;/插入第三层的第二个节点插入第三层的第二个节点JerrypTree-InsertItem(&tvinsert);129理理解解上上述述代代码码的的关关键键在在于于理理
64、解解关关键键函函数数InsertItem和和TV_INSERTSTRUCT和和TV_ITEM数据结构。数据结构。InsertItem的函数执行的功能是向树状的函数执行的功能是向树状控件中插入一项,至于这一项什么样子,控件中插入一项,至于这一项什么样子,要插入到什么位置,全部由要插入到什么位置,全部由InsertItem的的TV_INSERTSTRUCT类型的参数来描述,类型的参数来描述,130下下面面通通过过添添加加一一些些对对树树状状控控件件常常用用消消息息的的响响应应来来说说明明树树状状控控件件的的一一般般使使用用方方法法。首首先先在在树树状状控控件件旁旁边边添添加加一一个个static控
65、控件件,ID设设置置为为IDC_STATIC_TREE。为树状控件添加对为树状控件添加对TVN_SELCHANGED消息的响应:消息的响应:voidCEx9_9Dlg:OnSelchangedTree1() NM_TREEVIEW*pNMTreeView=(NM_TREEVIEW*)pNMHDR;/TODO:AddyourcontrolnotificationhandlercodehereCTreeCtrl*pTree=(CTreeCtrl*)GetDlgItem(IDC_TREE1);HTREEITEMhSelected=pNMTreeView-itemNew.hItem;if(hSelec
66、ted!=NULL)chartext31;TV_ITEMitem;item.mask=TVIF_HANDLE|TVIF_TEXT;item.hItem=hSelected;item.pszText=text;item.cchTextMax=30;VERIFY(pTree-GetItem(&item);SetDlgItemText(IDC_STATIC_TREE,text);*pResult=0;131在向对话框添加控件时,设置了在向对话框添加控件时,设置了Edit labelsEdit labels属性,使得树状控属性,使得树状控件可编辑,双击节点文字便进入编辑状态,响应编辑状态结束件可编辑,
67、双击节点文字便进入编辑状态,响应编辑状态结束消息呢的方法与响应列表控件的编辑结束消息完全一样。对消息呢的方法与响应列表控件的编辑结束消息完全一样。对TVN_ENDLABELEDITTVN_ENDLABELEDIT消息的响应函数,实现如下:消息的响应函数,实现如下:void CEx9_9Dlg:OnEndlabeleditTree1(void CEx9_9Dlg:OnEndlabeleditTree1() ) TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR; TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMH
68、DR;/TODO:Add your control notification handler code here/TODO:Add your control notification handler code hereTVITEMA item = pTVDispInfo-item;TVITEMA item = pTVDispInfo-item;CString str =item.pszText;CString str =item.pszText;str.TrimLeft();str.TrimLeft();str.TrimRight();str.TrimRight();if(str.GetLength() 0)if(str.GetLength() 0) CTreeCtrl* pTree =(CTreeCtrl*) GetDlgItem(IDC_TREE1); CTreeCtrl* pTree =(CTreeCtrl*) GetDlgItem(IDC_TREE1); pTree-SetItemText(item.hItem,item.pszText); pTree-SetItemText(item.hItem,item.pszText); *pResult = 0;*pResult = 0;132