mfc对话框程序,基于对话框的mfc应用程序实例

  mfc对话框程序,基于对话框的mfc应用程序实例

  首先,创建一个对话框对象

  1.首先,使用资源编辑器创建一个对话框资源,并为对话框资源定义一个对话框类:class CTestDlg: public CDialog。

  2.创建一个对话框对象。

  创建模式对话框:

  比如:

  CTestDlg dlg

  dlg。DoModal();

  无模式对话框创建:

  比如:

  CTestDlg dlg

  dlg。Create(IDD_DIALOG,this);

  但是你不能得到一个正常显示的非模态对话框。因为模态对话框和非模态对话框的实现方式不一样,所以这里要注意几点。

  创建无模式对话框后,它是隐藏的,必须通过调用ShowWindow来显示。对于模态对话框,当执行DoModal函数来创建对话框时,程序将暂停执行,直到模态对话框关闭。因此,模态对话框可以采用局部对象。

  但是,对于非模态对话框,当执行Create函数时,不会暂停执行。当执行花括号 }时,Dlg本地对象的生命周期被破坏,然后出现异常。

  有两种解决方案:

  1.在视图类中定义一个CTestDlg成员变量。

  其次,动态创建一个CTestDlg变量,重写CTestDlg类的PostNcDestroy函数,在这个函数中销毁对象delete this无论您创建的是模式对话框还是非模式对话框,当我们单击“确定”或“取消”时,对话框都会消失。但是这个时候,下层的操作就不一样了。

  对于模态对话框,对话框对象此时确实被销毁了,但是对于非模态对话框,它们只是被隐藏,不再显示。这要求我们自己调用DestoryWindow函数来进行销毁。

  这时我们必须重写CTestDlg的OnOK和OnCancel函数(基类CDialog的这两个虚函数),调用这两个函数中的DestroyWindow函数,注意不要再调用基类CDialog的对应函数。

  正确创建无模式对话框的代码如下:

  CTestDlg * pDlg=new CTestDlg

  pDlg- Create(IDD_DIALOG,this);

  pDlg-SHOW window(SW _ SHOW);

  同时销毁CTestDlg类的PostNcDestroy函数中的对象:删除这个;

  二、动态创建按钮

  1.在对话框类CTestDlg中定义一个CButton类对象作为其成员变量。

  2.在相应的消息处理中,调用CButton类的Create函数来创建按钮。

  注意两点:

  如果在调用CButton:Create创建按钮时没有指定WS_VISIBLE样式,那么必须调用这个Button对象的ShowWindow函数来显示按钮。为了防止该按钮与多个按钮相关联,需要在这里进行一些设置,如下所示:

  如果(!m_btn.m_hwnd)

  {

  //CButton对象m_btn不与按钮相关联。

  m_btn。创建(.);

  }

  其他

  {

  //CButton对象m_btn已经与一个按钮相关联。

  其他操作.

  }

  当然,这不是唯一的方法。但这是最美的方式。

  第三,设置控件文本。

  1.以下是一些用于设置控制文本的函数:

  //获取对话框中指定控件的窗口句柄。由控件ID标识指定。

  CWnd * GetDlgItem(int nID)const;

  void CWnd:GetDlgItem( int nID,HWND * ph wnd)const;

  //获取窗口文本

  int GetWindowText(LPTSTR lpsztringbuf,int nmax count)const;

  void GetWindowText(CString RS tring)const;

  //设置窗口文本

  void SetWindowText(LPCTSTR lpszString);

  //获取指定的控制窗口文本。由控件ID标识指定。

  int GetDlgItemText( int nID,LPTSTR lpStr,int nmax count)const;

  int GetDlgItemText( int nID,CString RS tring)const;

  //设置指定的控制窗口文本。由控件ID标识指定。

  void SetDlgItemText( int nID,LPCTSTR lpszString);

  //获取指定的控制窗口文本,并将其转换为UINT类型返回。由控件ID标识指定。

  UINT GetDlgItemInt( int nID,BOOL* lpTrans=NULL,BOOL b signed=TRUE)const;

  //设置指定控件的窗口文本,按UINT类型转换为字符。由控件ID标识指定。

  void SetDlgItemInt( int nID,UINT nValue,BOOL b signed=TRUE);

  2.可以为对话框控件关联一个变量,在CTestDlg类的DoDataExchange中更新和交换数据。

  这里我们需要重点关注DoDataExChange函数:

  首先,引用MSDN的一个解释:被框架调用来交换和验证对话数据。意味着框架调用这个函数来重写和确认对话数据。

  实际上,DoDataExChange函数主要通过DDX _文本(.)或DDX _控制(.).

  我只是从我的MSDN里取了一个定义:

  void afx API DDX _ Text(CDATA exchange * pDX,int nIDC,字节值);

  其实也很简单,没那么复杂。如下所示:

  value=GetDlgItemInt(nIDC);

  SetDlgItemInt(nIDC,value);

  在UpdateData函数内部调用了DoDataExchange函数。

  该函数只有一个布尔参数,决定数据传输的方向:

  调用UpdateData(TRUE)将数据从对话框的控件传输到相应的数据成员。调用UpdateData(FALSE)将数据从数据成员传输到相应的控件。

  UpdateData(FALSE)将变量的值传递给控件。

  UpdateData(TRUE)是从控件到关联变量的值。

  第四,对话框扩展功能的实现

  只与两个功能相关联:

  //获取指定窗口边框的折叠大小。

  void GetWindowRect(LPRECT LPRECT)const;

  //设置指定窗口(控件)的位置和大小

  BOOL SetWindowPos(const CWnd * pwndiserafter,intx,inty,int cx,intcy,UINTnFlags);

  第五,逃生按钮的实现

  1.基于对话框创建MFC程序。删除原控件后,再添加两个按钮,并将这两个按钮的名称改为‘你能抓住我吗?’

  2.打开类视图并定义一个新类CNewButton。这个新类的基类是CButton。并为此类添加一个成员变量:CNewButton * m _ pbtn

  3.打开资源视图,分别为两个按钮创建两个CNewButton类关联变量:m _ BTN1和m _ BTN2

  4.在CXXXDlg中重写其OnInitDialog函数。主要新增内容:

  m _ Bt n1 . m _ pbtn=m _ Bt N2;

  m _ Bt N2 . m _ pbtn=m _ Bt n1;

  5.对于CNewButton类,它必须有OnMouseMove函数。主要新增内容:

  ShowWindow(SW _ HIDE);

  m _ pbtn-SHOW window(SW _ SHOW);

  编译,连接。好

  不及物动词属性页、属性表单和向导的建立

  1.创建属性页

  打开资源编辑器,单击对话框资源并在列出的选项中选择:IDD_PROPPAGE_LARGE。创建属性页资源。

  之后,我们可以在上面添加其他控件来完善我们的属性页。后面会讲到属性页的完美操作。

  属性页资源完善后,为每个属性页关联一个类。

  2.创建属性表单

  打开类视图并添加一个新类CPropSheet,其基类是CPropertySheet。

  然后为其添加属性页类对象,并在其构造函数中使用AddPage函数将属性页添加到表单中。

  3.消息响应

  在主菜单的末尾再增加一个菜单项,在这个菜单上增加一个消息响应功能。

  在此响应函数中创建属性表:

  CPropSheet propSheet(TEXT(属性表));

  支撑板。DoModal();

  4.向导的创建

  若要创建向导类型的对话框,您应该按照创建标准属性窗体的步骤进行操作。

  但是,在调用属性表单对象的DoModal函数之前,应该首先调用SetWizardMode函数来声明您正在将属性表单构建为向导。

  因此,应该在DoModal函数之前添加以下代码:

  支撑板。SetWizardMode();

  5.属性页的完美操作

  首先,我们要注意属性页,三个不同时期的关键操作:

  当属性表中的属性页被选中并成为活动页时,应用程序框架将调用OnSetActive函数。

  OnSetActive是其基类的虚函数。我们可以重写这个函数,在里面做一些操作。假设我们当前在属性表中的属性页上。当我们点击Next,将进入下一个属性页时,应用框架将调用OnWizardNext函数。

  OnWizardNext是其基类的虚函数。我们可以重写这个函数,在里面做一些操作。

  还有类似的OnWizardBack和OnWizardFinish函数。创建属性页时,会调用其OnInitDialog函数。

  我们可以在这个函数中对属性页中的控件执行一些操作。例如在列表框或下拉框中添加字符串。出发地:http://blog..net/ltag0110rtag/article/details/7369105

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: