对话框和常用控件1112_第1页
对话框和常用控件1112_第2页
对话框和常用控件1112_第3页
对话框和常用控件1112_第4页
对话框和常用控件1112_第5页
已阅读5页,还剩64页未读 继续免费阅读

下载本文档

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

文档简介

1、电话:87331856-831Email:1第四章 对话框和常用控件对话框(Dialog box)的使用控件(Controls)的创建和使用方法常用控件通用对话框和消息对话框22022/7/29(1)模式对话框:“模式对话框”是指当对话框被弹出,用户必须在对话框中作出相应的操作,在退出对话框之前,对话框所在应用程序的其它操作不能继续执行。模式对话框由系统自动分配内存空间,因此在对话框退出时,对话框对象自动删除。(2)无模式对话框:“无模式对话框”是指当对话框被弹出后,一直保留在屏幕上,用户可继续在对话框所在的应用程序中进行其它操作;当需要使用对话框时,只需象激活一般窗口一样单击对话框所在的区域

2、即可激活。无模式对话框需要用户来指定内存空间,因此在对话框退出时,还需要自己来删除对话框对象。 对话框的分类介绍32022/7/294.1 对话框的使用1.资源的分类一个单文档应用程序所使用的资源可分为下列几类:(1) 快捷键列表(Accelerator)。一系列组合键的集合,被应用程序用来引发一个动作。该列表一般与菜单命令相关联,用来代替鼠标操作。(2) 对话框(Dialog)。含有按钮、列表框、编辑框等各种控件的窗口。(3) 图标(Icon)。代表应用程序显示在Windows桌面上的位图。 (4) 菜单(Menu)。用户通过菜单可以完成应用程序的大部分操作。(5) 字串表(String T

3、able)。应用程序使用的全局字符串或其他标识符。(6) 工具栏按钮(Toolbar)。工具栏外观是以一系列具有相同尺寸的位图组成的,通常与一些菜单命令相对应,用以提高用户的工作效率。(7) 版本信息(Version)。包含应用程序的版本、用户注册码等相关信息。2.ID标识符(P165 表4.1)43. 开发基于对话框的应用程序的步骤(1) 使用MFC AppWizard(exe)生成基于对话框的应用程序框架。(2) 设置对话框的属性。(操作: “View”“Properties” )(3) 向对话框中添加控件Button1,并设置控件的标识IDC_BUTTON1。(4) 编辑并测试对话框界面

4、。(5) 使用ClassWizard为所添加的控件定义该控件的事件将产生的消息(BN_CLICKED),以及处理消息的成员函数OnButton1。(操作:“View”“ClassWizard” “Message Maps”)在4-5步后,MFC自动为其上的对象的消息映射安排3个内容。例:Ex_First52022/7/29(6) 使用ClassWizard为所添加的控件定义该控件相关联的数据成员变量。(操作:“View”“ClassWizard” “Member Variables”)(7) 为消息处理函数添加用户代码。(8)编译并运行应用程序。void CFirstDlg:OnButton1

5、() MessageBox(Welcome!);6 主要的资源 对话框资源:IDD_项目名_DIALOG用于设计对话框的界面。 双击该资源ID号即可启动对话框编辑器进行界面设计。 主要的类 应用程序类:C项目名App继承CWinApp类而来,用于定义全局对象theApp。 对话框类:C项目名Dlg继承CDialog类而来,用于处理对话框的应用。 其中:OnInitDialog()WM_INITDIALOG(对话框初始化)消息处理函数该成员函数用于在对话框创建时而被显示前进行一些初始化工作。基于对话框的应用程序的框架的要点72022/7/29 主要的源代码文件 (1)应用程序类: 定义文件:项目

6、名.h公有继承CWinApp类,从而得到派生类C项目名App。 实现文件:项目名.cpp使用类C项目名App定义了一个全局对象theApp。 (2)对话框类: 定义文件:项目名Dlg.h公有继承CDialog类,从而得到派生类C项目名Dlg,可在此添加基于对话框应用的成员变量。 实现文件:项目名Dlg.cpp可在此添加基于对话框应用的消息处理函数的用户代码。82022/7/29基于对话框的程序框架ClassViesResourceView92022/7/29基于对话框的程序框架102022/7/294.在单文档应用程序中添加对话框在单文档应用程序中,添加一个对话框的一般过程是:添加对话框资源;

