MFC 对话框与控件的使用

这篇具有很好参考价值的文章主要介绍了MFC 对话框与控件的使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、实验目的:

1、 熟悉 Windows 对话框应用程序开发的基本过程;

2、 学习标准控件的使用;

3、 学些 CommonDialog ActiveX 控件的使用;

4、 练习较复杂的交互式操作的控制流程;

5、 练习文件输入/输出流的使用。

二、实验内容

实现一个具有一定实用价值的通讯录程序设计。界面如图所示

MFC 对话框与控件的使用

三、 实验主要原理说明

①界面的基本设计

  1. 开发windows应用程序,往往是从界面开发开始。在资源视图中把对话框调出,把对话框中自带的控件删掉,放入自己所需要的控件。

  2. 先设立两个组合框Group Box(Group Box组合框会将组合框内的控件标识为一组控件来使用:只能选择其中的一个控件),将两个组合框属性中的描述文字分别改为:联系人、地址簿,便于用户区分。在联系人组合框中放入两组Static Text和Eidt Control分别表示姓名和电话号码,并再放一组Static Text和Combo Box(组合框控件:由一个文本输入控件和一个下拉菜单组成。用户可以从一个预先定义的列表里选择一个选项,同时也可以直接在文本框里输入文本。)表示用户可以选择的群组。Ctrl选中联系人里面的控件进行位置调整。

  3. 在对话框中放入六个Button控件,Ctrl选中这六个控件进行位置调整,并在属性中对这六个按钮的描述文字依次改成载入、保存、退出、新建、更新、删除,供用户进行使用。

  4. 在地址簿这个组合框中放入List Control控件(相当于一个表格),调整大小,在该控件的属性栏中,单选设置为True(表示用户只能选择该列表的一个元素)、视图设为Report(以报表的形式呈现给用户)、文本右对齐设为True、始终显示选定的内容设置为True、

  5. 为所有用户需要的控件进行ID修改,以便后面类向导给控件绑定变量时进行区分:

    控件 ID
    姓名Edit Control IDC_EDITNAME
    号码Edit Control IDC_EDITNUMBER
    群组Combo Box IDC_COMBOGROUP
    载入Button IDC_BUTTONLOAD
    保存 Button IDC_BUTTONSAVE
    退出 Button IDC_BUTTONEXIT
    新建 Button IDC_BUTTONNEW
    更新 Button IDC_BUTTONUPDATA
    删除 Button IDC_BUTTONDELETE
    地址簿List Control IDC_LISTCONTROL
  6. 插入ActiveX控件:Microsoft Common Dialog Control version6.0(这是一个共用控件,可以调用字体格式选择对话框,打开文件对话框,打印对话框,保存对话框,颜色选择框),该对话框对于用户来说是不可见的。在属性一栏中,将Filter设置为:文本文件(.txt)|.txt|所有文件(.)|.* 。下表是通用对话框的使用方法:

    *方法* *所显示的对话框*
    *ShowOpen* 显示“打开”对话框
    *ShowSave* 显示“另存为”对话框
    *ShowColor* 显示“颜色”对话框
    *ShowFont* 显示“字体”对话框
    *ShowPrinter* 显示“打印”或“打印选项”对话框
    *ShowHelp* 调用 Windows 帮助引擎
  7. 打开类向导,添加成员变量

    控件ID 控件类型 类别 名称 访问 变量类型
    IDC_COMBOGROUP COMBOBOX m_sGroup public CString
    IDC_COMBOGROUP COMBOBOX 控件 m_ComboGroup public CComboBox
    IDC_COMMONDIALOG1 OCX 控件 FileDialog public COMMONDIALOG1
    IDC_EDITNAME EDIT m_sName pubilc CString
    IDC_EDITNAME EDIT 控件 m_EditName public CEdit
    IDC_EDITNUMBER EDIT m_sNumber public CString
    IDC_LISTCONTROL SysListView32 控件 m_ListControl public CListCtrl

    CString、CComboBox、COMMONDIALOG1、CEdit、CString、CListCtrl这些变量类型都是MFC已经封装好的类,里面有对应的方法可以使用、查看。添加完这些成员变量之后,我们的项目中会有三个类被创建:COMMONDIALOG1、CExperiment3App、CExperiment3Dlg。界面的设计基本已经完成

