《对话框和常用控》PPT课件.ppt

上传人:sh****n 文档编号:11575849 上传时间:2020-04-29 格式:PPT 页数:80 大小:811.31KB
返回 下载 相关 举报
《对话框和常用控》PPT课件.ppt_第1页
第1页 / 共80页
《对话框和常用控》PPT课件.ppt_第2页
第2页 / 共80页
《对话框和常用控》PPT课件.ppt_第3页
第3页 / 共80页
点击查看更多>>
资源描述
第5章对话框和常用控件,5.1对话框的使用5.2控件的创建和使用方法5.3常用控件5.4通用对话框和消息对话框,5.1对话框的使用,5.1.1模式和无模式对话框模式对话框指当对话框被弹出,用户必须在对话框中作出相应的操作,在退出对话框之前,对话框所在的应用程序不能继续执行。无模式对话框指当对话框被弹出后,一直保留在屏幕上,可继续在对话框所在的应用程序中进行其它操作;需要使用对话框时,单击对话框所在的区域即可激活。在创建和退出对话框窗口时的方式不同:创建时,模式对话框由系统自动分配内存空间,对话框退出时,对话框对象自动删除。无模式对话框需要来指定内存,退出时还需删除对话框对象。退出时,两种对话框所使用的终止函数不一样。模式对话框通过调用CDialog:EndDialog来终止,无模式对话框则是调用CWnd:DestroyWindow来终止。函数CDiaolog:OnOK和CDiaolog:OnCancel是调用EndDialog的,因此无模式对话框必须用DestroyWindow来重载OnOK和OnCancel两个函数。需要正确删除表示对话框的对象。对模式对话框,在创建函数返回后即可删除对象。无模式对话框不是同步的,在创建函数调用后立即返回,因而不知道何时删除对象,但可以通过重载CWnd:PostNcDestroy函数并执行清除操作。,5.1对话框的使用,5.1.2使用对话框编辑器打开对话框编辑器将项目工作区窗口切换到ResourceView页面,双击Dialog目录下任意一个对话框ID。或者,选择“Insert”“Resource”菜单命令(或按快捷键Ctrl+R),选择Dialog项,单击New。,5.1对话框的使用,在对话框中添加和编辑控件(1)控件添加的方法在对话框中添加一个控件的方法有下列几种:在控件工具栏中单击某控件,鼠标箭头在对话框内变成“十”字形状;在对话框指定位置单击鼠标左键,再拖动选择框可改变控件的大小和位置。在控件工具栏中单击某控件,鼠标箭头对话框内变成“十”字形状;在指定位置处单击鼠标左键不放,拖动鼠标至满意位置,释放鼠标键。用鼠标左键点中控件工具栏中的某控件,并按住鼠标键不放;在移动鼠标到对话框的指定位置的过程中,会看到一个虚线框,下面带有该控件的标记;释放鼠标键。,5.1对话框的使用,(2)单个控件的选取鼠标选取保证选择按钮()是被选中的,移动鼠标指针至指定的控件上,单击鼠标左键。助记符选取在相应的控件上右击。选择“Properties”菜单项,对话框中的“Caption”框是用来输入控件的标题,在标题中的某个字母之前键入“/AFX_MSG(2)在MyDlg.cpp源文件开头部分的消息映射入口,添加消息映射宏:BEGIN_MESSAGE_MAP(CMyDlg,CDialog)/消息映射开始/AFX_MSG_MAP(CMyDlg)ON_BN_CLICKED(IDC_BUTTON1,OnButton1)/AFX_MSG_MAPEND_MESSAGE_MAP()/消息映射结束表明消息及其处理函数之间的联系。单击按钮控件IDC_BUTTON1时,系统将自动调用OnButton1函数。(3)在MyDlg.cpp文件中写入一个空的消息处理函数的模板,以便用户填入具体代码,如下面的框架:voidCMyDlg:OnButton1()/TODO:Addyourcontrolnotificationhandlercodehere,5.1对话框的使用,在程序中使用对话框(1)利用项目工作区的ClassView标签项,将Ex_SDIHello.cpp源文件打开;(2)在Ex_SDIHello.cpp源文件的前面加上包含类CMyDlg的头文件:#includeMyDlg.h(3)在InitInstance函数体中的“returnTRUE;”语句之前添加下列代码:CMyDlgdlg;dlg.DoModal();DoModal是模式对话框最常用的函数,它负责对话框的显示和终止。(4)编译并运行。在程序的一开始就出现用户自己设计的对话框,单击Button1按钮将弹出“欢迎进入对话框的设计!”的消息对话框来。,5.2控件的创建和使用方法,5.2.1控件的创建方法控件的创建方式有以下两种:一种是在对话框模板中用编辑器指定控件,也就是说,将控件的父窗口指定为对话框,这样做的好处是明显的,因为当应用程序启动该对话框时,Windows系统就会为对话框创建控件;而当对话框消失时,控件也随之清除。另一种方式是将控件看作是任一窗口的子窗口,并通过调用相应的Create函数来创建。例Ex_SDIHello在上例Ex_SDIHello的基础上用子窗口方式创建控件。(1)打开CMyDlg的头文件MyDlg.h,添加一个按钮类CButton指针变量:classCMyDlg:publicCDialog/Constructionpublic:CMyDlg(CWnd*pParent=NULL);/standardconstructorCButton*m_btnWnd;,5.2控件的创建和使用方法,(2)按Ctrl+W快捷键打开对话框,切换到MessageMaps页面,在ObjectIDs列表中选定“CMyDlg”项,并在Message列表中找到WM_INITDIALOG消息,双击鼠标左键,然后单击EditCode按钮,添加下列代码:BOOLCMyDlg:OnInitDialog()CDialog:OnInitDialog();/TODO:Addextrainitializationherem_btnWnd=newCButton();/构造按钮控件m_btnWnd-Create(你好,WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,CRect(20,20,120,60),this,201);/创建CFont*font=this-GetFont();/获取对话框的字体m_btnWnd-SetFont(font);/设置控件字体returnTRUE;/returnTRUEunlessyousetthefocustoacontrol/EXCEPTION:OCXPropertyPagesshouldreturnFALSECreate用来创建一个按钮控件,第一个参数指定按钮的标题,第二个参数指定控件的风格,第三个参数指定它在父窗口中的位置和大小,第四个参数指定父窗口指针,最后一个参数是指定该控件的标识值。(3)编译并运行,,5.2控件的创建和使用方法,5.2.2控件的数据交换和数据校验例如,为CMyDlg类的按钮控件IDC_BUTTON1添加并使用其成员变量m_MyBtn,则其相应的过程如下:(1)启动MFCClassWizard,切换到MemberVariables页面,如图。(2)选定Classname为CMyDlg,然后在ControlIDs列表中,选定所要关联的控件ID号IDC_BUTTON1,双击鼠标左键或单击AddVariable按钮,如图。,图5.16ClassWziard的“MemberVariables”页面,图5.17“AddMemberVariable”对话框,5.2控件的创建和使用方法,(3)在Membervariablename框中填好与控件相关联的成员变量m_MyBtn,单击OK,在ControlIDs列表中出现刚才添加的内容。需要说明的是,DDV/DDX技术中,允许为同一个控件关联多个数据成员变量,但必须保证这些变量名是互不相同的,且这些变量在同一个类型不能有多个变量。如果添加的成员变量是一个数值类型,则在MFCClassWizard对话框的MemberVariables页面下方还要求用户输入变量的范围,这就是控件的数据校验设置。(4)单击OK,发现ClassWizard作了以下三方面的修改。在MyDlg.h文件中,添加与控件关联的成员变量的声明,代码如下:/DialogData/AFX_DATA(CMyDlg)enumIDD=IDD_DIALOG1;CButtonm_MyBtn;CStringm_strEdit;/AFX_DATA,5.2控件的创建和使用方法,在MyDlg.cpp文件中的CMyDlg构造函数实现代码处,添加数据成员变量的初始代码:CMyDlg:CMyDlg(CWnd*pParent/*=NULL*/):CDialog(CMyDlg:IDD,pParent)/AFX_DATA_INIT(CMyDlg)m_strEdit=_T();/AFX_DATA_INIT在MyDlg.cpp文件中的DoDataExchange函数体内,添加控件的DDX/DDV代码。voidCMyDlg:DoDataExchange(CDataExchange*pDX)CDialog:DoDataExchange(pDX);/调用此函数作为DDX的开始/AFX_DATA_MAP(CMyDlg)DDX_Control(pDX,IDC_BUTTON1,m_MyBtn);DDX_Text(pDX,IDC_EDIT1,m_strEdit);DDV_MaxChars(pDX,m_strEdit,20);/AFX_DATA_MAP,5.2控件的创建和使用方法,(5)为一个控件定义一个关联的数据成员变量后,就可以使用CWnd:UpdateData函数实现控件的控制,包括控件相关数据的输入和读取。运行该程序,当在编辑框中输入“Hello”后,单击Button1按钮,则此时该按钮的名称就变成了编辑框控件中的内容“Hello”,如图。,图5.19使用控件的数据成员变量,5.2控件的创建和使用方法,5.2.3控件的通用属性,图5.20按钮控件的属性对话框,5.2控件的创建和使用方法,5.2.4控件的消息控件的编程和使用过程中,可以向控件发送消息来完成特定的任务,或者是根据控件产生的消息执行自己的代码。应用程序创建一般控件或公共控件之后,控件的状态发生改变时,控件就会向其父窗口发送消息,这个消息称为“通知消息”。对于每个消息,系统都会用一个MSG结构来记录,MSG具有下列结构:typedefstructtagMSG/msgHWNDhwnd;/接收到消息的窗口句柄UINTmessage;/消息WPARAMwParam;/消息的附加信息,它的含义取决于messageLPARAMlParam;/消息的附加信息,它的含义取决于messageDWORDtime;/消息传送时的时间POINTpt;/消息传送时,光标的屏幕坐标MSG;对于一般控件来说,通知消息通常是一条WM_COMMAND消息,这条消息的wParam参数的低位字中含有控件标识符,wParam参数的高位字则为通知代码,lParam参数则是指向控件的句柄。,5.2控件的创建和使用方法,对于公共控件,通知消息通常是一条WM_NOTIFY消息,wParam参数是发送通知消息的控件的标识符,lParam参数是指向NMHDR结构的指针。对于有些控件的通知消息,lParam参数是指向一个更大的结构,且结构中的第一个成员还必须具有NMHDR结构。对于控件的WM_COMMAND或是WM_NOTIFY消息,都可以用ClassWizard对它们加以映射。尽管控件的各自通知消息并不相同,但下列的通知消息是所有Windows控件所共有的:NM_CLICK在控件中单击鼠标左按钮NM_DBLCLK在控件中双击鼠标左按钮NM_RCLICK在控件中单击鼠标左按钮NM_RDBLCLK在控件中双击鼠标右按钮NM_RETURN当控件具有输入焦点时按下ENTER键NM_SETFOCUS控件得到输入焦点NM_KILLFOCUS控件失去输入焦点NM_OUTOFMEMORY没有足够的内存使控件完成操作,5.3常用控件,根据控件的特性和功能,一般可将其分为三类:Windows公共控件、ActiveX控件以及MFC新增的一些控件等。,5.3常用控件,5.3.1静态控件和按钮静态控件一个静态控件是用来显示一个字符串、框、矩形、图标、位图或增强的图元文件。它可以被用来作为标签、框或用来分隔其它的控件。一个静态控件一般不接收用户输入,也不产生通知消息。在对话框编辑器的控件工具栏中,属于静态控件的有:静态文本()、组框()和静态图片()三种。,图5.21静态图片控件的General和Style属性对话框,5.3常用控件,按钮(1)按键按钮通常可以立即产生某个动作,执行某个命令,常被称为命令按钮。两种风格:标准按键按钮和默认按键按钮。从外观上来说,默认按键按钮是在标准按键按钮的周围加上一个黑色边框,这个黑色边框表示该按钮已接受到键盘的输入焦点,只须按回车键就能按下该按钮。具体设定的方法是在按键按钮属性对话框的Style页面中选中“Defaultbutton”项。(2)单选按钮外形是在文本前有一个圆圈,被选中时,就标上一个黑点,可分为一般和自动两种类型。自动类型中,若选中同组按钮中的某个单选按钮,则其余的单选按钮的选中状态就会清除,保证了多个选项始终只有一个被选中。(3)复选框外形是在文本前有一个空心方框,被选中时,复选框中就加上一个“”标记,三态复选框还有种处于灰框状态,表示“不确定”。设定成三态复选框的方法是在复选框属性对话框的Style页面中选中“Tri-state”项。,5.3常用控件,按钮的消息常见的只有两个:BN_CLICKED和BN_DOUBLE-CLICKED。按钮选中操作最常用的按钮操作是设置或获取一个或多个按钮的选中状态。CButton类的成员函数SetCheck和GetCheck设置或获取指定按钮的选中状态,原型:voidSetCheck(intnCheck);intGetCheck()const;nCheck和GetCheck函数返回的值可以是:0表示不选中,1表示选中,2表示不确定(仅用于三态按钮)。对于多个单选按钮的选中状态的设置或获取,需要使用CWnd类的成员函数CheckRadioButton和GetCheckedRadioButton,原型:voidCheckRadioButton(intnIDFirstButton,intnIDLastButton,intnIDCheckButton);intGetCheckedRadioButton(intnIDFirstButton,intnIDLastButton);nIDFirstButton和nIDLastButton指定这组单选按钮的第一个和最后一个按钮ID值,nIDCheckButton指定要设置选中状态的按钮ID值,函数GetCheckedRadioButton返回被选中的按钮ID值。,5.3常用控件,例Ex_Ctrls1用静态图片、单选按钮、复选框和按键按钮控件,设计界面。开始,所有单选按钮都是灰显的,不能选择,选中“允许”复选框后,所有单选按钮可以使用,选定一个单选框后,单击应用。(1)用MFCAppWizard(exe)创建一个名为Ex_CommCtrls的基于对话框的应用程序。在创建的第一步,将应用程序类型选择为DialogBased,按Finish。自动显示出该程序的对话框资源模板内容。(2)打开属性对话框将其标题改为“使用Windows常用控件”。(3)用编辑器为对话框添加如下表所示的一些控件。(4)四个单选按钮的Tab次序应连续,从IDC_RADIO1到IDC_RADIO4依次增加。(5)按Ctrl+W快捷键,切换到MemberVariables页面,在Classname中选择CEx_CommCtrlstDlg,选中复选框控件ID号IDC_CHECK1,双击鼠标或单击AddVariables按钮。,5.3常用控件,(6)切换到ClassWizard的MesssageMaps页面,为复选框IDC_CHECK1和按钮IDC_BUTTON1增加BN_CLICKED的消息映射,添加代码:voidCEx_CommCtrlsDlg:OnCheck1()UpdateData();for(inti=0;iEnableWindow(m_bEnabled);voidCEx_CommCtrlsDlg:OnButton1()UpdateData();if(!m_bEnabled)return;intnID=GetCheckedRadioButton(IDC_RADIO1,IDC_RADIO4);if(nID=IDC_RADIO1)MessageBox(1);if(nID=IDC_RADIO2)MessageBox(2);if(nID=IDC_RADIO3)MessageBox(3);if(nID=IDC_RADIO4)MessageBox(4);,5.3常用控件,(7)定位到CEx_CommCtrlsDlg:OnInitDialog函数体中,添加下列代码:BOOLCEx_CommCtrlsDlg:OnInitDialog()CDialog:OnInitDialog();CheckRadioButton(IDC_RADIO1,IDC_RADIO4,IDC_RADIO1);/设置第一个单选按钮为选中OnCheck1();returnTRUE;/returnTRUEunlessyousetthefocustoacontrol(8)编译并运行。,图5.23按钮示例运行结果,5.3常用控件,5.3.2编辑框编辑框的属性和风格,图5.24编辑框的属性对话框,5.3常用控件,编辑框的基本操作(1)口令设置默认的口令字符是“*”,应用程序可以用成员函数CEdit:SetPasswordChar来定义自己的口令字符,其函数原型如下:voidSetPasswordChar(TCHARch);(2)选择文本用鼠标来选择文本的操作方法:在要选择的文本的一端按下鼠标左键并拖动鼠标,到另一端释放鼠标键。用键盘来选择文本的方法:在按光标方向移动键的同时,按住Shift键。应用程序中可以通过编程选择文本,需要通过调用成员函数CEdit:SetSel来实现。与该函数相对应的还有CEdit:GetSel和CEdit:ReplaceSel,分别用来获取编辑框中前选择的开始和结束的位置以及替换被选择的文本。(3)设置编辑框的页面边距设置编辑框的页面边距可以使文本在编辑框显示更具满意效果,应用程序可通过调用成员函数CEdit:SetMargins来实现,函数原型:voidSetMargins(UINTnLeft,UINTnRight);(4)剪帖板操作编辑框自动支持文本的复制、粘贴、剪切的键盘操作,对应的快捷健为Ctrl+C、Ctrl+V和Ctrl+X。若应用程序调用CEdit:Undo函数时,还可撤消当前的操作,再调用一次该函数,则恢复刚才的操作。,5.3常用控件,(5)获取多行编辑框文本一种是使用DDX/DDV,将编辑框控件所关联的变量类型选定为CString后,则不管多行编辑框的文本有多少都可用此变量来保存。这种方法不能单独获得多行编辑框中的某一行文本。另一种方法是使用编辑框CEdit类的相关成员函数来获取文本。例如,下面的代码将显示编辑框中第二行的文本内容:charstr100;if(m_Edit.GetLineCount()=2)/判断多行编辑框的文本是否有两行以上intnChars;nChars=m_Edit.LineLength(m_Edit.LineIndex(1);/获取第二行文本的字符个数/0表示第一行,1表示第二行,依次类推。LineIndex用于将文本行转换成/能被LineLength识别的索引m_Edit.GetLine(1,str,nChars);/获取第二行文本strnChars=0;MessageBox(str);,5.3常用控件,编辑框的通知消息例Ex_Ctrls2使用静态文本、组框、编辑框以及按钮等控件,设计界面。用户在“成绩1”、“成绩2”和“成绩3”编辑框中输入成绩后,单击计算平均分按钮,将显示出这三个成绩的平均分。(1)打开前面的Ex_CommCtrls。(2)向应用程序中添加一个对话框资源,打开属性对话框将其标题改为“使用编辑框”,ID号改为IDD_EDIT。(3)用编辑器为对话框添加如下表所示的一些控件。(4)双击对话框模板或按Ctrl+W快捷键,为对话框资源IDD_EDIT创建一个对话框类CEditDlg。,5.3常用控件,(5)打开ClassWizard的MemberVariables标签,在Classname中选择CEditDlg,选中所需的控件ID号,双击鼠标或单击AddVariables按钮。依次为控件增加成员变量。(6)切换到ClassWizard的MesssageMaps标签页,为CEditDlg增加WM_INITDIALOG的消息映射,并添加下列代码:BOOLCEditDlg:OnInitDialog()CDialog:OnInitDialog();m_strAve=0.00;UpdateData(FALSE);/将成员变量数据传给控件,并在控件中显示returnTRUE;,5.3常用控件,(7)用ClassWziard为按钮IDC_BUTTON1添加BN_CLICKED的消息映射,并增加下列代码:voidCEditDlg:OnButton1()UpdateData();/将控件显示的数据传给成员变量doubleave=(double)(m_nScore1+m_nScore2+m_nScore3)/3.0;m_strAve.Format(%6.2f,ave);UpdateData(FALSE);/将成员变量数据传给控件并显示(8)定位到CEx_CommCtrlsDlg:OnButton1函数处,修改代码如下:if(nID=IDC_RADIO1)CEditDlgdlg;dlg.DoModal();(9)在Ex_CommCtrlsDlg.cpp文件的开始处,增加包含CEditDlg的头文件。#include“EditDlg.h”(10)编译运行并测试。,5.3常用控件,5.3.3列表框列表框的风格,图5.25列表框的属性对话框,5.3常用控件,列表框的基本操作(1)添加列表项列表框创建时是一个空的列表,需要添加或插入一些列表项。CListBox类成员函数AddString和InsertString用来向列表框增加列表项,原型:intAddString(LPCTSTRlpszItem);intInsertString(intnIndex,LPCTSTRlpszItem);CListBox的SetItemData和SetItemDataPtr能使数据和某个列表项关联起来。intSetItemData(intnIndex,DWORDdwItemData);intSetItemDataPtr(intnIndex,void*pData);(2)删除列表项CListBox类成员函数DeleteString和ResetContent分别用来删除指定的列表项和清除列表框所有项目。它们的函数原型如下:intDeleteString(UINTnIndex);/nIndex指定要删除的列表项的索引voidResetContent();若在添加列表项时使用SetItemDataPtr函数,不要忘记在进行删除操作时及时将关联数据所占的内存空间释放出来。,5.3常用控件,(3)查找列表项CListBox类成员函数FindString和FindStringExact分别用来在列表框中查找所匹配的列表项,其中FindStringExact的查找精度最高。intFindString(intnStartAfter,LPCTSTRlpszItem)const;intFindStringExact(intnIndexStart,LPCTSTRlpszFind)const;lpszFind和lpszItem指定要查找的列表项文本,nStartAfter和nIndexStart指定查找的开始位置,若为-1,则从头至尾查找。查到后,这两个函数都将返回所匹配列表项的索引,否则返回LB_ERR。(4)列表框的单项选择当选中列表框中某个列表项,可以使用CListBox:GetCurSel来获取这个结果,与该函数相对应的CListBox:SetCurSel函数是用来设定某个列表项呈选中状态(高亮显示)。intGetCurSel()const;/返回当前选择项的索引intSetCurSel(intnSelect);nSelect指定要设置的列表项索引,错误时这两个函数都将返回LB_ERR。若要获取某个列表项的字符串,可使用下列函数:intGetText(intnIndex,LPTSTRlpszBuffer)const;voidGetText(intnIndex,CStringnIndex指定列表项索引,lpszBuffer和rString是用来存放列表项文本。,5.3常用控件,(5)列表框的多项选择在列表框的Style属性对话框中选中多选(Multiple)或扩展多选(Extended)类型后,就可以在列表框中进行多项选择。要想获得选中的多个选项,通过需要用ClassWizrd映射LBN_SELCHANGE消息,添加类似代码:voidCListBoxDlg:OnSelchangeList1()intnCount=m_list.GetSelCount();/获取用户选中的项数if(nCount!=LB_ERR)int*buffer=newintnCount;/开辟缓冲区m_list.GetSelItems(nCount,buffer);CStringallStr,str;allStr.Empty();/字符串清空for(inti=0;iscore1;m_nScore2=data-score2;m_nScore3=data-score3;UpdateData(FALSE);,5.3常用控件,(8)用ClassWizard为对话框添加WM_DESTROY的消息映射,增加代码:voidCListBoxDlg:OnDestroy()/此消息是当对话框关闭时发送的for(intnIndex=m_List.GetCount()-1;nIndex=0;nIndex-)/删除所有与列表项相关联的SCORE结构数据,并释放内存delete(SCORE*)m_List.GetItemDataPtr(nIndex);CDialog:OnDestroy();/关闭对话框对话框被清除时发送WM_DESTROY消息。用户在此消息的映射函数中添加一些对象删除代码,以便在对话框清除前有效地释放内存空间。,5.3常用控件,(9)打开ListBoxDlg.h源文件,在类CListBoxDlg定义的public处添加下列代码:public:structSCOREintscore1;intscore2;intscore3;(10)定位到CEx_CommCtrlsDlg:OnButton1函数处,修改代码如下:if(nID=IDC_RADIO2)CListBoxDlgdlg;dlg.DoModal();(11)在Ex_CommCtrlsDlg.cpp文件的开始处,增加包含CListBoxDlg的头文件。#include“ListBoxDlg.h”(12)编译运行并测试。,5.3常用控件,5.3.4组合框组合框的风格及类型,图5.27组合框的属性对话框,5.3常用控件,组合框常见操作组合框的操作大致分为两类,一类是对组合框中的列表框进行操作,另一类是对组合框中的编辑框进行操作。这些操作都可以调用CComboBox成员函数来实现。组合框的通知消息绘图时还需要下列一些技巧:需要更新或重新绘制窗口的外观时,应用程序就会发送WM_PAINT消息。用ClassWizard在对话框中映射WM_PAINT消息的目的是执行绘图代码。防止用系统默认的颜色向对话框进行重复绘制,须调用UpdateWindow函数。UpdateWindow是CWnd的无参数的成员函数,目的是绕过系统的消息列队,直接发送或停止发送WM_PAINT消息。窗口没有需要更新的区域时,就停止发送。绘制完图形时,没有WM_PAINT消息的发送,系统不会用默认的颜色对窗口进行重复绘制。如果对话框中的任何部分变为无效时,对话框的OnPaint函数都会自动调用。可以通过调用Invalidate函数来通知系统此时的窗口状态已变为无效,强制系统调用WM_PAINT消息函数OnPaint重新绘制。,5.3常用控件,例Ex_Ctrls4根据用户从组合框中选择的填充样式,在对话框中绘制一个矩形区域,如图。(1)打开前面创建的基于对话框应用程序程序项目Ex_CommCtrls。(2)向应用程序中添加一个对话框资源IDD_COMBO,标题定为“使用组合框”,用ClassWizard为此对话框类定义为CComboDlg。(3)删除原来的Cancel按钮,用编辑器为对话框添加控件。,5.3常用控件,(4)打开ClassWizard的MemberVariables标签,为组合框IDC_PATTERN增加成员变量m_Pattern,其类型为Control类的CComboBox。(5)为CComboDlg类添加一个int类型的成员变量m_nDrawPattern。(6)切换到ClassWizard的MesssageMaps标签页,为组合框IDC_PATTERN添加CBN_SELCHANGE(组合框中的当前选项发生改变)的消息映射,并增加下列代码:voidCComboDlg:OnSelchangePattern()intnIndex=m_Pattern.GetCurSel();/获得当前选项的索引if(nIndex!=CB_ERR)m_nDrawPattern=m_Pattern.GetItemData(nIndex);/获得与当前选项相关联的数据Invalidate();/强制系统调用OnPaint函数重新绘制,5.3常用控件,(7)用ClassWizard为对话框添加WM_PAINT的消息映射,并增加下列代码:voidCComboDlg:OnPaint()CPaintDCdc(this);/devicecontextforpainting(绘图所必须的设备环境)CWnd*pWnd=GetDlgItem(IDC_DRAW);/获得控件IDC_DRAW的窗口指针pWnd-UpdateWindow();/避免系统自动重绘CDC*pDC=pWnd-GetDC();/获得所需要的绘图设备环境CBrushdrawBrush;/定义一个画刷drawBrush.CreateHatchBrush(m_nDrawPattern,RGB(0,0,0);/创建画刷CBrush*pOldBrush=pDC-SelectObject(/恢复设备环境原来的画刷设置,5.3常用控件,(8)用ClassWizard为对话框添加WM_INITDIALOG的消息映射,增加代码:BOOLCComboDlg:OnInitDialog()CDialog:OnInitDialog();CStringstr6=水平线,竖直线,向下斜线,向上斜线,十字线,交叉线;intnIndex;for(inti=0;iUpdateWindow();Draw();(7)用ClassWizard为对话框添加WM_INITDIALOG的消息映射,增加代码:BOOLCScrollDlg:OnInitDialog()CDialog:OnInitDialog();/设置滚动条和滑动条的范围和当前位置m_Scroll.SetScrollRange(0,255);m_Scroll.SetScrollPos(m_RValue);m_Slider.SetRange(0,255);m_Slider.SetPos(m_GValue);/设置旋转按钮的范围m_Spin.SetRange(0,255);UpdateData(FALSE);/将数据传给控件m_bEditOK=TRUE;returnTRUE;,5.3常用控件,(8)用ClassWizard为对话框添加WM_HSCROLL的消息映射,增加代码:voidCScrollDlg:OnHScroll(UINTnSBCode,UINTnPos,CScrollBar*pScrollBar)intnID=pScrollBar-GetDlgCtrlID();if(nID=IDC_SLIDER1)/是滑动条产生水平滚动消息m_GValue=m_Slider.GetPos();/获得滑动条当前的位置if(nID=IDC_SCROLLBAR1)/是滚动条条产生水平滚动消息switch(nSBCode)caseSB_LINELEFT:m_RValue-;break;caseSB_LINERIGHT:m_RValue+;break;caseSB_PAGELEFT:m_RValue-=10;break;caseSB_PAGERIGHT:m_RValue+=10;break;caseSB_THUMBTRACK:m_RValue=nPos;break;if(m_RValue255)m_RValue=255;m_Scroll.SetScrollPos(m_RValue);UpdateData(FALSE);Draw();CDialog:OnHScroll(nSBCode,nPos,pScrollBar);,5.3常用控件,(9)将项目工作区切换到ClassView页面,用鼠标右击“CScrollDlg”项,在弹出的快捷菜单中选中“AddMemberFunction”,将要增加的函数名设为Draw,函数类型为void,并添加下列代码:voidCScrollDlg:Draw()CWnd*pWnd=GetDlgItem(IDC_DRAW);CDC*pDC=pWnd-GetDC();/获得窗口当前的设备环境指针CBrushdrawBrush;/定义画刷变量drawBrush.CreateSolidBrush(RGB(m_RValue,m_GValue,m_BValue);/创建一个填充色画刷。/颜色分量转换成一个32位的RGB颜色值CBrush*pOldBrush=pDC-SelectObject(,5.3常用控件,(10)为CScrollDlg类添加一个BOOL型成员变量m_bEditOK,并在其构造函数中将其初值设为FALSE。(11)定位到CEx_CommCtrlsDlg:OnButton1函数处,修改代码如下:if(nID=IDC_RADIO4)CScrollDlgdlg;dlg.DoModal();(12)在Ex_CommCtrlsDlg.cpp文件的开始处,增加包含CScrollDlg的头文件。#include“ScrollDlg.h”(13)编译运行并测试。在同时使用编辑框和旋转按钮控件时,有时会出现运行错误。为了解决这个问题,本例使用一个办法,即使用一个BOOL型成员变量m_bEditOK作为控制条件,使得所有初始化代码(包括设置旋转控件范围)执行后,才允许编辑框工作。由于滚动条和滑动条等许多控件都能产生WM_HSCROLL或WM_VSCROLL消息,因此当它们是处在同一方向(水平或垂直)时,就需要添加相应代码判断消息是谁产生的。由于滚动条中间的滚动块在默认时是不会停止在用户操作的位置处的,因此需要调用SetScrollPos函数来进行相应位置的设定。,5.3常用控件,5.3.7图像列表和标签控件图像列表控件(1)图像列表的创建由于Create函数的重载很多,故这里给出最常用的一个原型:BOOLCreate(intcx,intcy,UINTnFlags,intnInitial,intnGrow);(2)图像列表的基本操作常见的图像列表的基本操作有:增加、删除和绘制等,成员函数:intAdd(CBitmap*pbmImage,CBitmap*pbmMask);intAdd(CBitmap*pbmImage,COLORREFcrMask);intAdd(HICONhIcon);BOOLRemove(intnImage);该函数用来从图像列表中删除一个由nImage指定的图像,BOOLDraw(CDC*pdc,intnImage,POINTpt,UINTnStyle);该函数用来在由pt指定的位置处绘制一个图像。HICONExtractIcon(intnImage);该函数用来将nImage指定的图像扩展为图标。COLORREFSetBkColor(COLORREFcr);该函数用来设置图像列表的背景色,,5.3常用控件,标签控件(1)标签控件的风格,图5.39标签控件属性对话框,5.3常用控件,(2)标签控件的基本操作GetItemRect是用来获取标签的边界大小,原型如下:CSizeSetItemSize(CSizesize);voidSetPadding(CSizesize);intSetMinTabWidth(intcx);BOOLGetItemRect(intnItem,LPRECTlpRect)const;成员函数InsertItem、DeleteItem表示在一个标签控件中插入、删除某一标签项,DeleteAllItems删除所有的项。原型如下:BOOLInsertItem(intnItem,LPCTSTRlpszItem);BOOLInsertItem(intnItem,LPCTSTRlpszItem,intnImage);BOOLDeleteItem(intnItem);BOOLDeleteAllItems();标签控件中使用图像列表时,必须调用CTabCtrl:SetImageList函数来指定一个已创建的图像列表。函数原型如下:CImageList*SetImageList(CImageList*pImageList);成员函数SetCurSel和GetCurSel用来设置和获取当前选择的标签项,原型如下:intSetCurSel(intnItem);intGetCurSel()const;成员函数DeselectAll用来重新设置一个标签控件中的项,清除任何被按下的项,函数HighlightItem是使某一个标签项处于高亮状态。原型如下:voidDeselectAll(BOOLfExcludeFocus);BOOLHighlightItem(intidItem,BOOLfHighlight=TRUE);(3)标签控件的通知消息,5.3常用控件,例Ex_Ctrls6使用无模式对话框来构造某个标签页面,一开始将所有的标签页面创建好,然后根据所选择的当前标签选项决定哪个页面需要显示,哪个页面需要隐藏和禁用。(1)用MFCAppWizard(exe)创建一个基于对话框的应用程序项目Ex_TabCtrl。(2)打开属性对话框将对话框标题改为“使用标签控件”。(3)添加一个默认标签控件IDC_TAB1,调整其大小和布局。(4)按Ctrl+W,打开ClassWizard对话框,切换到MemberVariables页面,在Classname中选择CEx_TabCtrlDlg,选中标签控件ID号IDC_TAB1,双击鼠标或单击AddVariables按钮,为其添加一个CTabCtrl类型的成员变量m_Tab。(5)添加三个对话框资源IDD_DIALOG1、IDD_DIALOG2和IDD_DIALOG3,并用ClassWizard依次为此三个对话框类定义为CTab1Dlg、CTab2Dlg和CTab3Dlg。,5.3常用控件,(6)将上述三个对话框的属性设为ChildStyle和NoneBorder(其他默认),且将对话框尽量缩小,如图。,图5.41设置对话框属性,5.3常用控件,(7)为三个对话框添加如下表所示的一些控件。,5.3常用控件,(8)在ClassView中的CEx_TabCtrlDlg类名处右击鼠键,从弹出的快捷菜单中选择AddMemberVariables,添加下列数据成员:public:CTab1Dlg*m_pTab1Dlg;CTab2Dlg*m_pTab2Dlg;CTab3Dlg*m_pTab3Dlg;CImageListm_ImageList;(9)打开Ex_TabCtrlDlg.h文件,在classCEx_TabCtrlDlg前添加下列头文件:#includeTab1Dlg.h#includeTab2Dlg.h#includeTab3Dlg.h,5.3常用控件,(10)在ClassView中的CEx_TabCtrlDlg类名处右击鼠键,选择AddMemberFunction,添加成员函数SetDlgState和DoTab,并增加下列代码:voidCEx_TabCtrlDlg:SetDlgState(CWnd*pWnd,BOOLbShow)pWnd-EnableWindow(bShow);if(bShow)pWnd-ShowWindow(SW_SHOW);pWnd-CenterWindow();/居中显示elsepWnd-ShowWindow(SW_HIDE);voidCEx_TabCtrlDlg:DoTab(intnTab)if(nTab2)nTab=2;/确定nTab值不能超过范围if(nTab=0)DoTab(nSelect);*pResult=0;(12)按下Ctrl+R快捷键,单击Import按钮,从外部磁盘中调入三个图标文件,并取默认的图标ID号IDI_ICON1、IDI_ICON2和IDI_ICON3。,5.3常用控件,(13)在CEx_TabCtrlDlg:OnInitDialog中添加下列代码:BOOLCEx_TabCtrlDlg:OnInitDialog()CDialog:OnInitDialog();m_pTab1Dlg=newCTab1Dlg();/为无模式对话框分配空间m_pTab2Dlg=newCTab2Dlg();m_pTab3Dlg=newCTab3Dlg();m_pTab1Dlg-Create(IDD_DIALOG1,5.3常用控件,(14)用ClassWizard为CEx_TabCtrlDlg类添加WM_DESTROY的消息映射,CEx_TabCtrlDlg对话框退出时,删除分配给无模式对话框的内存。代码:voidCEx_TabCtrlDlg:OnDestroy()CDialog:OnDestroy();if(m_pTab1Dlg)deletem_pTab1Dlg;if(m_pTab2Dlg)deletem_pTab2Dlg;if(m_pTab3Dlg)deletem_pTab3Dlg;(15)用ClassWizard为CTab1lDlg类添加WM_INITDIALOG消息的映射,增加下列代码:BOOLCTab1Dlg:OnInitDialog()CDialog:OnInitDialog();CheckRadioButton(IDC_RADIO_MAN_1,IDC_RADIO_WOMAN_1,IDC_RADIO_MAN_1);returnTRUE;/returnTRUEunlessyousetthefocustoacontrol/EXCEPTION:OCXPropertyPagesshouldreturnFALSE(16)编译并运行。,5.3常用控件,需要说明的是:标签页面的切换可能还不止一种方法。例如,可以先将各个页面的控件与标签控件一起事先全部地添加到对话框模板中,然后再根据标签控件的当前选项确定控件的显示和隐藏,从而达到切换的效果。在标签页面控件操作过程中,当按Enter键或Esc键,该页面的对话框就会退出,标签页面变成了一个空白,影响交互效果。解决这个问题的一个办法是在各页面的对话框中屏蔽掉Enter键和Esc键的按键消息,它是通过添加PreTranslateMessage函数的重载来实现的,如下面的代码:BOOLCTab1Dlg:PreTranslateMessage(MSG*pMsg)if(pMsg-message=WM_KEYDOWN)if(pMsg-wParam=VK_RETURN)returnTRUE;if(pMsg-wParam=VK_ESCAPE)returnTRUE;returnCDialog:PreTranslateMessage(pMsg);,5.4通用对话框和消息对话框,5.4.1通用对话框Windows提供了一组标准用户界面对话框,它们都有相应的MFC库中的类来支持。所有这些通用对话框类都是从一个公共的基类CCommonDialog派生而来。表列出了这些通用对话框。,5.4通用对话框和消息对话框,5.4.2消息对话框是最简单的一类对话框,只是用来显示信息的。MFC类库中提供相应的函数实现这样的功能,只要在程序任何地方调用它们。函数原型:intAfxMessageBox(LPCTSTRlpszText,UINTnType=MB_OK,UINTnIDHelp=0);intMessageBox(LPCTSTRlpszText,LPCTSTRlpszCaption=NULL,UINTnType=MB_OK);,
展开阅读全文
相关资源
相关搜索

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


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

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


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