7、设置对话框的属性;添加和布局控件;创建对话框类;添加对话框代码;在程序中调用对话框。例:Ex_SDIHello11添加对话框资源(1) 选择“插入”“资源”菜单,选择对话框类型;表4.2列出各种类型的对话框资源的不同用途。对话框模板控件工具栏布局工具栏默认标识符12设置对话框的属性在对话框模板处右击鼠标,在快捷菜单中选择“属性”菜单项,出现如图所示的对话框属性窗口。13添加和布局控件控件的选择静态文本组框复选框组合框水平滚动条旋转按钮滑动条列表视图标签复合编辑月历用户定制控件静态图片编辑框按钮单选框列表框垂直滚动条进展条热键树形视图动画日期选择IP地址扩展组合框控件工具栏14控件的选取、删除、

8、复制和布局控件布局工具栏15创建对话框类在对话框资源模板的空白区域内双击鼠标,弹出如图所示的对话框,询问是否为对话框资源创建一个新类,单击OK按钮。出现New Class对话框。在Name框中输入类名例如:CFirstDlg。Base class和Dialog ID内容是由系统自动设置的,一般无需修改。 用户对话框类是从基类CDialog派生而来的。 16添加对话框代码在MFC ClassWizard对话框,选择CFirstDlg在Messages框中找到并选定WM_INITDIALOG消息。在Member functions列表框中选择刚添加的OnInitDialog函数,单击Edit Co

9、de按钮,在此函数中添加下列代码:(P173)BOOL CFirstDlg:OnInitDialog() CDialog:OnInitDialog();CStatic* pWnd = (CStatic*)GetDlgItem(IDC_STATIC_1);pWnd-SetWindowText(这是我的第一个对话框!);/ SetWindowText用于设置文本控件显示的内容 return TRUE; 17在程序中调用对话框_1在项目工作区窗口中选择ResourceView页面,双击资源“Menu”项中的IDR_MAINFRAME,在菜单资源的最右一项,输入新的菜单项。在菜单的空位置上双击鼠标左键

10、,则出现它的属性对话框,在标题框中输入“测试(&T)”。单击“测试”菜单项下方的空位置,在属性对话框中,输入标题“对话框(&D)”,在ID框输入该菜单项的资源标识:ID_TEST_DLG,如图示。18打开MFC ClassWizard对话框。在Message Maps页面中,从Class name列表中选择CMainFrame,在IDs列表中选择ID_TEST_DLG,然后在Messages框中选择COMMAND消息。单击Add Function按钮,输入成员函数的名称。系统默认的函数名为OnTestDlg。在ClassWizard的Member functions列表中选择新增加的成员函数名

11、,为此添加如下代码:void CMainFrame:OnTestDlg() CFirstDlg dlg;/ 定义对话框类对象dlg.DoModal();/ 显示对话框在OnTestDlg函数的实现文件MainFrm.cpp的前面添加CFirstDlg类的包含语句,即:#include FirstDlg.h编译并运行应用程序19(1)在应用程序类的*APP.cpp源文件前加上包含对话框类的头文件. 例:#include “MyDlg.h”(2)在InitInstance函数体中的“return TURE;”语句之前添加代码: 例: CMyDlg dlg; dlg.DoModal();在程序中调用

12、对话框_2204.2 控件的创建和使用方法1. 控件的创建方法控件的创建方式有以下两种:一是在对话框模板中用编辑器指定控件,即将控件的父窗口指定为对话框,当应用程序启动该对话框时,Windows系统就会为对话框创建控件;而当对话框消失时,控件也随之清除。二是将控件看作是任一窗口的子窗口,并通过调用相应的Create函数来创建。21在OnInitDialog函数中中添加下列代码:BOOL CEx_DlgCtrlsDlg:OnInitDialog()CDialog:OnInitDialog(); m_btnWnd.Create(你好, WS_CHILD | WS_VISIBLE | BS_PUSH

13、BUTTON,CRect(20, 20, 120, 60), this, 201); / 创建CFont *font = this-GetFont();/ 获取对话框的字体m_btnWnd.SetFont(font);/ 设置控件字体return TRUE; 使用Create函数创建控件 例P178 例:Ex_DlgCtrls222. 映射控件消息 当控件的状态发生改变时,控件就会向其父窗口发送消息,这个消息称为“通知消息”。例:打开Ex_DlgCtrls应用程序,在对话框资源中添加一个按钮控件在MFC ClassWizard的IDs列表中选择IDC_BUTTON1,然后在Messages框中

