创建对话框和新建对话框类


  参考资料:《鸡啄米的IT博客》VS2010/MFC编程入门教程之目录和总结

http://www.jizhuomi.com/software/257.html

创建对话框主要分两大步,

第一,创建对话框资源,主要包括创建新的对话框模板、设置对话框属性和为对话框添加各种控件;

第二,生成对话框类,主要包括新建对话框类添加控件变量控件的消息处理函数等。

 

1、如何新建对话框

Resource View“Dialog”节点上点右键,在右键菜单中选择“Insert Dialog”,就会生成新的对话框模板,并且会自动分配ID

2、设置对话框属性(右击对话框)

 

3、为对话框添加控件(在视图-工具箱中)

 

4、创建对话框类

1、为什么要添加对话框类?

比如在弹出对话框中就要用到

定义对话框类CAdditionDlg的对象dlg  

CAdditionDlg dlg;  

dlg.DoModal();

2、如果是自己新添加的对话框模板,怎样为它创建对话框类呢?

 首先鸡啄米就按第六讲:创建对话框模板和修改对话框属性中说的那样,在Resource View“Dialog”节点上右键,然后在右键菜单中选择“Insert Dialog”创建一个新的对话框模板,ID就使用默认的IDD_DIALOG1

  在中间区域会显示新建的对话框模板,然后选中此对话框模板,点右键,在右键菜单中选择Add Class

  创建对话框和新建对话框类_第1张图片

     选择“Add Class”后会弹出一个对话框,在对话框中“Class name”下的编辑框中写入自定义的类名就可以了,例如CMyDialog基类选择CDialog  Vs2010中有

CDialogEX(也是继承与CDialog),但我用vs2010做实验,找不到添加的对话框类。所以,基类选择CDialog

   最后点“Finish”完成。

      最终你就可以在Class View中看到新生成的对话框类CMyDialog了,并且在SolutionExplorer中有相应的MyDialog.h头文件和MyDialog.cpp源文件生成。CMyDialog类同样派生于CDialogEx类。

注意,一般类名都以C打头,又比如,CTestDlg

注意:写的类名与生成的头文件和源文件的关系:

1、最好采用匈牙利命名规则,类的名称都要以大写字母“C”开头,后跟一个或多个单词。为便于界定,每个单词的首字母要大写。

如:CMonkey。则Monkey.h  Monkey.cpp。因此采用这种命名法在用类时,看头文件和源文件名,容易误导而漏掉前面的C而造成错误。

2、除了这种命名法(首字母为C,二字母大写,三字母小写….),其他的命名法,头文件和源文件均不会省略第一个字符。如:ABc  ABc.h  ABc.cpp

 

5、为对话框控件添加变量

①为什么要为对话框的控件添加变量

静态文本框只是为了说明后面紧跟的编辑框中数据的意义,是被加数、加数还是和,所以它们是不会变的,我们就不为它们添加变量了。按钮控件是用来操作的,这里也不为它们添加变量。编辑框中的数据可能会经常变化,有必要为它们每个控件关联一个变量。

 首先为被加数的编辑框IDC_SUMMAND_EDIT添加变量。

      1.在编辑框上点右键,在右键菜单中选择“AddVariable”。弹出添加成员变量的向导对话框。

      2.我们想为其添加值变量而不是控件变量,所以对话框中“Category”下的组合框中选择Value

      3.“Variable type”下的组合框此时默认选中的是“CString”CString是字符串类,显然不能进行加法运算。我们可以选择doublefloatint等。这里我们选择double,即编辑框关联一个double类型的变量。

      4.“Variablename”中写入自定义的变量名。鸡啄米为其取名m_editSummand

创建对话框和新建对话框类_第2张图片

      5.“Finish”完成。

       注意,类的成员变量名一般以m_打头,以标识它是一个成员变量。

      参照此方法,再分别为加数的编辑框IDD_ADDEND_EDIT添加double型变量m_editAddend、和的编辑框IDD_SUM_EDIT添加double型变量m_editSum

 

 

 

 

 

6对话框类的数据交换和检验

