MFC相关知识(二)

模态对话框和非模态对话框:

  • 模态对话框是这样的对话框,当它弹出后,本应用程序其他窗口将不再接受用户输入,只有该对话框响应用户输入,在对它进行相应操作退出后,其他窗口才能继续与用户交互。
  • 非模态对话框则是,它弹出后,本程序其他窗口仍能响应用户输入。非模态对话框一般用来显示提示信息等。

模态对话框是怎样弹出的?

  • CTESTApp类下InitInstance()函数:
  • `
    CTEST1Dlg dlg;//定义对话框类CTEST1Dlg 的对象dlg
    m_pMainWnd = &dlg;// 将dlg 设为主窗口
    INT_PTR nResponse = dlg.DoModal();// 弹出对话框dlg,并将DoModal 函数的返回值(退出时点击按钮的ID)赋值给nResponse
    if (nResponse == IDOK)// 判断返回值是否为OK 按钮
    {
        // TODO: 在此放置处理何时用
        //  “确定”来关闭对话框的代码
    }
    else if (nResponse == IDCANCEL)// 判断返回值是否为Cancel 按钮
    {
        // TODO: 在此放置处理何时用
        //  “取消”来关闭对话框的代码
    }
  • 弹出对话框比较关键的一个函数,就是对话框类的DoModal()函数。
  • CDialog::DoModal()函数的原型为:
  • virtual INT_PTR DoModal();
  • 返回值:整数值,指定了传递给CDialog::EndDialog(该函数用于关闭对话框)的nResult 参数值。如果函数不能创建对话框,则返回-1;如果出现其它错误,则返回IDABORT。
  • 调用了它对话框就会弹出,返回值是退出对话框时所点的按钮的ID,比如,我们点了“退出”按钮,那么DoModal 返回值为IDCANCEL

添加一个新对话框并弹出它:

void CTEST1Dlg::OnBnClickedSumButton()
{
    // TODO: 在此添加控件通知处理程序代码
    INT_PTR nRes; // 用于保存DoModal 函数的返回值
    CTipDlg tipDlg; // 构造对话框类CTipDlg 的实例
    nRes=tipDlg.DoModal();// 弹出对话框
    if (IDCANCEL == nRes) // 判断对话框退出后返回值是否为IDCANCEL,如果是则return,否则继续向下执行
        return;

    // 将各控件中的数据保存到相应的变量
   UpdateData(TRUE);
   // 将被加数和加数的加和赋值给m_editSum
   m_Sum1=m_Add2+m_Sum;
   UpdateData(FALSE);//变量到控件
}

模态对话框
m_pTipDlg = NULL;//在C++编程入门系列的指针的赋值和指针运算中说到过,在任何指针变量使用前都初始化,可以避免因误访问重要内存地址而破坏此地址的数据。
非模态对话框

常用控件:

消息就是由三个部分组成:消息值、wParam 参数和lParam 参数。

  • 消息值ID;
  • wParam参数:通知消息码(鼠标单击时的通知消息码就是BN_CLIC
    KED)
  • lParam参数:控件的句柄

控件的消息映射宏的格式大致是:

  • ON_通知消息码(nID, memberFun)
  • 消息映射宏应添加到BEGIN_MESSAGE_MAP 和END_MESSAGE_MAP 之间。
  • 消息处理函数声明的语法形式为:afx_msg void memberFun();

静态文本框:显示文字说明;MFC 提供了CStatic 类,封装了对静态文本框的所有操作。
动态创建静态文本框:

  • 需要使用CStatic 类的成员函数Create
  • -
virtual BOOL Create(
                     LPCTSTR lpszText,//在控件中显示的文字。如果为NULL则不会显示任何文字。
                     DWORD dwStyle,//静态控件的风格
                     const RECT& rect,//指定静态控件的位置和大小
                     CWnd* pParentWnd,//指定静态控件的父窗口,通常是一个CDialog 对象,不能是NULL。
                     UINT nID = 0xffff//静态控件的ID。
                   );

静态控件风格属性

CStatic类主要成员函数

编辑框Edit Control:
MFC 为编辑框提供了CEdit 类。编辑框的所有操作都封装到了CEdit 类中。

  • 编辑框上点右键,选择“Add Event Handler”,为编辑框添加消息处理函数;
  • EN_CHANGE:编辑框的内容被用户改变了,与EN_UPDATE 不同,该消息是在编辑框显示的正文被刷新后才发出的;
  • EN_ERRSPACE: 编辑框控件无法申请足够的动态内存来满足需要
  • EN_HSCROLL: 用户在水平滚动条上单击鼠标
  • EN_MAXTEXT:输入的字符超过了规定的最大字符数。在没有ES_AUTOHSCROLL或 ES_AUTOVSCROLL: 的编辑框中,当正文超出了编辑框的边框时也会发出该消息
  • EN_SETFOCUS:编辑框获得输入焦点
  • EN_UPDATE: 在编辑框准备显示改变了的正文时发送该消息
  • EN_VSCROLL: 用户在垂直滚动条上单击鼠标
    动态创建编辑框:
  • 调用CEdit 类的成员函数Create。
  • Create 成员函数的原型如下:
virtual BOOL Create(
                    DWORD dwStyle,//编辑框的风格
                    const RECT& rect,//控件的位置和大小
                    CWnd* pParentWnd,//父窗口
                    UINT nID
                   );

CEdit 类应用实例:

  • 创建项目,添加编辑框,修改ID为IDC_MULTI_LINE_EDIT,属性multi为ture;
  • 添加CEdit 类型的控件变量m_editMultiLine
    添加控件变量
  • 修改BOOL CTEST2Dlg::OnInitDialog()函数
BOOL CTEST2Dlg::OnInitDialog()
{
    CDialogEx::OnInitDialog();

    // 将“关于...”菜单项添加到系统菜单中。

    // IDM_ABOUTBOX 必须在系统命令范围内。
    ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    ASSERT(IDM_ABOUTBOX < 0xF000);

    CMenu* pSysMenu = GetSystemMenu(FALSE);
    if (pSysMenu != NULL)
    {
        BOOL bNameValid;
        CString strAboutMenu;
        bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
        ASSERT(bNameValid);
        if (!strAboutMenu.IsEmpty())
        {
            pSysMenu->AppendMenu(MF_SEPARATOR);
            pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
        }
    }

    // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
    //  执行此操作
    SetIcon(m_hIcon, TRUE);         // 设置大图标
    SetIcon(m_hIcon, FALSE);        // 设置小图标

    // TODO: 在此添加额外的初始化代码

    m_editMultiLine.SetWindowText(_T("鸡啄米博客/software")); // 设置编辑框正文为“鸡啄米博客.com”
    m_editMultiLine.SetSel(7, 10); // 选择起始索引为3,终止索引为5(不包括在选择范围内)的正文,即“博客”
    m_editMultiLine.ReplaceSel(_T("\r\nwww.jizhuomi.com")); // 将选择的“博客”替换为“\r\nwww.jizhuomi.com”
    return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

运行编译结果

按钮控件Button、Radio Button 和Check Box:

  • 命令按钮(Button)、单选按钮(Radio Button)和复选框(Check Box)
  • MFC 提供了CButton 类封装按钮控件的所有操作。

动态创建按钮控件:

  • CButton 类的成员函数Create 来创建按钮
virtual BOOL Create(
                    LPCTSTR lpszCaption,//按钮控件显示的文本
                    DWORD dwStyle,//指定按钮控件的风格
                    const RECT& rect,//控件位置和大小
                    CWnd* pParentWnd,//父窗口
                    UINT nID
                   );
  • CButton 类的主要成员函数:参考MSDN

按钮控件结果
列表框控件ListBox:

  • 列表框给出了一个选项清单,允许用户从中进行单项或多项选择,被选中的项会高亮显示。列表框可分为单选列表框和多选列表框,顾名思义,单选列表框中一次只能选择一个列表项,而多选列表框可以同时选择多个列表项。
  • 列表框也会向父窗口发送通知消息;
  • MFC 将列表框控件的所有操作都封装到了CListBox 类中。
  • 动态创建列表框
virtual BOOL Create(
                    DWORD dwStyle,
                    const RECT& rect,
                    CWnd* pParentWnd,
                    UINT nID
                    );
  • CListBox 类的主要成员函数,MSDN参考

列表框控件
组合框控件Combo Box

  • 组合框其实就是把一个编辑框和一个列表框组合到了一起,分为三种:简易(Simple)组合框、下拉式(Dropdown)组合框和下拉列表式(Drop List)组合框。
    组合框区别
  • 组合框被操作时会向父窗口发送通知消息
  • MFC 将组合框控件的所有操作都封装到了CComboBox 类中。
  • 动态创建组合框
virtual BOOL Create(
                     DWORD dwStyle,
                     const RECT& rect,
                     CWnd* pParentWnd,//指向父窗口的指针,不能为NULL
                     UINT nID
                  );
  • CComboBox 类的主要成员函数,参考MSDN

组合框运行结果

学习自 :
鸡啄米编程课堂
VS2010/MFC编程入门教程之目录

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值