14、选择BN_CLICKED消息。单击Add Function, 添加函数OnButton1。23为新增加的成员函数添加如下代码:编译并运行,当单击Button1按钮时,就会执行OnButton1函数,弹出一个消息对话框。void CEx_DlgCtrlsDlg:OnButton1() MessageBox(你按下了Button1按钮!);243.映射控件通用消息通过WM_COMMAND消息的映射来处理一个或多个控件的通用消息例:打开MFC ClassWizard, 添加OnCommand消息函数在OnCommand函数中添加下列代码:BOOL CEx_DlgCtrlsDlg:OnCommand(

15、WPARAM wParam, LPARAM lParam) WORD nCode = HIWORD(wParam);/ 控件的通知消息WORD nID = LOWORD(wParam);/ 控件的ID值if (nID = 201)&(nCode = BN_CLICKED)MessageBox(你按下了你好按钮!);if (nID = IDC_BUTTON1)&(nCode = BN_CLICKED)MessageBox(这是在OnCommand处理的结果!);return CDialog:OnCommand(wParam, lParam);例:Ex_DlgCtrls25当控件的状态发生改变时,

16、控件就会向其父窗口发送消息,这个消息称为“通知消息”。typedef struct tagMSG / msg HWND hwnd; / 接收到消息的窗口句柄 UINT message; / 消息 WPARAM wParam;/ 消息的附加信息,它的含义取决于message LPARAM lParam;/ 消息的附加信息,它的含义取决于message DWORD time;/ 消息传送时的时间 POINT pt;/ 消息传送时,光标所在的屏幕坐标 MSG;对于一般控件来说,其通知消息通常是一条WM_COMMAND消息,这条消息的wParam参数的低位字中含有控件标识符,wParam参数的高位字则

17、为通知代码,lParam参数则是指向控件的句柄。264.控件的数据交换(DDX)和数据校验(DDV)DDX将数据成员变量同对话框类模板内的控件相连,使数据容易地在控件之间传输。DDV用于数据的校验。 例:为Ex_DlgCtrlsDlg类的按钮控件IDC_BUTTON1添加并使用其关联变量m_RelBtn。选定所要关联的控件IDC_BUTTON1,单击Add Variable,在Add Member Variable对话框中设置变量的名称、类别和数据2728 2022/7/29 用MFC向导为控件添加关联变量实际自动完成了3项工作:在其父窗口的类的头文件(如Ex_DlgCtrlsDlg.h )中

18、,添加与控件关联的成员变量的声明。在其父窗口的类的实现文件(如Ex_DlgCtrlsDlg.cpp文件)的类构造函数中 ,添加数据成员变量的一些初始化代码。在其父窗口的类的实现文件(如Ex_DlgCtrlsDlg.cpp )的DoDataExchange函数中,添加控件的DDX/DDV代码。28在Ex_DlgCtrlsDlg.h文件中,添加控件关联变量的声明/ Dialog Data/AFX_DATA(CEx_DlgCtrlsDlg)enum IDD = IDD_EX_DLGCTRLS_DIALOG ;/ 枚举类型CButton m_RelBtn;CString m_strEdit;/AFX_

19、DATA29在Ex_DlgCtrlsDlg.cpp文件中的CEx_DlgCtrlsDlg构造函数处:CEx_DlgCtrlsDlg:CEx_DlgCtrlsDlg(CWnd* pParent /*=NULL*/): CDialog(CEx_DlgCtrlsDlg:IDD, pParent)/AFX_DATA_INIT(CEx_DlgCtrlsDlg) m_strEdit = _T();/AFX_DATA_INIT30在Ex_DlgCtrlsDlg.cpp文件中的DoDataExchange函数体内,添加了控件的DDX/DDV代码,它们都是一些以DDV_或DDX_开头的函数调用。void CEx

20、_DlgCtrlsDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX); / 调用此函数作为DDX的开始/AFX_DATA_MAP(CEx_DlgCtrlsDlg)DDX_Control(pDX, IDC_BUTTON1, m_RelBtn); DDX_Text(pDX, IDC_EDIT1, m_strEdit); / 将IDC_EDIT1与m_strEdit进行数据交换DDV_MaxChars(pDX, m_strEdit, 20); / 校验m_strEdit的最大字符个数不超过20/AFX_DATA_MAP3

