Windows标准控件在可视化编程中的应用.ppt

上传人:za****8 文档编号:3203325 上传时间:2019-12-08 格式:PPT 页数:132 大小:1.51MB
返回 下载 相关 举报
Windows标准控件在可视化编程中的应用.ppt_第1页
第1页 / 共132页
Windows标准控件在可视化编程中的应用.ppt_第2页
第2页 / 共132页
Windows标准控件在可视化编程中的应用.ppt_第3页
第3页 / 共132页
点击查看更多>>
资源描述
1,第9章Windows标准控件在可视化编程中的应用,2,控件是Windows图形用户界面的主要组成部分之一,用户通过操作控件对象完成与应用程序之间的交互。控件的使用集中体现了Windows系统面向对象的特点,3,9.1概述,9.1.1在程序界面中增加控件方法,1.使用类的成员函数完成控件的增加,使用控件类定义一个实例对象,Cbuttonmybtn;,调用该类的Create()函数创建相应的控件,Mybtn.Create(DWORDdwStyle,constRECT,使用ShowWindow()函数显示该控件,ShowWindow(),调用MoveWindow()、SetWindowPos()、SetWindowText()等函数等窗口管理函数来移动、显示或隐藏控件、改变控件的位置、尺寸以及其它操作,4,系统预定义的窗口类,2.使用可视化工具在基于对话框的应用程序中添加控件,5,9.1.2为控件添加消息映射,消息映射:对控件进行操作,从而引发各种事件,在应用程序中添加控件的消息响应的方法,并将之绑定的机制。如:ON_BN_CLICKED(IDC_BUTTON1,OnBnClickedButton1),6,标明了消息的类型,控件的ID,处理消息的函数,在对话框对应的头文件中申明处理事件的函数;如:afx_msgvoidOnBnClickedButton1();,消息映射形式:BEGIN_MESSAGE_MAPON_BN_CLICKED(IDC_BUTTON1,OnBnClickedButton1)END_MESSAGE_MAP,7,8,9,控件及其相应的通知代码,10,为控件的事件添加消息映射,11,为处理消息的成员函数添加代码voidCch07_1_2Dlg:OnBnClickedExit()OnOK();,9.1.3在应用程序中使用控件,1.使用GetDlgItem函数根据控件ID来获取控件的地址。GetDlgItem函数的原型为:virtualCWnd*GetDlgItem(intnID)const;CEdit*pEdit;/定义一个指向CEdit控件指针pEdit=(CEdit*)GetDlgItem(IDD_EDIT1);/获取ID为IDD_EDIT1编辑框的指针pEdit-SetSel(2,5);/使用控件指针,12,2、为控件定义标识符如果控件使用频繁,可为控件指定一个标识符。控件类型有两种:一种是控件类型,这样定义的控件标识符就是控件类的实例对象,可以用标识符访问类的所有成员;另一种是将控件定义为一个C+数据类型,如将编辑框定义为CString类型。,13,14,控件定义为value类型的刷新问题:刷新操作都是通过DDX技术来完成,DDX是将控件ID和控件变量绑定的一种技术,其数据交换通过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类”,然后,单击“添加”按钮,16,2、指定派生类的基类,输入新类的名称,3、增加类的成员,扩展控件类的功能;4、为控件定义变量,在变量类型中输入自定义的控件类,17,9.2按钮控件及其应用,按钮控件,普通按钮圆按钮复选框按钮组框按钮自绘按钮,18,9.2.1按钮控件的创建过程,CButton类的成员函数Create负责创建按钮控件,该函数的声明为:BOOLCreate(LPCTSTRlpszCaption,/指定了按钮显示的正文DWORDdwStyle,/按钮的风格constRECTvoidCch07_1Dlg:OnBnClickedButton2()m_btn2.SetWindowText(L按钮已被按下!);voidCch07_1Dlg:OnBnClickedRadio3()m_rad3.SetCheck(1);m_rad4.SetCheck(0);,26,voidCch07_1Dlg:OnBnClickedRadio4()m_rad3.SetCheck(0);m_rad4.SetCheck(1);voidCch07_1Dlg:OnBnClickedCheck2()if(m_chk2.GetCheck()m_chk2.SetCheck(0);elsem_chk2.SetCheck(1);,27,9.3滚动条控件,滚动条是一个交互式的、高度可视化的控件它包括一个滑块、滚动条的两端的按钮等。,滚动条控件与属于窗口的滚动条是不一样的,处于窗口的滚动条是由该窗口创建、管理和释放的,滚动条控件是由用户创建、管理和释放的,28,9.3.1滚动条类的结构及其方法,滚动条可以通过通知代码来创建,也可以用对话框资源模板来创建,29,常用滚动条动作标识及其说明SB_TOP/SB_BOTTOM:滚动到滚动条最顶/底端SB_LINEUP/SB_LINEDOWN:向上/下滚动一行SB_LEFT/SB_RIGHT:滚动到左/右边SB_LINELEFT/SB_LINERIGHT:向左/右滚动一行SB_PAGEUP/SB_PAGEDOWN:向上/下滚动一页SB_PAGELEFT/SB_PAGERIGHT:向左/右滚动一页SB_THUMBPOSITION:滚动框移动到新位置SB_THUMBTRACK:滚动框被拖动SB_ENDSCROLL:滚动到最终位置,30,9.3.2创建与初始化滚动条类,31,在设置滚动条控件时,要通过如下方法设置其范围CScrollBar:SetScrollRange()例如,设置滚动范围为-100到100的垂直滚动条pMyScroll-SetScrollRange(SB_VERT,-100,100);,通过SetScrollPos()设置滚动块当前位置例如,滚动快的位置在-100到100的中间,即为0的位置pMyScroller-SetScrollPos(0);,32,9.3.3滚动条类编程实例,33,(1)应用程序的可视化编程部分,34,(2)应用程序的代码编程部分,在Cch07_2Dlg类中加入一个成员函数ChangeDisplayInfo(intpos),用于将数值型参数pos显示到编辑框控件中,voidCch07_2Dlg:ChangeDisplayInfo(intpos)TCHARsPos10;_itow(pos,sPos,10);m_dispinfo.SetSel(0,-1);m_dispinfo.ReplaceSel(sPos);UpdateData(FALSE);/将与控件绑定的变量内容显示到屏幕上,函数_itow(pos,sPos,10)是将数值pos按十进制形式转化到字符串sPos中,SetSel()和ReplaceSel()是CEdit类的成员函数,SetSel(0,-1)表示选中编辑框中的所有内容,ReplaceSel(sPos)表示用sPos的值去替换编辑框中的内容。,37,BOOLCch07_2Dlg:OnInitDialog()CDialog:OnInitDialog();SetIcon(m_hIcon,TRUE);SetIcon(m_hIcon,FALSE);m_scrollbar.SetScrollRange(0,20);m_scrollbar.SetScrollPos(10);ChangeDisplayInfo(m_scrollbar.GetScrollPos();returnTRUE;,(b)初始化滚动条,在Cch07_2Dlg的属性框中选择“消息”选项卡,选择“WM_VSCROLL”消息,单击右侧的向下的箭头按钮,然后添加一个成员函数OnVScroll,39,(3)给滚动条消息添加代码voidCch07_2Dlg:OnVScroll(UINTnSBCode,UINTnPos,CScrollBar*pScrollBar)intiNowPos;switch(nSBCode)if(pScrollBar=,40,caseSB_LINEDOWN:iNowPos=m_scrollbar.GetScrollPos();iNowPos=iNowPos+1;if(iNowPos20)iNowPos=20;m_scrollbar.SetScrollPos(iNowPos);ChangeDisplayInfo(m_scrollbar.GetScrollPos();break;,41,caseSB_LINEUP:/单击滚动条向上的箭头iNowPos=m_scrollbar.GetScrollPos();iNowPos=iNowPos-1;if(iNowPos20)iNowPos=20;m_scrollbar.SetScrollPos(iNowPos);ChangeDisplayInfo(m_scrollbar.GetScrollPos();break;,43,caseSB_PAGEUP:/单击滚动条上面的箭头与滚动块之间的区域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_VSCROLL消息的响应:voidCEx9_9Dlg:OnVScroll()if(pScrollBar-GetDlgCtrlID()=IDC_SPIN1)CStringstrValue;strValue.Format(L%3.1f,(double)nPos/10.0);(CSpinButtonCtrl*)pScrollBar)-GetBuddy()-SetWindowText(strValue);CDialog:OnVScroll(nSBCode,nPos,pScrollBar);,103,9.8.3Progress控件的使用,进度控件是一个用来指示长时间操作的进展程度的控件。MFC中表示进度控制的是CProgressCtrl类,进度条有一个范围和当前位置。范围表示整个操作的持续时间,当前位置表示当前进行到的位置,进度条根据当前位置来判断进行的百分比,来显示进度,104,添加一个Progress控件,保持默认ID,设置Smooth属性。在旁边添加一个按钮,设置ID为“IDC_BUTTON_START”,Caption为“开始”,在OnInitDialog中添加如下代码:CProgressCtrl*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消息的响应函数: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秒,进度条前进一步,106,9.8.4Slider控件的使用,滑块控件可以使用户通过拖动滑块来快速获得指定的数据。当用户滑动滑块的时候,控件将发送消息来指示变化。,滑块控件在你选择一系列离散值或者一段连续范围内的时候十分有用。,CProgressCtrl类的主要成员,108,在对话框上增加一个Slider控件,设置Point属性为“Bottom/Right”,然后在旁边添加一个Static控件,ID设置为IDC_STATIC_SLIDER。该控件用来显示滑块的当前位置。,在OnInitDialog函数中添加如下代码:CProgressCtrl*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(2008,100,NULL);,109,为了响应滑块移动的消息,添加WM_HSCROLL消息的响应(Slider是水平的,如果是垂直的,则需要响应WM_VSCROLL)。实现如下:voidCEx9_9Dlg:OnHScroll()if(pScrollBar-GetDlgCtrlID()=IDC_SLIDER1)CSliderCtrl*pSlide=(CSliderCtrl*)pScrollBar;CStringstrText;strText.Format(L%d,pSlide-GetPos();SetDlgItemText(IDC_STATIC_SLIDER,strText);CDialog:OnHScroll(nSBCode,nPos,pScrollBar);,110,9.8.5DateTimePicker控件的使用,DateTimerPicker可以用来接收日期或者时间输入。用户可以直接按照指定的形式输入,也可以在弹出的日历控件中选择日期。,如果让用户以字符串形式输入,则由于输入的多样性,程序不好解析,111,CDateTimeCtrl类主要成员,112,在对话框上添加一个DateTimePicker控件,设置Format为“ShortDate”,选择“UseSpinControl”,如果不选择使用Spin控件,则用户在弹出的日历控件中进行输入。在该控件旁边添加一个按钮,ID为“IDC_BUTTON_TIME”,Caption为“报时”。,在OnInitDialog中添加如下代码:CDateTimeCtrl*pDT=(CDateTimeCtrl*)GetDlgItem(IDC_DATETIMEPICKER1);CStringformatStr=_T(今天是: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);,114,9.8.6ListControl控件的使用,列表控件,115,列表控件是Windows应用程序中最常用的控件之一。最常见的用途就是资源管理器右边的文件列表。,MFC中使用CListCtrl类来封装列表控件的功能。列表控件通常可以包括一个图标和一个标签。此外,每一项还可以具有其它附加信息,例如资源管理器中文件的具体信息就是附加信息。,116,列表控件的视图风格,图标视图:每项显示3232图标,在图标下面显示标签。用户可以将图标拖放到视图内任何位置,小图标视图:每项显示1616图标,在图标右边显示标签。用户可以将图标拖放到视图内任何位置,列表视图:每项显示1616图标,在图标右边显示标签。每一项按列排列,不能随意拖动图标,报表视图:每项占一行,第一列是主项,显示1616图标,在图标右侧显示标签。右边的列显示子项,具体由程序来决定,117,列表控件的主要成员,118,为使用列表控件,首先需要创建图标资源,在ResourceView的Icon一栏内创建8个图标资源,在Cex9_9Dlg类中增加成员如下:CImageListm_imageList;在OnInitDialog函数中添加初始化图片列表的代码: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=AfxGetApp()-LoadIcon(IDI_ICON_CYAN);hIcon6=AfxGetApp()-LoadIcon(IDI_ICON_PURPLE);hIcon7=AfxGetApp()-LoadIcon(IDI_ICON_GREEN);for(n=0;nSetImageList(/设置文字的背景色现在编译运行已经可以看到列表的运行效果了。,121,在列表控件下添加static控件,ID为IDC_STATIC_LIST。对列表控件添加对LVN_ITEMCHANGED消息的响应:voidCEx9_9Dlg:OnItemchangedList1()NM_LISTVIEW*pNMListView=(NM_LISTVIEW*)pNMHDR;/TODO:AddyourcontrolnotificationhandlercodehereCListCtrl*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()/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,运行程序,右击某一项,已可以编辑标签了,但无法保存编辑效果。若要保存,需要响应列表控件的LVN_ENDLABELEDIT消息,在这里可以判断新输入的文字是否合法,然后设置标签为编辑得到的文字:voidCEx9_9Dlg:OnEndlabeleditList1()LV_DISPINFO*pDispInfo=(LV_DISPINFO*)pNMHDR;/TODO:AddyourcontrolnotificationhandlercodehereLVITEMAitem=pDispInfo-item;CStringstr=item.pszText;str.TrimLeft();str.TrimRight();if(str.GetLength()0)CListCtrl*pList=(CListCtrl*)GetDlgItem(IDC_LIST1);pList-SetItemText(item.iItem,item.iSubItem,item.pszText);*pResult=0;,124,9.8.7TreeControl控件的使用,树状视图控件是一种用来显示层次结构的控件,例如Windows资源管理器左边的视图。视,图中的每一项包括一个标签,位图是可选的,每项还可以附加若干子项。点击每一项,可展开或合拢当前树节点,125,本例中继续使用ListControl中的图标。接下来在对话框中添加树状控件,其ID为IDC_TREE1,选中Hasbuttons、Haslines、Linesatroot和Editlabels属性,Hasbuttons:决定可展开项之前是否有“+”、“”按钮HasLines:决定相关节点之间是否显示虚线连接Linesatroot:决定位于第一层的节点之间是否有虚线连接Editlabels:表示标签是否可编辑,126,然后在OnInitDialog函数中添加如下代码:CTreeCtrl*pTree=(CTreeCtrl*)GetDlgItem(IDC_TREE1);pTree-SetImageList(/自定义数据,127,/创建第一层tvinsert.item.iImage=2;/一般图标tvinsert.item.pszText=Lfather;/插入第一层第一个节点HTREEITEMhDad=pTree-InsertItem(,128,tvinsert.item.pszText=Lson“;/插入第二层的第一个节点pTree-InsertItem(,129,理解上述代码的关键在于理解关键函数InsertItem和TV_INSERTSTRUCT和TV_ITEM数据结构。InsertItem的函数执行的功能是向树状控件中插入一项,至于这一项什么样子,要插入到什么位置,全部由InsertItem的TV_INSERTSTRUCT类型的参数来描述,,130,下面通过添加一些对树状控件常用消息的响应来说明树状控件的一般使用方法。首先在树状控件旁边添加一个static控件,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(hSelected!=NULL)chartext31;TV_ITEMitem;item.mask=TVIF_HANDLE|TVIF_TEXT;item.hItem=hSelected;item.pszText=text;item.cchTextMax=30;VERIFY(pTree-GetItem(,131,在向对话框添加控件时,设置了Editlabels属性,使得树状控件可编辑,双击节点文字便进入编辑状态,响应编辑状态结束消息呢的方法与响应列表控件的编辑结束消息完全一样。对TVN_ENDLABELEDIT消息的响应函数,实现如下:voidCEx9_9Dlg:OnEndlabeleditTree1()TV_DISPINFO*pTVDispInfo=(TV_DISPINFO*)pNMHDR;/TODO:AddyourcontrolnotificationhandlercodehereTVITEMAitem=pTVDispInfo-item;CStringstr=item.pszText;str.TrimLeft();str.TrimRight();if(str.GetLength()0)CTreeCtrl*pTree=(CTreeCtrl*)GetDlgItem(IDC_TREE1);pTree-SetItemText(item.hItem,item.pszText);*pResult=0;,132,
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!