模态对话框和非模态对话框:
- 模态对话框是这样的对话框,当它弹出后,本应用程序其他窗口将不再接受用户输入,只有该对话框响应用户输入,在对它进行相应操作退出后,其他窗口才能继续与用户交互。
- 非模态对话框则是,它弹出后,本程序其他窗口仍能响应用户输入。非模态对话框一般用来显示提示信息等。
模态对话框是怎样弹出的?
- 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。
);
编辑框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编程入门教程之目录