21、132 2022/7/29 关于成员函数:“CWndUpdateData”实现控件与其关联的数据成员变量间的数据交换,如数据输入和读取。(P182)调用格式为:UpdateData(FALSE)数据由控件相关联的成员变量向控件传输。调用格式为: UpdateData(TRUE)或UpdateData()数据从控件向相关联的成员变量传送。例: Ex_SDIHello (完成文本框内的数的计算)3233 2022/7/29 5.常用的对话框控件的访问方式(1)利用ClassWizard,将控件和变量相关联(2)利用函数GetDlgItem()获取控件的指针CButton m_Mybtn;Cstri

22、ng m_strEdit; /产生相关的控件变量m_Mybtn.SetWindowText(m_strEdit);/获取编辑框内的文本例:GetDlgItem(IDC_BUTTON1)-SetWindowText(m_strEdit);/获取编辑框内的文本3334 2022/7/29 1. 基本控件 (P185,表4.5)静态控件和按钮编辑框列表框组合框滚动条和进展条旋转按钮和滑动条图像列表和标签控件常用控件3435 2022/7/29 (1) 静态控件:一般不接收用户输入,也不产生消息。 静态文本:常用于标示控件,即作为其它控件的标签。 组框:常用于控件的分组,即作为控件组的分隔栏。静态图片

23、:显示图标、位图或增强的图元文件、作为分隔栏用2. 控件的要点常用控件当控件的状态发生改变时,控件就会向其父窗口发送消息。当父窗口接到消息后就会寻找该消息的处理函数进行处理,若找不到就转作默认处理。35利用Picture控件显示位图添加位图资源InsertResource,选择Bitmap资源,单击Import按钮插入位图;此时可添加ID为IDB_BITMAP1的位图;显示位图在对话框中添加Picture控件;在属性对话框中选择Type为Bitmap,在Image的下拉列表中选择位图资源的ID号。例:变换显示图片 EX_11_136为IDC_BITMAP添加一个CStatic类型的变量m_cB

