5.2控件的创建和使用方法 5.21控件的创建方法 控件的创建方式有以下两种: 一种是在对话框模板中用编辑器指定控件,也就是说,将控件的父窗口指 定为对话框,这样做的好处是明显的,因为当应用程序启动该对话框时, Windows系统就会为对话框创建控件;而当对话框消失时,控件也随之清 除 另一种方式是将控件看作是任一窗口的子窗口,并通过调用相应的 Create 函数来创建。 [例 Ex SDIHello]在上例 Ex SDIHellol的基础上用子窗口方式创建控件。 (1)打开 CMyDIg的头文件 MyDlg h,添加一个按钮类 CButton指针变量 class CMyDlg: public CDialog // Construction public: CMyDlg(CWnd* pArent= NULL);// standard constructor CButton *m btnWnd
5.2控件的创建和使用方法 5.2.1控件的创建方法 控件的创建方式有以下两种: 一种是在对话框模板中用编辑器指定控件,也就是说,将控件的父窗口指 定为对话框,这样做的好处是明显的,因为当应用程序启动该对话框时, Windows系统就会为对话框创建控件;而当对话框消失时,控件也随之清 除。 另一种方式是将控件看作是任一窗口的子窗口,并通过调用相应的Create 函数来创建。 [例Ex_SDIHello] 在上例Ex_SDIHello的基础上用子窗口方式创建控件。 (1)打开CMyDlg的头文件MyDlg.h,添加一个按钮类CButton指针变量: class CMyDlg : public CDialog { // Construction public: CMyDlg(CWnd* pParent = NULL); // standard constructor CButton *m_btnWnd; … }
52控件的创建和使用方法 (2)按CtH+W快捷键打开对话框,切换到 Message Maps页面,在 Object IDs 列表中选定“CMDg项,并在 Message列表中找到 /M INITDIALOG消息, 双击鼠标左键,然后单击[ Edit Code按钮,添加下列代码: BOOL CMyDIg: OnInitDialog( CDialog:: OnInitDialogo //TODO: Add extra initialization here m_btnWnd new CButton ∥/构造按钮控件 m btwN-> Create("你好",WS_ CHILD| WS VISIBLE BS PUSHBUTTON CRect(20,20,120,60)this,201);/创建 CFont *font this->GetFontOr ∥/获取对话框的字体 m_ btnWnd->SetFont(font) ∥/设置控件字 体 return TRUE; //return TRUE unless you set the focus to a control / EXCEPTION: OCX Property Pages should return FALSE Create用来创建一个按钮控件,第一个参数指定按钮的标题,第二个参数 是隻撸第最倉参庭定轻牛的粽大小,第四个参 (3)编译并运行
5.2控件的创建和使用方法 (2)按Ctrl+W快捷键打开对话框,切换到Message Maps页面,在Object IDs 列表中选定“CMyDlg”项,并在Message列表中找到WM_INITDIALOG消息, 双击鼠标左键,然后单击[Edit Code]按钮,添加下列代码: BOOL CMyDlg::OnInitDialog() { CDialog::OnInitDialog(); // TODO: Add extra initialization here m_btnWnd = new CButton(); // 构造按钮控件 m_btnWnd ->Create("你好", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, CRect(20, 20, 120, 60), this, 201); // 创建 CFont *font = this->GetFont(); // 获取对话框的字体 m_btnWnd->SetFont(font); // 设置控件字 体 return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } Create用来创建一个按钮控件,第一个参数指定按钮的标题,第二个参数 指定控件的风格,第三个参数指定它在父窗口中的位置和大小,第四个参 数指定父窗口指针,最后一个参数是指定该控件的标识值。 (3)编译并运行
52控件的创建和使用方法 5.2.2控件的数据交换和数据校验 例如,为 CMyDIg类的按钮控件IDC_ BUTTON1添加并使用其成员变量 m_ MyBtn,则其相应的过程如下 (1)启动 MFC ClassWizard,切换到 Member variables页面,如图。 (2)选定 Class name为 CMyDIg,然后在 Control ids列表中,选定所要关联的 控件ID号IDC_ BUTTON1,双击鼠标左键或单击[ Add variable]按钮,如图。 Class name Add Class. Member variable nam m MySt D-证 Ex SDIHelloMyDlg-h, D;.正 SDIHelloMMyDlg.cpp Cancel Category. Control Update Column Variable type 图5.17“ Add member variable”对话框 图5.16 Class wziard的“ Member variables”页面
5.2控件的创建和使用方法 5.2.2控件的数据交换和数据校验 例如,为CMyDlg类的按钮控件IDC_BUTTON1添加并使用其成员变量 m_MyBtn,则其相应的过程如下: (1)启动MFC ClassWizard,切换到Member Variables页面,如图。 (2)选定Class name为CMyDlg,然后在Control IDs列表中,选定所要关联的 控件ID号IDC_BUTTON1,双击鼠标左键或单击[Add Variable]按钮,如图。 图5.16 ClassWziard的“Member Variables”页面 图5.17 “Add Member Variable”对话框
52控件的创建和使用方法 (3)在 Member variable name框中填好与控件相关联的成员变量 m_ MyBtn,单 击[OK],在 Control ids列表中出现刚才添加的内容。 需要说明的是, DDV/DDX技术中,允许为同一个控件关联多个数据成员变量,但必须保 证这些变量名是互不相同的,且这些变量在同一个类型不能有多个变量 如果添加的成员变量是一个数值类型,则在 MFC ClassWizard对话框的 Member variables页面下方还要求用户输入变量的范围,这就是控件的数 据校验设置。 (4)单击[OK],发现 ClassWizard作了以下三方面的修改。 在 MyDIg h文件中,添加与控件关联的成员变量的声明,代码如下 // Dialog Data //AFX_DATA(CMyDIg) enum IDD= IDD_ DIALOG1 i CButton m_MyBtn CString m streit AFX DATA
5.2控件的创建和使用方法 (3)在Member variable name框中填好与控件相关联的成员变量m_MyBtn,单 击[OK],在Control IDs列表中出现刚才添加的内容。 需要说明的是, ◆ DDV/DDX技术中,允许为同一个控件关联多个数据成员变量,但必须保 证这些变量名是互不相同的,且这些变量在同一个类型不能有多个变量。 ◆ 如果添加的成员变量是一个数值类型,则在MFC ClassWizard对话框的 Member Variables页面下方还要求用户输入变量的范围,这就是控件的数 据校验设置。 (4)单击[OK],发现ClassWizard作了以下三方面的修改。 ◆ 在MyDlg.h文件中,添加与控件关联的成员变量的声明,代码如下: // Dialog Data //{{AFX_DATA(CMyDlg) enum { IDD = IDD_DIALOG1 }; CButton m_MyBtn; CString m_strEdit; //}}AFX_DATA
52控件的创建和使用方法 ◆在 MyDlg cp文件中的 CMyDlg构造函数实现代码处,添加数据成员变量的 初始代码 CMyDIg: CMyDlg(CWnd* pArent/* =NULL) CDialog(CMyDIg: IDD, pArent) //AFX- DATA_INIT(CMyDlg) m_strEit =_T() //AFX_DATA_ INIT ◆在 MyDIg. cpp文件中的 DoData Exchange函数体内,添加控件的DDx/DDV 代码 void CMyDlg: DoData EXchange(CData Exchange pDX) { CDialog: DoData Exchange(pDX);∥/调用此函数作为DDX的开始 //AFX_ DATA_MAP(CMyDIg DDX_ Control(pDX, IDC_BUTTON1, m_ MyBtn); DDX_Text(pDX, IDC_EDITl, m_strEdit) DDV_ MaxChars(pDX, m_strEdit, 20) //AFX_ DATA_MAP
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 代码。 void CMyDlg::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 }