②类的基本设计

  1. 将实验一中的代码拷贝到现在的项目中,进行复用(在头文件中添加address.h 在源文件中添加addresss.cpp)。

  2. 在Experiment3Dlg.h中添加头文件address.h ,即(#include “address.h”) ,并在CExperiment3Dlg.cpp、addressbook.cpp中添加头文件pch.h。(在MFC项目中所有的源文件前都必须含有pch.h这个头文件)

  3. 在Experiment3Dlg.h中除了之前用类向导添加的变量,另外添加AddressBook的实例book。

  4. 给用户操作的按钮:载入、保存、新建、更新、删除 都需要有对应的方法来对数据进行操作。另外,需要一个辅助函数对数据进行刷新。可以右键类Addressbook,选中添加函数,可快速添加函数。

    方法对应的按钮 函数名 返回类型 访问 .cpp文件 参数
    载入 LoadFile void public Addressbook.cpp CString Filename
    保存 SaveFile void public Addressbook.cpp CString Filename
    新建 AddContact void public Addressbook.cpp string
    更新 Update void public Addressbook.cpp Int nstring namestring numberstring group
    删除 Delete void public Addressbook.cpp Int n
    辅助函数 RefreshData void public Addressbook.cpp bool fromDlgToVector

    但这样操作也会产生相对应的问题:

    如果Addressbook中存在名称为Delete的函数,即使我们添加的函数返回值和传入参数不一样,也不能添加名称为Delete的函数。需要自己手动添加。

    Tip:由于涉及到读入文件,记得在源文件前加入fstream文件流(#include “fstream”)

    对应的函数代码如下:

    载入按钮:

    void AddressBook::LoadFile(CString Filename)
    {
        // TODO: 在此处添加实现代码.
        ifstream inputFile;
        string Name, Number, Group;
        try
        {
            inputFile.open(Filename);
            Book.clear();
    ​
            while (!inputFile.eof())
            {
                inputFile >> Name >> Number >> Group;
                AddContact(Name, Number, Group);
            }
        }
        catch (exception& e)
        {
            throw(e);
        }
    }

    保存按钮:

    void AddressBook::SaveFile(CString Filename)
    {
        // TODO: 在此处添加实现代码.
        ofstream outputFile;
        string Name, Number, Group;
        try
        {
            outputFile.open(Filename);
            int Count = Book.size();
            for (int index = 0 ; index < Count; index++)
            {
                if (index > 0)
                    outputFile << endl;
                Book[index].getContact(Name, Number, Group);
                outputFile << Name << " " << Number << " " << Group;
            }
        }
        catch (exception& e)
        {
            throw(e);
        }
    }

    删除按钮:

    void AddressBook::Delete(int n)
    {
        if (n >= 0 && n < Book.size())
        {
            vector<CContact>::iterator pos = Book.begin() +n ;
            Book.erase(pos);
        }
    }
    ​
    更新按钮:
    
    void AddressBook::Update(int n, string name, string number, string group)
    {
        if (n >= 0 && n < Book.size())
        {
            Book[n].setContact(name,number,group);
        }
    }

③事件的基本设计

所谓事件设计,就相当于是界面设计(呈现给用户的操作方式)和类设计(对于数据的操作)中间的桥梁。

  1. 初始化过程

    1). 对于地址簿(List Control)的初始化

    地址簿对应的变量名为m_ListControl,变量类型为CListCtrl.

    (CListCtrl是列表控件类,列表控件的每一行叫做一个item,每一列叫做一个subitem。每一行和每一列都有个ID号,可以确定唯一的单元格。)

    该类中具有两个构建列表的方法:

    m_pListCtrl->InsertColumn(0,"第一列");

    列索引从0开始,InsertColumn函数将在列表中建立一个列,如果数据有三列,就调用三次此函数,索引分别是0,1,2。

    m_pListCtrl->InsertItem(0,"第一行");

    行索引从0开始,InsertColumn函数将在列表中建立一个行,如果数据有三行,就调用三次此函数,索引分别是0,1,2。

    这里我们的初始化代码如下:

        m_ListControl.InsertColumn(0, _T("姓名"), LVCFMT_LEFT, 100);
        m_ListControl.InsertColumn(1, _T("电话号码"), LVCFMT_LEFT, 100);
        m_ListControl.InsertColumn(2, _T("群组"), LVCFMT_LEFT, 100);

    2).对于群组进行初始化

    群组对应的控件变量名为m_ComboGroup,变量类型为CComboBox.

    群组对应的值变量名为m_sGroup,变量类型为CString.

    这里我们的初始化代码如下:

    m_ComboGroup.AddString(_T("朋友"));
    
    m_ComboGroup.AddString(_T("同事"));
    
    m_ComboGroup.AddString(_T("家人"));
    
    m_ComboGroup.AddString(_T("同学"));
    
    m_ComboGroup.AddString(_T("网友"));
    
    m_sGroup = _T("朋友");

    _T宏可以把一个引号引起来的字符串,根据你的环境设置,使得编译器会根据编译目标环境选择合适的(Unicode还是ANSI)字符处理方式

    3).对于文件的初始化

    FileName = "";

    (涉及到文件,在Experiment3Dlg.h中添加访问对象为pubilc,类型为CString,名称为FileName的变量)

    4).UpdateData(FALSE);

    (UpdateData(TRUE)的作用是将文本框界面值跟新到控件变量;

    UpdateData(FALSE)的作用是将控件变量的值更新到界面中)

  2. 为按钮载入、保存、退出、新建、更新、删除添加事件处理程序

    按钮 消息类型 函数名
    载入 CExperiment3Dlg BN_CLICKED OnBnClickedButtonload
    保存 CExperiment3Dlg BN_CLICKED OnBnClickedButtonsave
    退出 CExperiment3Dlg BN_CLICKED OnBnClickedButtonexit
    新建 CExperiment3Dlg BN_CLICKED OnBnClickedButtonnew
    更新 CExperiment3Dlg BN_CLICKED OnBnClickedButtonupdata
    删除 CExperiment3Dlg BN_CLICKED OnBnClickedButtondelete

    载入按钮的事件处理程序:

    void CExperiment3Dlg::OnBnClickedButtonload()
    {
        // TODO: 在此添加控件通知处理程序代码
        FileDialog.ShowOpen();
        FileName = FileDialog.get_FileName();
        try
        {
            book.LoadFile(FileName);
            RefreshData(false);
        }
        catch (exception& e)
        {
            MessageBox(CString(e.what()),CString("Warning!"));
        }
    }

    为了方便刷新数据,创建一个RefreshData函数:

    void CExperiment3Dlg::RefreshData(bool fromDlgToBook)
    {
        // TODO: 在此处添加实现代码.
        if (fromDlgToBook)
        {
            int Count = m_ListControl.GetItemCount(); //获取列表框的行数
            CString sName, sNumber, sGroup;
            string name, number, group;
            if (Count > 0)
            {
                book.clear();
                for (int index = 0; index < Count; index++)
                {
                    sName = m_ListControl.GetItemText(index, 0);
                    sNumber = m_ListControl.GetItemText(index, 1);
                    sGroup = m_ListControl.GetItemText(index, 2);
                    name = string(CW2A(sName.GetString()));
                    number = string(CW2A(sNumber.GetString()));
                    group = string(CW2A(sGroup.GetString()));
                    book.AddContact(name, number, group);
                }
            }
    ​
        }
        else
        {
            int Count = book.getCount();
            CString sName, sNumber, sGroup;
            string name, number, group;
            if (Count > 0)
            {
                m_ListControl.DeleteAllItems();
                for (int index = 0; index < Count; index++)
                {
                    book[index].getContact(name, number, group);
                    sName = CString(name.c_str());
                    sNumber = CString(number.c_str());
                    sGroup = CString(group.c_str());
                    m_ListControl.InsertItem(index, sName);
                    m_ListControl.SetItemText(index, 1, sNumber);
                    m_ListControl.SetItemText(index, 2, sGroup);
                }
            }
        }
    }

    如果传入值为True,就把列表框中的数据更新到我们的vector中,如果传入值为False,就把vector中的数据更新到列表框中。

    我们定义的这个函数其实有点类似于MFC自带的UpdateData函数(之前在初始化的时候用过),只不过UpdateData函数实现的是对话框中的数据和控件变量数据之间的更新,而我们这里定义的RefreshData函数,实现的是控件变量和vector容器之间的更新。

    Tip: CW2A 将宽字符集(Unicode)转化为多字符集(ASCII)

    CA2W 将多字符集(ASCII)转化为宽字符集(Unicode)

    为列表添加一个事件处理程序,消息类型为NM_CLICK.表示如果选中地址簿中的一行,可以将该行的数据更新到联系人中给用户看:

    void CExperiment3Dlg::OnNMClickListcontrol(NMHDR* pNMHDR, LRESULT* pResult)
    {
        LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
        // TODO: 在此添加控件通知处理程序代码
        POSITION pos;
        pos = m_ListControl.GetFirstSelectedItemPosition();
        int index = m_ListControl.GetNextSelectedItem(pos);
        if (index >= 0)
        {
            string name, number, group;
            book[index].getContact(name, number, group);
            m_sName = CString(name.c_str());
            //m_sNumber
            m_sNumber = CString(number.c_str());
            m_sGroup = CString(group.c_str());
            UpdateData(FALSE);
        }
        *pResult = 0;
    }

    保存按钮的事件处理程序:

    void CExperiment3Dlg::OnBnClickedButtonsave()
    {
        // TODO: 在此添加控件通知处理程序代码
        if (FileName.IsEmpty())
        {
            FileDialog.ShowSave();
            FileName = FileDialog.get_FileName();
        }
        try
        {
            book.SaveFile(FileName);
        }
        catch (exception& e)
        {
            MessageBox(CString(e.what()), CString("Warning!"));
        }
    }

    新建按钮的事件处理程序:

    void CExperiment3Dlg::OnBnClickedButtonnew()
    {
        // TODO: 在此添加控件通知处理程序代码
        UpdateData(TRUE);
        if (!m_sName.IsEmpty())
        {
            int count = m_ListControl.GetItemCount();
            m_ListControl.InsertItem(count, m_sName);
            m_ListControl.SetItemText(count, 1, m_sNumber);
            m_ListControl.SetItemText(count, 2, m_sGroup);
            string name(CW2A(m_sName.GetString()));
            string number(CW2A(m_sNumber.GetString()));
            string group(CW2A(m_sGroup.GetString()));
            book.AddContact(name, number, group);
            m_sName = "";
            m_sNumber = "";
            m_sGroup = "朋友";
            UpdateData(FALSE);
            m_EditName.SetFocus();
        }
    }

    退出按钮的事件处理程序:

    void CExperiment3Dlg::OnBnClickedButtonexit()
    {
        // TODO: 在此添加控件通知处理程序代码
        OnOK();
    }

    更新按钮的事件处理程序:

    void CExperiment3Dlg::OnBnClickedButtonupdate()
    {
        // TODO: 在此添加控件通知处理程序代码
        UpdateData(TRUE);
        int position(m_ListControl.GetSelectionMark());
        book[position].setContact(string(CW2A(m_sName.GetString())), string(CW2A(m_sNumber.GetString())), string(CW2A(m_sGroup.GetString())));
        RefreshData(FALSE);
    }

    删除按钮的事件处理程序:

    void CExperiment3Dlg::OnBnClickedButtondelete()
    {
        // TODO: 在此添加控件通知处理程序代码
        int position(m_ListControl.GetSelectionMark());
        book.Delete(position);
        m_sName = "";
        m_sNumber = "";
        m_sGroup = "朋友";
        UpdateData(FALSE);
        RefreshData(FALSE);
    }

    排序按钮的事件处理程序:

    void CExperiment3Dlg::OnBnClickedButtonsort()
    {
        book.sort();
        RefreshData(FALSE);
    }