24、mp;在.h头文件中:protected: CBitmap cBmp; /声明位图类对象 int i;在.CPP文件中添加代码:BOOL CPicDlgDlg:OnInitDialog() /装载位图资源 cBmp.LoadBitmap(IDB_BITMAP1);/给静态控件设置HBITMAP类型的位图 m_cBmp.SetBitmap(HBITMAP(cBmp);为按钮IDC_CHANGE添加BN_CLICK消息void CPicDlgDlg:OnChange() if(i%2!=0) /删除图片框中的位图 cBmp.DeleteObject(); cBmp.LoadBitmap(IDB_B

25、ITMAP1); m_cBmp.SetBitmap(HBITMAP(cBmp);else cBmp.DeleteObject(); cBmp.LoadBitmap(IDB_BITMAP2); m_cBmp.SetBitmap(HBITMAP(cBmp);i+;3738 2022/7/29 关于与控件关联的变量 在ClassWizard对话框的Member Variables标签项中,Category框内可选择的类型有两种:Control和Value。 Control所对应的变量类型是MFC为该控件封装的控件类;Value所对应的变量类型是数值类型,不同的控件所提供的关联的数值类型各不相同。 同

26、一个控件可以关联多个数据成员变量,但必须保证这些变量名互不相同,且这些成员变量在同一个类型不能有多个,即Value和Control类型中各自只能有一个成员变量。常用控件3839 2022/7/29 按钮:只有两种消息BN_CLICKED(单击按钮)和BN_DOUBLECLICKED(双击按钮)。常用CButton类的成员函数:分别用来设置或获取指定按钮的选中状态:void SetCheck( int nCheck );int GetCheck( ) const;其中,nCheck和GetCheck函数返回的值可以是:0表示不选中,1表示选中,2表示不确定(仅用于三态按钮)。同组多个单选按钮的选

27、中状态的设置或获取:void CheckRadioButton( int nIDFirstButton, int nIDLastButton, int nIDCheckButton );int GetCheckedRadioButton( int nIDFirstButton, int nIDLastButton );其中,nIDFirstButton和nIDLastButton分别指定同组单选按钮的第一个和最后一个按钮ID值,nIDCheckButton用来指定要设置选中状态的按钮ID值,函数GetCheckedRadioButton返回被选中的按钮ID值。例:TEST3940 2022/7

28、/29 (3) 编辑框:常用属性:Multiline:设置文本是否可多行显示Want return:支持回车Password:输入的文本以”*”显示常用控件处理文本的函数:CWnd:SetWindowText():设置编辑框中的初始文本CWnd:GetWindowText():获得编辑控件中的文本LimitText():设置编辑控件能接受的最大长度SetSel():设置控件中当前选项的字符位置GetSel() :获取控件中当前选项的字符位置Cut():删除选定的文本Copy():复制选定文本到剪贴板上Paste():把剪贴板上的文本复制到编辑框Undo():取消对文本最后一次编辑改变控件的通知

29、消息:P193, 表4.8例:TestCal例: Ex_test1 在此基础上添加第二个对话框例:Ex_11_24041 2022/7/29 例TestCal:建立一个简单的计算程序4142 2022/7/29 定义成员变量4243 2022/7/29 增加事件处理函数4344 2022/7/29 增加代码:例void CTestCalDlg:OnButtonCal() UpdateData();switch(m_dOpr)case 0:m_fResult=m_fValue1+m_fValue2;break;case 1:m_fResult=m_fValue1-m_fValue2;break;

30、case 2:m_fResult=m_fValue1*m_fValue2;break;case 3:m_fResult=m_fValue1/m_fValue2;break;UpdateData(false); 4445 2022/7/29 例2: Ex_test1显示新建的对话框为新建的对话框创建新类: CEditDlg在函数 CEx_test1Dlg:OnButton1处添加代码: if(nID=IDC_RADIO1)CEditDlg dlg;dlg.DoModal(); /显示对话框增加包含CEditDlg的头文件的代码:#include EditDlg.h在静态文本框内显示初始值:0.0

31、0为CEditDlg增加WM_INITDIALOG消息映射在函数 CEditDlg:OnInitDialog处添加代码: m_strAve=0.00;UpdateData(FALSE);4546 2022/7/29 显示计算结果为按钮IDC_BUTTON1添加BN_CLICKED消息在函数 CEditDlg:OnButton1()添加代码: UpdateData();double ave=(double)(m_nScore1+m_nScore2+m_nScore3)/3.0;m_strAve.Format(%6.2f,ave);UpdateData(FALSE);例2: Ex_test1_续4

32、647 2022/7/29 (4)列表框 列表框有单选、多选、扩展多选和非选四种类型,其中最常用的是单选列表框。 列表框中的列表项一般使用字符串来标识,有时也使用索引来确定。索引表明了项目在列表框中排列的位置,它是以0起始的。47列表框常用的消息:P199 表4.13列表框常用的操作:通过调用CListBox类的成员函数来实现的:(1) 添加列表项:int AddString( LPCTSTR lpszItem );int InsertString( int nIndex, LPCTSTR lpszItem );/ lpszItem指定列表项的字符串文本, nIndex指定索引值,使得新增的列

33、表项插在该项前,若为-1,则添加到最后(2) 删除列表项。指定的列表项和清除列表框所有项目:int DeleteString( UINT nIndex ); / nIndex指定要删除的列表项的索引void ResetContent( );(3) 查找列表项。int FindString( int nStartAfter, LPCTSTR lpszItem ) const;int FindStringExact( int nIndexStart, LPCTSTR lpszFind ) const; 其中,lpszFind和lpszItem指定要查找的列表项文本,nStartAfter和nInd

34、exStart指定查找的开始位置,若为-1,则从头至尾查找。查到后,这两个函数都将返回所匹配列表项的索引,否则返回LB_ERR。48(4) 列表框的单项选择。当选中列表框中某个列表项,用户可以使用 CListBox:GetCurSel来获取这个结果, CListBox:SetCurSel 函数是用来设定某个列表项呈选中状态(高亮显示)。int GetCurSel( ) const;/ 返回当前选择项的索引int SetCurSel( int nSelect );其中,nSelect指定要设置的列表项索引。若要获取某个列表项的字符串,可使用下列函数:int GetText( int nIndex

35、, LPTSTR lpszBuffer ) const;void GetText( int nIndex, CString& rString ) const;其中,nIndex指定列表项索引,lpszBuffer 和rString是用来存放列表项文本。 49例:静态控件响应列表框 EX_11_3为IDC_LIST1添加CListBox类型的成员变量m_list;在初始化函数OnInitDialog()中,为ListBox添加列表项CString str6=数学,语文,英语,计算机,机电,信息;for(int i=0;iGetDlgItem(IDC_SHOW);/用来获得指向静态文本控件的指针pWnd-SetWindowText(str1i); /设置控件的初始文本5051 2022/7/29 (5)组合框:组合框是编辑框与列表框的结合,所以它同时具有二者的特点。组合框有简单组合框、下拉式组合框和下拉式列表框

温馨提示

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

评论

0/150

提交评论