面向对象与visual c程序设计案例教程_第1页
面向对象与visual c程序设计案例教程_第2页
面向对象与visual c程序设计案例教程_第3页
面向对象与visual c程序设计案例教程_第4页
面向对象与visual c程序设计案例教程_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

10MFC中Windows标准控件熟练掌握各种Windows Windows标准控Slider控件、DateTimePicker控件、ListControl控件和TreeControl控件的使用C++面向C++面向VisualC++案1010章MFC中Windows准控件用程序之间的交互。控件的使用了Windows系统面向对象的特点。本章主要介绍组合框。本章10.7节介绍的控件主要应用在框界面上,主要包括Picture控件、Spin 和组合框控件等。表10-1列出了系统预定义的窗口类。10-1系统预定义的 MAND消息进行相关的通信。不同控件类型发送消息代码是不一样的,表10-2列出了不同的控件类型发送代码。表10-2控件及其相应代没有与滚动条相关代没有与静态文本框相关代按钮控件及其按钮控件是Windows框中最常用的控件之一。按钮控件的类型比较丰富,其中主普通按钮(PUSHBUTTON)与默认普通按钮单选按钮复选框(CHECKBOX)组框(GROUPBOX)自绘式按MFCCButtonMFC9.1所示。用于按钮控件消息的宏有ON_BN_CLICKED、ON_BN_DBLCLICKED和菜单项时发送消息 MAND和ON_BN_CLICKED类似CWnd中通用的窗口操作函数,如GetWindowText()(获取按钮文本)等。10-3CButton类的主要成 获得用SetBitmap()方法设置的位图的句获得通过SetCursor()方法设置的光标图像的句获得由SetIcon()设置的图标句【例10-1】创建如图10.1所示的按钮控件系列。当单击第1个按钮时,按钮上的文字选按钮,点击了哪个按钮就弹出你选择了哪个控件的提示消息框,如图10.2所示。10.1按钮示例界10.2按钮被按下后的响应界创建项目。创建一个基于框的MFC应用程序创建过程参见9.4节,项目名称10-1。打开框资源编辑界面,选择“视图”→“资源视图”选项,在“资源视图”IDIDD_MY101_DIALOG的框资源,显示该框的编辑界面,如图10.310.3资源编辑界添加控件删除框中默认的3个控件(1个静态文本框和2个按钮)(选中相应控按住鼠标,将控件拖入框界面上相应的位置,如图10.4所示(3种控件的类型分别为Button,CheckBox和RadioButton)。10.4添加控件后的界面10-4。10-4各控件的属性设Caption属对于RadioCheck类型的按钮Auto属性设置为true,就不需要另外响应按钮的单击消息,按钮根据用户的单击在选中和不选中之间自动切换。如果设置Auto属性为RadioGroupGroup风格的GroupRadio之间择“格式”→“Tab键顺序”选项,如图10.5(a)所示。按顺序单击控件,会更改控件的Tab键顺序。首先单击第2个按钮,之后的顺序如图10.5(b)所示。通过Tab键顺序可以修改一组按钮控件的先后顺序(不是位置顺序,而是在键盘上按Tab键后的响应顺序)。(a)初始控件顺 (b)调整后的控件顺10.5Tab顺序设Control入/输出的控件(比如说编辑框控件)11右别”下拉列表中选择Control,在“变量名”文本框中输入m_ctrlButton1,其他选项保留默认值。按照上述方法依次为其他控件添加变量,使之符合表10-5的要求。1010章MFC中Windows准控件C++面向C++面向VisualC++案10.6添加控件变10-5控件变量列变量BN_CLICKED(单继续添加框界面上所有控件的单击事件。10.7添加控件消息响应函单选按钮1的消息响应函数代码根据选中标志来弹出 if(m_ctrlRadio1.GetCheck())//如果Radio1选中了,则显示消息框AfxMessageBox(CString("你选中了单选框if(m_ctrlCheck1.GetCheck())//if(m_ctrlCheck1.GetCheck())//如果CheckBox1选中了,则显示选中消息AfxMessageBox(CString("你取消了复选框滚动条MFCCScrollBarCWnd的直接派生类,它同时继承CWnd的所有功能。它在MFC类库中的层次位置如图9.1所示。10-6CScrollBar类的成员函 口内容纵向和横向的滚动。MFC的CScrollBar类提供了一组成员函数用于控件。1010章MFC中Windows准控件C++面向C++面向VisualC++案10-7常用滚动条动作标识及其说 作为任何一个窗口中的子控件,一个滚动条可以通过通知代码来创建,也可以用框资源模板来创建。一个滚动条向它的父窗口发通知消息,这个父窗口通常是由CDialog类派生的,可以通过编写消息和消息处理方法来获取和处理这些消息。消息和消【例10-2】创建一个基于框的MFC应用程序,如图10.8所示。在窗口中,要求10,编辑框中显示滑块当前的值。单击滚动条向上或向下的箭头按钮,滚动条上11;单击滚动条中滑块与两端箭头333;按住滑块上下拖动,编框中的数字变为0。DownDown按钮,滑块移到最下边,编辑框中的数字变为20。10。Exit按钮:单击Exit按钮,退出应用程序 图10.8滚动条应用程序主窗为IDD_MY102_DIALOG,框布局如图10.8所示控件的属性设置见表10-810-8滚动条应用程序控件属性Up按ResetExit按为控件添加变量,变量详细信息见表10-910-9滚动条应用程序控件变量列变量为4charsPos[10]="\0";//itoa函数将数字类型数据(通过GetScrollPos获取的滚动条位置为数字类型)转初始化滚动条。一般在框的初始化函数(函数名称为OnInitDialog)中完成。当一个框对象已经建立还没有显示但是即将显示的时charsPos[10]="\0";//itoa函数将数字类型数据(通过GetScrollPos获取的滚动条位置为数字类型)转添加滚动条消息及其代码。滚动条控件作为框窗口的子控件,它的消息都是发往父窗口(即框)的,所以要处理滚动条消息就需要添加父窗口的滚动条响应消息,在该消息响应函数中处理相应滚动条消息。将工作空间切换到资源编辑视图,选中框(注意不要选中框上任何一个控件),右击,选择“属性”选项,单击“属性”视图中右上角的“消息”图标,在列表中找到WM_VSCROLL消息(在消息列表中有一个名为WM_HSCROLL)项。系统自动进入该消息的响应函数中,在该函数中添加如下滚动条控制代码:{charsPos[10]="\0";intnNowPos=-1;switch(nSBCode)//根据动作标识来做出处理,动作标识见 10-{//设置滚动条的新位置,这个新位置的值nPos由消息响应函数传递过来casenNowPosm_ctrlScrollBar.GetScrollPos();//先获取滚动条原来的位置nNowPos=nNowPos+1;//将获取到的位置值加1if(nNowPos20)//保证不超出最大值nNowPos=20;m_ctrlScrollBar.SetScrollPos(nNowPos);//重新设置滚动条的位 //进行数字和字符casecaseSB_PAGEDOWN:…//与上述SB_LINEDOWN代码类似,位置减3,但case…//与上述SB_PAGEDOWN代码类似,位置加3,但}}OnVScroll(UINTnSBCodeUINTnPos,CScrollBar*pScrollBar)3个参数,第1个参nSBCode表示滚动条发生的动作的代码,如单击向上箭头,或者单击向下箭头等2nPos表示滑块在滚动条中的位置;第3nScrollBar表示与事件3个参数来决定是哪 DownReset按钮的单击响应事件,其代码读者可仿照上述代码,将值分别设置为20和10。C++面向C++面向VisualC++案1010章MFC中Windows准控件列表框MFCCListBox,该类的层次结构如图9.1所示。列表框经常用在框里,如用列表框选择文件名、等。列表框有一个预定义的键盘接口,用户可以用键盘的上/PageUpPageDown键在列表框中进行数据选择,或通过设置列表框的相关属性来允许与Shift或Ctrl键组合使用。CListBox类为处理和列表框和列表框中的数据提供了许多成员函数,如通用的成10-10CListBox10-10ClistBox类成员函 个成员函数专门处理单选列表框:GetCurSel()和SetCurSel()。GetCurSel()获得当前列表选项的下标(0),SetCurSel()设置列表框中当前的选择项(选中的选项会高亮显示)。决在一个列表框中选择多项带来的复杂性。表10-11列出了特定的多选列表框的函数。 框中的字符串项。表10-12列出了用于处理CListBox对象的字符串成员函数。10-12CListBox列表框中字符串的成员函 当用户与列表框交互时,列表框向应用程序发出MAND消息。该消息的字参数(ram)的高字节标识列表框动作的消息通知码(LBN_DBLCLK标识用户双击列表项);低字节为控件标识值。应用程序中常用的列表框通知码及其说明见表10-13。10-13常用列表框通知码及通知 LBNLBN10-3创建一个采用常用样式的单选列表框,并在该列表框中列出当前下的文件,双击某一列表项后删除该项(如图10.9所示)。10.9列表框示例运行界10.9所示,这两个控件的IDIDC_STATIC_DIRIDC_LIST_DIR。IDC_LIST_DIRControl类别的CListBoxm_ctrlListDir,为控IDC_STATIC_DIRControlCStaticm_ctrlStaticDir。在框的初始化函数中添加如下初始化列表框内容charszDir[MAX_PATH];charszDir[MAX_PATH];m_ctrlListDir.Dir(DDL_READWRITE,"*.*");为了实现双击列表框条目将其删除的功能,需要在列表框上添 intintnIndexm_ctrlListDir.GetCurSel();//获取当前选择的项目CStringstrTemp;strTemp项目strTemp已被删除!";//编辑框编辑框控件是个非常简单的矩形窗口,可以自带滚动条,显示多行文本。Windows中和多行编辑框控件。熟悉编辑框的制作对于Windows编程来说非常重要。来的,它具有CWnd的所有功能,它在MFC类中的位置层次如图9.1所示。10-14CEdit类的通用成员函数及 将编辑框控件当前的选择(如果有的话)以CF_TEXT格式到剪贴板 格式为CF_TEXT时方EX_MULTILINE样式时,表示该控件是一个多行编辑框控件,该10-15CEdit10-15多行编辑框控件所支CEdit成员函 与列表框相似,编辑框通过向其父窗口发送MAND消息通知应用程序用户的交互信息。该消息的字参数(ram)的低字节为控制标识,高字节标识编辑框动作的消息通知码。常用码及其说明见表10-16。10-16编辑框常用消息通知码及其说通知 通知 编辑框中的用户输入已达到【例10-4】创建基于框的应用程序,如图10.10所示。在程序主窗口中有两个可Edit1Eidt27个单击Clear1按钮,编辑框Edit1单击Clear2按钮,编辑框Edit2单击Transfer按钮,将编辑框Edit1中的内 到Edit2中UndoUndo按钮,则又恢单击Exit10.1010-4应用程序运行界面新建一个基于框的MFC应用程序,名称为10-4(创建过程参见9.4节)在主框窗口上如图10.10所示安排控件,它们的属性设置见表10-171010章MFC中Windows准控件11/tl/l(i

C++面向VisualC++表10-17框中各个控件的属性设置列 MFC中操作组合框的类为CComboBox。组合框的常见样式见表10-19。10-19组合框常用样式及其说 组合框通过向其父窗口发送MAND消息通知应用程序用户的交互信息。该10-20。10-20组合框常用通知码及通知 通知 组合框中列表框部分所新建一个基于框的MFC应用程序,名称为10-5(创建过程参见9.4小节)添加一个该控件的Control类别变量 boBox,变量类型为CComboBox。在框的初始化函数中添加如下代码 …//照此语句添加Tuesday、Wednesday、Thursday、Friday、Saturday和Sunday选boBox.SetCurSel(0);//设置当前1C++面向C++面向VisualC++案1010章MFC中Windows准控件CString数 当用户在组合框中选择了内CString数 Type属性的值分别改为SimpleDropdownDrop10.11组合框例子程序运行 框通用控新建一个基于框的MFC应用程序,项目名称为10-6(创建过程参见9.4节),删除10.12用Picture控件实现分隔

控件有很多功能,通过不同属性的组合Picture控件能够实现意想不到的效果。有时候界面上需要一条分隔线,可以使用Picture控件高度调整到最细,这时,Picture控件看起来就像一条分隔线,如图10.12所示。blue-dot.bmp的位图文件放加资源”框中选择“Bitmap”(如图10.13所示),单击“导入”按钮,定位到本地硬盘BitmapIDIDB_BITMAP1ID不修改。 控件就可以成功显示了,如图图10.13导入位图资 图10.14Picture控件显示中用来控制Spin控件的类是CSpinButtonCtrl,该类的常用成员函数见表10-21。10-21CSpinButtonCtrl类常用成员函数及 在【项目10-6】的主框窗口上放置一个Edit控件和一个Spin控件,Spin控件紧挨着Edit控件放(这两个控件TabOrder相邻,Edit控件的TabOrder要比Spin控件的TabOrder小)Spin控件的Alignment属性设置为RightAlign, CSpinButtonCtrl*pSpin=(CSpinButtonCtrl*)GetDlgItem(IDC_SPIN1);pSpin->SetRange(0,100);//通过前面获取的指针设置Spin控件的范围pSpin->SetPos(50);//通过前面获取的指针设置Spin//通过Getbuddy//设置编辑框的内容(Spin的当前位置除以10再显示)//判断当前滚动条消息是谁发出来的,这里是通过GetDlgCtrlID函//获取控件ID来比较的,跟例题10-2中通过变量地址来比较效果一//判断当前滚动条消息是谁发出来的,这里是通过GetDlgCtrlID函//获取控件ID来比较的,跟例题10-2中通过变量地址来比较效果一{CString//格式化需要显示的内容,存放到CString变量strValue.Format("%3.1f",((CSpinButtonCtrl*)pScrollBar)->GetBuddy()-}10.15Spin控件的使

进度条控件是一个用来指示长时间操作的进展程MFC中用来操作进度条控件的类是CProgressCtrl,员函数及其说明见表10-22。10-22CProgressCtrl类的主要成员函数及其说 CProgressCtrl*pProgCProgressCtrl*)GetDlgItem(IDC_PROGRESS1);pProg->SetPos(50);//设置当前CProgressCtrl*pProgCProgressCtrl*)GetDlgItem(IDC_PROGRESS1);pProg->SetPos(50);//设置当前CProgressCtrl*CProgressCtrl*pProgCProgressCtrl*)GetDlgItem(IDC_PROGRESS1); 借助这类事件可以产生定时执行某一动作的效果。SetTimer函数包含3个参数,第1个参数表示当前Timer事件的(一个窗口中可以设置多个Timer事件);第2个参数表示每隔多长时间去执行指定的相同动作(程序中表现在执行某一函数),以毫秒为单位;第3个参数表示到了指定的时间间隔后执行的函数指针,在框编程中通常设置为null,表示执行的动作是添加到窗口类的WM_TIMER事件中的。也就是说,在同一个窗口类中,不同Timer事件的时间到达之后,都是执行一个相同的函数——WM_TIMER事件的消息SetimerTimerKillTimer函数停止这个Timer事件。添加框的WM_TIMER消息响应(具体方法与10.3.2节添加框的滚动条 消息响应的方法相同),然后在该事件的消息响应函数中添加如下代码: {CProgressCtrl*pProgCProgressCtrl*)GetDlgItem(IDC_PROGRESS1);pProg->SetPos(pProg->GetPos()+1);//重新设置为加1{KillTimer(nIDEvent);//删除Timer事AfxMessageBox(CString("完成!"));//提示}}10.16Progress控件的使分有用。MFCCSliderCtrl10-23。10-23CSliderCtrl类的主要成员函数及其说 CStringCSliderCtrl*pSliderCSliderCtrl*)GetDlgItem(IDC_SLIDER1);SetDlgItemText(IDC_SLIDER_STATIC,strValue);//将当前位置显示到静态在【项目10-6】的主框上增加一个Slider控件,设置Point属性为Bottom/Right,在旁边添加一个Stactic来显示滑块的当前位置,ID设置IDC_SLIDER_STATIC。在CStringCSliderCtrl*pSliderCSliderCtrl*)GetDlgItem(IDC_SLIDER1);SetDlgItemText(IDC_SLIDER_STATIC,strValue);//将当前位置显示到静态滑块控件是竖直的则添加WM_VSCROLL消息),在消息响应函数中添加如下代码:if(pScrollBar->GetDlgCtrlID()if(pScrollBar->GetDlgCtrlID()==IDC_SLIDER1)//{CSliderCtrl*pSliderCSliderCtrl*)pScrollBar;//强制类型转换CStringstrValue; pSlider->GetPos());//SetDlgItemText(IDC_SLIDER_STATIC,strValue);//}10.17Slider控件的使DateTimePicker控件可以用来接收日期或者时间输入,用户可以直接按照指定的形式输入,也可以在弹出的日历控件中选择日期。MFCDateTimePicker控件的类为CDateTimeCtrl,该类的主要成员函数见表10-24。10-24CDateTimeCtrl CDateTimeCtrl*pDT=CStringstrFormat今天是:yy-MM-dd初始化日期格式字符串IDIDC_TIME_BUTTON,Caption属性值设为CDateTimeCtrl*pDT=CStringstrFormat今天是:yy-MM-dd初始化日期格式字符串CDateTimeCtrl*pDT=pDT->GetTime(t);// CStrings=t.Format("%A,%B%d,%Y%H:%M:%S");10.18DateTimePicker控件的使列表控件是Windows应用程序中最常见的控件之一,如Windows的“资源管理器”右列表控件通常用来显示若干项,每一项包括一个图标和一个,还可以有其他附加是图标和,其他都是子项,是次要的信息。列表控件不是表格控件,在列表控件中列作列表控件的类为CListCtrl,该类的常见成员函数见表10-25。10-25CListCtrl类的主要成员函数及其说 设置列表项的文启动显示编辑文图标视图:每项显示32×32图标,在图标下面显示。用户可以将图标拖放到小图标视图:每项显示16×16图标,在图标右边显示。用户可以将图标拖放列表视图:每项显示16×16图标,在图标右边显示。每一项按列排列,不能列表视图中的每一项具有一个图标、一个、当前状态和相关数据。一个项可以设报表视图风格中,视图内含有一个标题栏控件,在MFC中用CHeaderCtrl类来表示。列表中的图标,标题栏,应用程序的状态都是通过来表示的,通常保存在图表10-26列表控件支持的4种类 源视图”的Icon节点上右击,选择“Icon”选项,系统会自动添加一个默认的图标资IDIDI_ICON_BLACK。然后可以在右边的资源编辑视图中画CImageList用来保存图标的数据结构,即CImageListCImageList在框初始化函数中添加如下代码(加在DateTimePicker的初始化代码后面HICONHICON//创建图标列表,Create前两个参数表示一个图标的大小, 3//第4个参数表示列表初始大小,第5个参数表示列hIcon[0AfxGetApp()->LoadIcon(IDI_ICON_WHITE);//装载资源号为IDI_ICON_WHITE的图标for(intn=0n<8n++)//将图标加到列表staticstaticchar*color[]={"white","black","red","blue","yellow","cyan",CListCtrl*pList=(CListCtrl*)GetDlgItem(IDC_LIST1);//获得控件对象 for(intn=0;n<8;n++)//开始为列表框添加项//第1个参数为项id,第2个参数为 3个为对应 CListCtrl*pList=(CListCtrl*)GetDlgItem(IDC_LIST1);//获得控件对象 for(intn=0;n<8;n++)//开始为列表框添加项//第1个参数为项id,第2个参数为 3个为对应 pList->SetBkColor(RGB(0,255,255));//设置背pList->SetTextBkColor(RGB(255,0,255));//设置文字的背景LVN_ITEMCHANGED消息响应(当列表框中的选项发生改变时,会发出此消息),CListCtrl*CListCtrl*pListCListCtrl*)GetDlgItem(IDC_LIST1);//获得控件对象intnSelected=pNMLV->iItem;//获取当前选择的项idif(nSelected>={ }//强制类型转换,此时参数pNMHDR指向的是一个NM_LISTVIEW对NM_LISTVIEW*pNMListView=CListCtrl*pListCListCtrl*)GetDlgItem(IDC_LIST1);//获得控件//强制类型转换,此时参数pNMHDR指向的是一个NM_LISTVIEW对NM_LISTVIEW*pNMListView=CListCtrl*pListCListCtrl*)GetDlgItem(IDC_LIST1);//获得控件对象intnSelected=pNMListView->iItem;//获取当前选择的项idif(nSelected>=0)pList->EditLabel(nSelected);//开始编LVITEMitempDispInfo->item;//获取修改过的项信息CStringstrValue=item.pszText;//LVITEMitempDispInfo->item;//获取修改过的项信息CStringstrValue=item.pszText;//取出新修改的项if(strValue.GetLength0)//{CListCtrl*pListCListCtrl*)GetDlgItem(IDC_LIST1);//获得控件对象}编译,运行程序,程序最后的运行效果如图10.1910.19列表控件的使CTreeCtrl,该类的主要成员函数见表10-27。10-27类CTreeCtrl的主要成员函数及其说 自画的图标。在框界面上添加一个TreeControl控件,保留默认ID值不变,将HasEditLabels表示是否可编辑CTreeCtrl*CTreeCtrl*pTree=(CTreeCtrl*)GetDlgItem(IDC_TREE1);//获取树状控件对象pTree->SetImageList(&m_imageList,TVSIL_NORMAL);//设置 TV_INSERTSTRUCTtvinsert;//创建待 的TV_INSERTSTRUCT结构tvinsert.hParent=NULL;//第1层,无父节点tvinsert.item.maskTVIF_IMAGE|TVIF_SELECTEDIMAGE|TVIF_TEXT;tvinsert.item.hItem=NULL;//句柄设置为空tvinsert.item.stateMask0不使用状态掩码,设置tvinsert.item.iSelectedImage1;C++面C++面向VisualC++案1010章MFC中Windows准控件tvinsert.item.cChildrentvinsert.item.cChildren0没有子节点tvinsert.item.iImage2;平常显示的图标索引tvinsert.item.pszText="father";//节点HTREEITEMhDad=pTree->InsertItem(&tvinsert); HTREEITEMhMom=pTree->InsertItem(&tvinsert); tvinsert.hParenthDad在父节点为“father”下添加tvinsert.item.iImage=3;//平时显示的图标索引//…参照图10.20照上述语句 father的2个子节点:son和daughtertvinsert.hParent=hMom;//在父节点“mother”下添加tvinsert.item.iImage=4;//…参照图10.20照上述语 mother的3个字节点:son、daughter和HTREEITEMhOther=pTree-tvinsert.hParenthOther父节点为“cartoon”tvinsert.item.iImage=7;//…参照图10.20照上述语 cartoon的2个字节点:Tom和10.20树状控件节点关系

10.20所示的树状结构加入到理解上述代码的关键在于理解函数InsertItem和数据结构TV_INSERTSTRUCT和TV_ITEM。InsertItem函数的功能TV_INSERTSTRUCT的参数来描述,该结构的主要成员见表10-28TV_INSERTSTRUCT结构主要成 表示hParent项下一层的位置:TVI_FIRST表示第一个位置具体项的数据,类型TV_ITEM结构成员10-29,mask的取值

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论