MFC学习笔记1


***【在线视频教程】***

好文章,来自【福优学苑@音视频+流媒体】

    

一:基于对话框的MFC主要文件及其关系


创建方式:打开Visual Studio2010 文件->新建->项目->>>MFC应用程序->输入名称如“Example37”(解决方案自动与名称相同)->>>完成->>>下一步->>>将“多个文档”勾选掉,选择“基于对话框”->>>完成


这样我们就得到了一些基本的文件,在“解决方案资源管理器”视图里可以看到如图所示的外部依赖项、头文件、源文件、资源文件。

image.png


image.png

    其中Example37.h文件经常用于包含其他的头文件,并已经自动生成对类 CExample37Dlg的声明,从CDialogEx派生而来: class CExample37Dlg : public CDialogEx,常在此类中对一些 成员变量进行声明。

Example37Dlg.cpp文件里有一个重要的函数定义。 BOOL CExample37Dlg::OnInitDialog() 它表示的是静态的最初的界面,对于一些控件,可以在此添加初始化代码,主要用于设置控件的初始姿态。


二:添加控件及变量


    在“资源视图”中,IDD_EXAMPLE37_DIALOG是当前所示的界面,可以在上面添加一系列控件,右侧有工具箱...选择所需要的拖动放进来就好,还有一些对齐方式可以操作来使得界面美观。


    控件的caption是我们直接可以看到的名称,不作为代码一部分。而ID则是每个控件独一无二的身份,在程序中会被调用,ID可以被修改,毕竟生成的时候相同控件只会增加最后的数字值,当控件多的时候不利于区分,因此需要根据控件的作用,人为修改其ID使得区分方便。


    添加一个控件,如一个Edit Control,可以用于输入值、显示值,为了有一个值能够输入与输出,我们需要对该控件“关联”一个变量,因此在控件上右键:添加变量。类别改成Value,变量类型改成doubel,输入名称如“m_editNumb”。这一操作会有两项反应:一是Example37Dlg.h文件里Example37Dlg类的声明会增加一个public类型的数据double m_editNumb;一是Example37Dlg.cpp文件里DoDataExchange 函数增加了 DDX_Text(pDX, IDC_EDIT1, m_editNumb);此函数用于控件与变量之间交换值。需要我们在程序中调用CDialogEx::UpdateData()来间接调用DoDataExchange(),括号里需可以填TRUE或者FALSE,TRUE 表示从控件传给变量,FALSE 表示从变量传给数据。默认值是TRUE,即从控件传给变量。FALSE 表示从变量传给数据。默认值是TRUE,即从控件传给变量。


三:添加消息处理函数


    消息指的是我们对控件或者对话框进行操作时,发给内部的指令,比如我们在之前定义了变量,需要输入值进行交换,这时就需要我们给一个消息。按下按钮、滑动滑块等等操作都可以添加相应的消息处理函数,来应对我们当前操作所给的消息。


    最简单的添加消息处理函数的方式就是双击控件,也可以右键然后“添加事件处理程序”。比如增加一个Button按钮,双击它就会有如下函数:


void CExample37Dlg::OnBnClickedButton1()

{

// TODO: 在此添加控件通知处理程序代码

}

简单地,为了实现编辑框内输入数字后,点击Button可以将数字加一,修改代码如下:

void CExample37Dlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);//数据从控件传入变量
m_editNumb=m_editNumb+1;//变量值加一
        UpdateData(FALSE);//数据从变量传入控件
}

这样就完成了。

值得注意的是,一个控件可以有多种丰富的操作,比如按钮就有单击和双击,相应的“添加事件处理程序”的时候,就需要选择BN_CLICKED和BN_DOUBELCLICKED,因此,明确自己所需要的消息类型也是一个查询与积累的过程。


四:添加新的对话框


    在“资源视图”中,Dialog上右键“插入Dialog”就可以插入新的对话框,一般来说插入对话框之后需要在对话框上右键“添加类”,不然的话之后添加了控件没有地方去写消息处理函数了对吧。添加类,类名以C开头加上其他大写字母如CM_dialog会自动把开头的C去掉,增加新的M_dialog.h和M_dialog.cpp文件。注意类仍然是CM_dialog


    在主对话框中,比如需要点击按钮出现我们自定义的对话框,那么首要的就是在Example37Dlg.cpp里包含新对话框的头文件:#include"M_dialog.h",之后就是构造新对话框类的实体对象CM_dialog newDlg;函数DoModal()可以用于弹出对话框,修改后的函数如下:

void CExample37Dlg::OnBnClickedButton()
{
// TODO: 在此添加控件通知处理程序代码
INT_PTR nRes;// 用于保存DoModal 函数的返回值
CM_dialog newDlg; // 构造对话框类CM_dialog的实例
nRes = newDlg.DoModal(); // 弹出对话框
if (IDCANCEL == nRes) // 判断对话框退出后返回值是否为IDCANCEL,如果是则return,否则继续向下执行
return;
UpdateData(TRUE);//数据从控件传入变量
m_editNumb=m_editNumb+1;//变量值加一
        UpdateData(FALSE);//数据从变量传入控件
}

    这里要注意DoModal的返回值类型,先进行定义。在使用不同的函数体的时候,需要了解其返回值、形参有哪些。一般来说:类需要有对象,对象才有成员函数。在MFC里往往用一些类封装了很多操作,如使用CFontDialog类封装了字体对话框的所有操作 、使用文件对话框类CFileDialog封装了对文件对话框的操作,于是我们只需要先拿这些类定义下对象(注意所需要的参数),之后就可以拿对象来使用函数了,注意下返回值与参数。不过如CWnd类的成员函数MessageBox()和全局函数AfxMessageBox()这样的也可以不用定义对象直接使用,这就比较奇特了。不过感觉主要问题是寻找所需要的类与函数。


好文章,来自【福优学苑@音视频+流媒体】
***【在线视频教程】***