控件的属性改变后MFC会相应修改控件关联变量的值。这种同步的改变是通过MFC为对话框类自动生成的成员函数DoDataExchange()来实现的,这也叫做对话框的数据交换和检验机制。

       我们为三个编辑框添加了变量以后,在AdditionDlg.cppCAdditionDlgDoDataExchange()函数的函数体中多了三条DDX_Text调用语句。下面是函数体代码和鸡啄米添加的注释。

 

C++代码

1.void CAdditionDlg::DoDataExchange(CDataExchange* pDX)  

2.{   

3.    // 处理MFC默认的数据交换   

4.    CDialogEx::DoDataExchange(pDX);   

5.    // 处理控件IDC_SUMMAND_EDIT和变量m_editSummand之间的数据交换   

6.    DDX_Text(pDX, IDC_SUMMAND_EDIT, m_editSummand);  

7.    // 处理控件IDC_ADDEND_EDIT和变量m_editAddend之间的数据交换   

8.    DDX_Text(pDX, IDC_ADDEND_EDIT, m_editAddend);  

9.    // 处理控件IDC_SUM_EDIT和变量m_editSum之间的数据交换   

10.    DDX_Text(pDX, IDC_SUM_EDIT, m_editSum);  

11.}  

       鸡啄米再以Addition程序为例简单说下数据交换机制。如果我们在程序运行界面中输入被加数,则通过CAdditionDoDataExchange()函数可以将输入的值保存到m_editSummand变量中,反之如果程序运行中修改了变量m_editSummand的值,则通过CAdditionDoDataExchange()函数也可以将新的变量值显示到被加数的编辑框中。

       但是这种数据交换机制中,DoDataExchange()并不是被自动调用的,而是需要我们在程序中调用CDialogEx::UpdateData()函数,由UpdateData()函数再去自动调用DoDataExchange()的。

      CDialogEx::UpdateData()函数的原型为:

      BOOL UpdateData(BOOL bSaveAndValidate = TRUE);

       参数:bSaveAndValidate用于指示数据传输的方向,TRUE表示从控件传给变量,FALSE表示从变量传给控件。默认值是TRUE,即从控件传给变量。

       返回值:CDialogEx::UpdateData()函数的返回值表示操作是否成功,成功则返回TRUE,否则返回FALSE

 

7、为控件添加消息处理函数

比如我们点击按钮时就会产生BN_CLICKED消息,修改编辑框内容时会产生EN_CHANGE消息等。一般为了让某种操作达到效果,我们只需要实现某个消息的消息处理函数。

 

1.使用类向导(Class Wizard)添加消息处理函数

Vc6.0vs2010有类向导,但是vs2008没有。

创建对话框和新建对话框类_第3张图片

 

 2.通过“添加事件处理程序”(“AddEvent Handler...”)添加消息处理函数

       计算按钮上点右键,然后在右键菜单中选择菜单项“AddEvent Handler...”,弹出“EventHandler Wizard”对话框,如下图:

创建对话框和新建对话框类_第4张图片

       可见“Messagetype”中默认选中的就是BN_CLICKED消息,函数名和所在类都已经自动给出,直接点“Addand Edit”就可以了。

3.在按钮的属性视图中添加消息处理函数

       上面说过,从VS2002开始就主要从属性视图添加消息处理函数了。我们在计算按钮上点右键,在右键菜单中选择“Properties”,右侧面板中会显示按钮的属性视图。

创建对话框和新建对话框类_第5张图片

       我们可以像上图中那样,点属性视图的“ControlEvents”按钮(类似闪电标志),下面列出了计算按钮的所有消息。我们要处理的是BN_CLICKED消息,点其右侧空白列表项,会出现一个带下箭头的按钮,再点此按钮会出现OnBnClickedAddButton”选项,最后选中这个选项就会自动添加BN_CLICKED处理函数了。

8、设置对话框控件的Tab顺序

显示tab:在主菜单中选择格式”->"Tab 顺序",或者按快捷键Ctrl+D,对话框模板上就会显示各个控件的Tab顺序数字。

 

更改tab键顺序:从自己认为Tab顺序应该为1的控件开始依次单击,随着单击的完成,各控件的Tab响应顺序也按我们的想法设置好了。

创建对话框和新建对话框类_第6张图片

 

 


你可能感兴趣的:(MFC)