对话框和控件

对话框是Windows应用程序中一种常用的资源,其主要功能是输出信息和接收用户的输入数据。控件是嵌入在对话框中或其它父窗口中的一个特殊的小窗口,它用于完成不同的输入、输出功能。对话框与控件关系密切,在每个对话框上一般都有一些控件,对话框依靠这些控件与用户进行信息的交互。

在MFC中,对话框的功能被封装在CDialog类中,而CDialog类是CWnd类的派生类。作为窗口,对话框和其它窗口一样具有窗口的一切功能。对话框的一个典型应用是通过菜单命令或工具栏按钮打开一个对话框,当然,对话框也可以作为一个程序的主界面。

MFC提供了一系列对话框类,并实现了对话框消息响应和处理机制。CDialog类是对话框类中最重要的类,我们在程序中创建的对话框类一般都是CDialog类的派生类。CDialog类还是其它所有对话框类的基类,其派生关系如下所示:CObject>CCmdTarget>CWnd>  CDialog。有关对话框的常用处理函数

  1. CDialog::CDialog()通过调用派生类构造函数,根据对话框资源模板定义一个对话框。
  2. CDialog::DoModal()激活模态对话框,显示对话框窗口。
  3. CDialog::Create()根据对话框资源模板创建非模态对话框窗口。如果对话框不是Visible属性,还需通过调用CWnd::ShowWindow()函数显示非模态对话框窗口。
  4. CDialog::OnOk()单击OK按钮时调用该函数,接收对话框输入数据,关闭对话框。
  5. CDialog::OnCancel()单击Cancel按钮或按Esc键时调用该函数,不接收对话框输入数据,关闭对话框。
  6. CDialog::OnInitDialog() WM_INITDIALOG消息处理函数,在调用DoModal或Create函数时系统发送WM_INITDIALOG消息,在显示对话框前调用该函数进行初始化。
  7. CDialog::EndDialog() 用于关闭模态对话框窗口。
  8. CWnd::ShowWindow() 显示或隐藏对话框窗口
  9. CWnd::DestroyWindow() 关闭并销毁非模态对话框
  10. CWnd::UpdateData() 通过调用DoDataExchange()设置或获取对话框控件的数据
  11. CWnd::DoDataExchange() 被UpdateData()调用以实现对话框数据交换,不能直接调用。
  12. CWnd::GetWindowText() 获取对话框窗口的标题
  13. CWnd::SetWindowText() 修改对话框窗口的标题
  14. CWnd::GetDlgItemText() 获取对话框中控件的文本内容
  15. CWnd::SetDlgItemText() 设置对话框中控件的文本内容
  16. CWnd::GetDlgItem() 获取控件或子窗口的指针
  17. CWnd::MoveWindow() 用于移动对话框窗口
  18. CWnd::EnableWindow() 使窗口处于禁用或可用状态

一般对话框工作流程

当定义了一个对话框类后,就可以利用这个对话框类声明一个对话框对象,即一个能够在屏幕上显示的对话框。

声明了一个对话框对象后,可以调用对话框类的成员函数DoModal()建立对话框窗口并显示对话框。例如,假设定义了一个名为CMyDialog的对话框类,为了在屏幕上显示一个对话框,可以编写如下代码:CMyDialog    myDlg; myDlg.DoModal();

函数OnOK()、 OnCancel()与DoModal()的关系:

对话框中一般都有OK和Cancel按钮,单击OK按钮时调用CDialog::OnOK()函数,单击Cancel按钮时调用CDialog::OnCancel()函数。OnOK()函数和OnCancal()函数都将结束DoModal()函数调用,但令DoModal()返回不同的值。OnOK()函数令DoModal()返回IDOK,OnCancel()函数令DoModal()返回IDCANCAL。用户可以根据DoModal()的返回值做出不同的选择。如:if (myDlg.DoModal() = = IDOK ){  …… }

对话框的初始化可以在三个不同的阶段所调用的函数中进行:

  1. 对话框类构造函数;
  2. WM_CREATE消息处理函数;
  3. WM_INITDIALOG消息处理函数。

通常是在消息WM_INITDIALOG的消息处理函数OnInitDialog()中进行初始化。在收到WM_INIT- DIALOG消息时,对话框的框架已创建,对话框中的每个控件也已建立起来,但它们还没有在屏幕上显示。此时自然可以设置或优化对话框中各个控件的外观、尺寸、位置以及其它属性。函数OnInitDialog()将被成员函数DoModal()调用。

公用对话框

为了在MFC应用程序中使用公用对话框,MFC提供了封装这些公用对话框的类。这些公用对话框类都是从CCommonDialog类派生而来,而CCommonDialog类又是CDialog类的派生类。