到这里,该MFC设计基本就结束了

这本是一篇实验报告,至于为什么产生将它写好并发出来的想法,主要是明白了写实验报告的意义,刚开始跟着老师做完这个实验的时候,对里面的很多东西都是懵的,直到在写实验报告时,才慢慢理解写实验报告的目的其实就是内化这个项目里面所涉及到的知识的过程。也逐渐明白为什么会有那么多人在CSDN上发博客,一方面是内化自己所学的东西,一方面也是为了给那些正在学的人提供帮助。之前也有在学python的Django框架,但学的过程中很多地方不理解,就没有再学下去了。现在也知道以后该怎么去学习做一个项目,等有空一定要把Django拿下,也希望自己的这篇文章能给有需要的人提供力所能及的帮助。文章来源地址https://www.toymoban.com/news/detail-447267.html

到了这里,关于MFC 对话框与控件的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • MFC 通用对话框之颜色对话框

    MFC 通用对话框之颜色对话框

    CColorDialog类封装了颜色对话框,此类允许您将颜色选择对话框合并到应用程序中。颜色对话框就像画家的调色板一样,可显示系统定义的颜色列表,用户可以从列表中选择或创建特定颜色。构造一个CColorDialog类对象后,可用 DoModal( ) 函数来显示颜色对话框。 CColorDialog 的构造

    2024年02月06日
    浏览(38)
  • MFC 通用对话框之文件对话框

    MFC 通用对话框之文件对话框

    CFileDialog 类 封装了Windows通用文件对话框,Windows通用文件对话框提供了轻松实现与Windows标准一致的打开文件、保存文件、另存文件对话框的方法。 当我们用CFileDialog类的构造函数生成一个对象后就修改 m_ofn 结构体对象里的值, m_ofn 的类型为 OPENFILENAME。 CFileDialog类构造函数的

    2024年02月05日
    浏览(49)
  • MFC(十二)多个对话框

    MFC(十二)多个对话框

    我们来制定多个对话框,每个对话框都有不同的功能,单击下一步,即可跳转到下一个对话框 1.新建一个启动按钮 2.在资源视图,Dialog里面,右键--添加资源----dialog====选择IDD PROPPAGE_SMALL新建 属性页,改名为PROP01 3.打开工具箱,添加group box,group box控件的作用是建立了一个分

    2024年02月07日
    浏览(16)
  • MFC(十三)多个对话框

    1.打开类视图,右键项目---类向导--添加Cpropsheet类,命名为mypropsheet CPropertySheet 是 MFC 的一个类,用于创建包含多个属性页的对话框。它可以使用内置的向导模式,向用户显示“下一步”和“上一步”按钮 2.在Cmypropsheet.h中,声明三个属性类的对象  3.在构造函数里,把三个对

    2024年02月08日
    浏览(13)
  • MFC为对话框资源添加类

    MFC为对话框资源添加类

    VC6新建一个对话框类型的工程; 建立之后资源中默认有2个对话框,一个是主对话框,About这个是默认建立的关于版权信息的; 然后主对话框有对应的.h和.cpp文件;可以在其中进行编程;   默认建立的有一个 关于 对话框;   在资源中新插入一个对话框,IDD_DIALOG1是对话框I

    2024年02月01日
    浏览(11)
  • MFC 给对话框添加图片背景

    MFC 给对话框添加图片背景

    在windows开发当中做界面的主要技术之一就是使用MFC,通常我们看到的QQ,360,暴风影音这些漂亮的界面都可以用MFC来实现。今天我们来说一下如何用MFC美化对话框,默认情况下,对话框的背景如下: 那么,我们如何将它的背景变成如下界面呢,而且还要保留对话框的移动功能,

    2024年02月06日
    浏览(18)
  • Opencv显示图片(MFC基于对话框窗口)

    Opencv显示图片(MFC基于对话框窗口)

    #1.编辑对话框按钮,修改各个按钮窗口ID和绑定变量 picture 控件 “打开图片”按钮控件 #2.编写显示图片函数 void DrawMat(cv::Mat img, UINT nID); .h文件进行声明 .cpp进行定义 #3.定义CString fun_LoadImg();函数 .h文件进行声明 .cpp文件进行定义 #4.双击“打开图片”按钮 系统自动弹出响应函数

    2024年04月15日
    浏览(15)
  • MFC 单文档弹出对话框 标题图标

    创建MFC时 1、应用程序类型:以单个文档-项目样式选择MFC标准 菜单关联对话框  2、菜单关联-资源视图中的Menu-IDR_MAINFRAME(此处看想关联谁,如果是想关联一个对话框,那就先创建一个对话框再进行关联,如果是想关联一个类,可以看函数在哪个类下面从而进行关联) a.关联

    2024年02月06日
    浏览(13)
  • MFC第十八天 非模式对话框、对话框颜色管理、记事本项目(查找替换、文字和背景色、Goto(转到)功能的开发)

    MFC第十八天 非模式对话框、对话框颜色管理、记事本项目(查找替换、文字和背景色、Goto(转到)功能的开发)

    a)调用CDialog::Create函数实现,例如:QQ的聊天框,记事本的查找等。 b)非阻塞,对象的生命期必须足够,否则就析构时摧毁了。 c)可以采用堆空间申请多例模式,也可以用全局或者成员。 d)EndDialog只对模式对话框有效,对非模式对话框无效,如果要摧毁调用DestroyWindow (只是隐

    2024年02月17日
    浏览(45)
  • QML控件和对话框之ApplicationWindows

    QML控件和对话框之ApplicationWindows

    Application Window在 Qt Quick Controls中类似于QMain Window 在 Qt/C++中的角色,ApplicationWindow可以充当应用程序顶层窗口,具有自己的布局,包含menuBar、toolBar、statusBar等属性,可以使用平台无关的方式方便地添加菜单栏、工具栏和状态栏等项目,该类型还包含一个contentltem属性,用来进

    2023年04月22日
    浏览(9)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包