MFC公用对话框类

  1. CColorDialog 颜色设定对话框,选择不同的颜色
  2. CFileDialog 文件存取对话框,打开或保存文件
  3. CFindReplaceDialog   查找和替换对话框,查找和替换文本串
  4. CFontDialog 字体设定对话框,选择不同的字体。
  5. CPagesSetupDialog 页面设置对话框,设置页码、页眉等
  6. CPrintDialog 标准的打印对话框,用于打印和打印设置
  7. COleDialog 该类及其派生类用于生成OLE对话框

标准控件

Windows提供的控件分为两类:标准控件和公共控件。

标准控件:静态控件、编辑框、按钮、列表框、组合框和滚动条等。利用标准控件可满足大部分用户界面程序设计的要求。

公共控件:滑块、进度条、列表视控件、树视控件和标签控件等,利用公共控件实现应用程序用户界面风格的多样性。

控件是Windows提供的完成特定功能的独立小部件,它使应用程序对话功能的设计更容易完成,在对话框与用户的交互过程中担任主要角色,用于完成用户输入和程序运行过程中的输出。控件对应一个CWnd派生类的对象,它实际上也是一个窗口,可以通过调用窗口类的成员函数实现控件的移动、显示或隐藏、禁用或可用等操作,也可以重新设置它们的尺寸和风格等属性。MFC以类的形式对标准控件和公共控件进行了封装,这些类大部分是从CWnd类直接派生而来。

常用的MFC控件类

实例

文件对话框CFileDialog,动画控件CAnimateCtrl,列表框控件CListBox,其关键代码

void CDlgControlDlg::DoDataExchange(CDataExchange* pDX)
{
// CAnimateCtrl mWndAnimate;
// CListBox mListFileName;
// CString mStrFilePath;
// CString mStrFileName;
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_ANIMATE1, mWndAnimate);//动画控件的关联控件变量
DDX_Control(pDX, IDC_LIST_FILENAME, mListFileName);//列表框控件关联的控件变量
DDX_LBString(pDX, IDC_LIST_FILENAME, mStrFileName);//列表框控件关联的字符串变量
DDX_Text(pDX, IDC_EDIT_FILEPATH, mStrFilePath);//编辑框控件关联的字符串变量
}
//按钮事件,打开avi的文件对话框事件
void CDlgControlDlg::OnBnClickedButtonOpenfile()
{
//CFileDialog--打开或保存对话框,构造函数的参数lpszFilterd的格式
//1.过滤字符串以“||”作为结束符
//2.过滤字符串中不同的行以“|”分割
//3.每一行有被分为两部分,以“|”分割,(显示在下列框的字符|过滤字符信息)
TCHAR szFilter[]=L"视频文件(*.avi)|*.avi|所有文件(*.*)|*.*||";
CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY,szFilter);
if (IDOK!=dlg.DoModal())
{
return;
}
mStrFilePath=dlg.GetPathName();//将文件路径显示在编辑框控件上
UpdateData(FALSE);
//将文件路径显示到编辑框控件上
CString strName=dlg.GetFileName();
if (LB_ERR==mListFileName.FindString(-1,strName))
{
int nItem=mListFileName.AddString(strName);
//保存路径
CString* pPath=new CString;
*pPath=mStrFilePath;
mListFileName.SetItemData(nItem,(DWORD)pPath);
}
Play();
}
//双击列表框事件
void CDlgControlDlg::OnLbnDblclkListFilename()
{
int nSel=mListFileName.GetCurSel();//获取当前的选择项
if (nSel==LB_ERR)
{
return;
}
CString* pPath=(CString*)mListFileName.GetItemData(nSel);//获取列表框中保存的文件路径
mStrFilePath=*pPath;
UpdateData(FALSE);
Play();
}
//动画播放成员函数
void CDlgControlDlg::Play()
{
mWndAnimate.Open(mStrFilePath);
mWndAnimate.Play(0,-1,-1);
}

其结果:

MFC对话框和控件的更多相关文章

  1. 【转】MFC对话框和控件

    原文网址:http://www.cnblogs.com/tiwlin/archive/2013/05/08/3067966.html 对话框和控件 对话框是Windows应用程序中一种常用的资源,其主 ...

  2. MFC对话框Dialog控件处理程序handler因为public修饰符导致无法访问

    比如说你的Dialog有一个Button名为Confirm,对应IDC_CONFIRM,处理程序handler为OnConfirm 那么OnConfirm必须是protected属性,如果是publi ...

  3. MFC编程入门之九(对话框:为控件添加消息处理函数)

    这一节讲的主要内容是如何为控件添加消息处理函数. MFC为对话框和控件定义了诸多消息,我们对他们操作时会触发消息,这些消息最终由消息处理函数处理,比如我们点击按钮时就会产生BN_CLICKED消息,修 ...

  4. MFC编程入门之七(对话框:为对话框添加控件)

    创建对话框资源需要创建对话框模板.修改对话框属性.为对话框添加各种控件等步骤,前面一讲中已经讲了创建对话框模板和修改对话框属性,本节继续讲如何为对话框添加控件.  上一节中创建了一个名为"A ...

  5. VS2010/MFC对话框二:为对话框添加控件)

    为对话框添加控件 创建对话框资源需要创建对话框模板.修改对话框属性.为对话框添加各种控件等步骤,前面一讲中已经讲了创建对话框模板和修改对话框属性,本节继续讲如何为对话框添加控件. 上一讲中创建了一个名 ...

  6. VS2010/MFC编程入门之七(对话框:为对话框添加控件)

    创建对话框资源需要创建对话框模板.修改对话框属性.为对话框添加各种控件等步骤,前面一讲中鸡啄米已经讲了创建对话框模板和修改对话框属性,本节继续讲如何为对话框添加控件. 上一讲中鸡啄米创建了一个名为“A ...

  7. VC2005从开发MFC ActiveX ocx控件到发布到.net网站的全部过程

      开篇语:最近在弄ocx控件发布到asp.net网站上使用,就是用户在使用过程中,自动下载安装ocx控件.(此文章也是总结了网上好多人写的文章,我只是汇总一下,加上部分自己的东西,在这里感谢所有在网 ...

  8. 最全的基于MFC的ActiveX控件开发教程

    浏览器插件之ActiveX开发(一) 一般的Web应用对于浏览器插件能不使用的建议尽量不使用,因为其涉及到安全问题以及影响用户安装(或自动下载注册安装)体验问题.在有特殊需求(如涉及数据安全的金融业务 ...

  9. MFC中给控件添加变量,DoDataExchange中

    DoDataExchange函数其实是一项数据动态绑定技术.比如你在写动态按钮过程中须对按钮添加变量时,怎么添加?控件类已经写好了,其变量是已经固定的.你要添加新的变量就要用到DoDataExchan ...

随机推荐

  1. 2020年我国到底有多少程序员?现在学习java还来得及吗?

    中国有多少程序员?现在还值得学java吗? 跪求关注,祝关注我的人都:身体健康,财源广进,福如东海,寿比南山,早上贵子,从不掉发! JAVA起于1995年,经过20多年的发展,JAVA如今已经发展成为 ...

  2. Springboot 添加热部署

    Pom 文件 添加依赖 添加插件 修改idea ,启动自动部署 <!--配置热部署--> <dependency> <groupId>org.springframe ...

  3. kubernetes基础——一文读懂k8s

    容器 容器与虚拟机对比图(左边为容器.右边为虚拟机)   容器技术是虚拟化技术的一种,以Docker为例,Docker利用Linux的LXC(LinuX Containers)技术.CGroup(Co ...

  4. Oracle表空间概述及其基本管理

    最近在工作中遇到有同事对Oracle表空间的理解有问题,所以写了这篇文章.我会从概念,管理及特别需要关注的点等几个维度对表空间进行一些介绍.本文以介绍表空间为主,涉及到的其他概念不展开描述.有问题的地 ...

  5. 2013 ACM/ICPC Asia Regional Online —— Warmup2 ABEGKL

    HDU4716 A. A Computer Graphics Problem A题目描述 题意:输出手机剩余电量,保证给出的数是10的倍数. 题解:水题,按题意输出即可. 代码: #include & ...

  6. MySQL故障演习

    MySQL故障演习 接上次的 MySQL定时备份 该次实验主要是练习在MySQL数据库发生误删等意外情况下,利用全量备份文件和增量备份文件恢复数据. 1. 实验环境 -- 创建数据库 create d ...

  7. java架构之路(多线程)JMM和volatile关键字(二)

    貌似两个多月没写博客,不知道年前这段时间都去忙了什么. 好久以前写过一次和volatile相关的博客,感觉没写的那么深入吧,这次我们继续说我们的volatile关键字. 复习: 先来简单的复习一遍以前 ...

  8. C++Primer第五版 6.1节练习

    练习6.1:实参和形参的区别是什么? 通俗解释: 实参是形参的初始值.编译器能以任意可行的顺序对实参求值.实参的类型必须与对应的形参类型匹配. 详解1) 形参变量只有在函数被调用时才会分配内存,调用结 ...

  9. ReactNative: 将自定义的ReactNative组件制作成第三方库的详细流程(制作-->发布)

    一.简介 在讲本篇博文之前,需要你熟知怎么自定义ReactNative组件,然后才好学习将自定义的ReactNative组件制作成第三方库.本文中的自定义的ReactNative组件LoginMana ...

  10. 洛谷p1137 模拟退火

    题目链接:https://www.luogu.org/problem/P1337 以x为原点,将力分解成横纵方向的力,每次退火时单独对答案的横纵坐标进行判断是否更新答案 #include<ios ...