MFC 对话框和常用教程.docx
《MFC 对话框和常用教程.docx》由会员分享,可在线阅读,更多相关《MFC 对话框和常用教程.docx(74页珍藏版)》请在冰豆网上搜索。
MFC对话框和常用教程
第五章对话框和常用控件
对话框是Windows应用程序中最重要的用户界面元素之一,是与用户交互的重要手段,在程序运行过程中,对话框可用于扑捉用户的输入信息或数据。
对话框是一个特殊类型的窗口,任何对窗口进行的操作(如:
移动、最大化、最小化等)都可在对话框中实施,一般来说,在对话框中通过各种控件(如:
按钮、编辑框、列表框、组合框等)来和用户进行交互。
控件是在系统内部定义的用于和用户交互的基本单元。
一、对话框的使用
VisualC++提供的对话框编辑器能“可视”地进行设计、编辑,并可用
ClassWizard为对话框从CDialog基类中派生一个类,MFC的CDialog类封装了用于对话框的显示、关闭等操作的许多功能函数,例如:
DoModal函数用来显示模式对话框并返回用户操作的结果。
1、模式对话框(为186附加举例页)
所谓模式对话框是指,当对话被弹出时,用户必须在对话框中进行相应的操作,在退出对话框之前,对话框所在的应用程序不能继续执行。
平常我们所见到的对话框大多是模式对话框。
例:
模式对话框(通过菜单命令弹出)
1)建一个单文档(SDI)应用程序
2)创建对话框模板
InsertResource选中Dialog单击New
拖过一个静态文本,鼠标对准它,按右键点properties改标题为“新建模式对话框”。
3)鼠标右键对准对话框的任何位置单击,选择properties选项,设置ID为IDD_MYDIALOG
4)给对话框创建类
双击新建对话框的任何位置,单击OK,写类名为“CMyDlg”,保
证”CDialog”作为该类的基类。
5)创建菜单命令:
a)打开资源编辑器的菜单项Menu
b)双击IDR_MAINFRAME
c)双击右边空白菜单,点开pop_up(让它是空白),在名字处写”弹出对话框(&A)”,ID处写ID_PUPDIALOG
6)将菜单命令连接到主框架程序中,完成ID_PUPDIALOG的消息映射:
ViewClassWizard保证Classname里是CMainFrame,在ObjectIDs
里找到ID_PUPDIALOG点黑Messages里(右边)点COMMAND建立主框架对象方法并加代码:
voidCMainFrame:
:
OnPupdialog()
{CMyDlgMyDlg;
MyDlg.DoModal();//DoModal()是CDialog类成员函数,通过调用该
//函数将显示对话框。
}
7)在CMainFrame.cpp文件里加:
#include“MyDlg.h”//之后运行。
2、无模式对话框(为186附加页)
非模式对话框,弹出后,可一直保留在屏幕上,用户可继续在应用中进行其它操作或启动其它应用程序,当需要使用对话框时,只需象激活一般窗口一样激活对话框即可。
1)建一个SDI(单文档)应用程序
2)创建对话框模板
InsertResource点黑DialogNew
拖过一个静态文本,鼠标对准它,按右键点properties改标题为“新建非模式对话框”。
3)为对话框创建类
点出对话框(IDD_DIALOG1缺省的ID号),双击对话框中的任意位置,出现一个表,你点OK出现一个对话框,你写类名:
CDlg保证基类为CDialog
4)创建菜单
打开工作区MenuIDR_MAINFRAME双击空白菜单写“非模式对话框”关闭再点下面空菜单写名字“显示非模式对话框”ID处写ID_DLG.
5)添加菜单命令消息
WiewClassWizardMessageMaps保证Classname里是Wiew类(视图类),在ObjectIDS里找到ID_DLG(菜单的ID)点黑右边COMMAND双击它OK
6)a、你在Wiew.h里加:
#include“Dlg.h”
b、在public:
里加:
CDlg*dlg;//创建CDlg对象
c、在View.cpp的OnDlg()函数里加:
CMyView:
:
OnDlg()
{
dlg=newCDlg(this);
dlg->Create(IDD_DIALOG1);//使对话框摸板从资源中创建一个非
//模式对话框
dlg->ShowWindow(SW_RESTORE);//显示对话框
}
二、使用对话框编辑器(对话框编程)(187页)
*1、可建一个单文档应用程序名为“对话框编程”,在此程序中加入一个对话框:
InsertResource点黑Dialognew出现188页的图
2、拖入一些控件,对这些控件进行排序、布局、大小调整、上下对齐、测试等。
*最后在对话框IDD_DIALOG1上留一个按钮控件,其标识符为:
IDC_BUTTON1
3、识别控件工具栏(188页)
4、在加对话框时,InsertResource点开+Dialog见有7类对话框,分别了解其
不同用途(见192页)。
5、对话框的属性
A、ViewPropertiesB、按Alt+EnterC、用鼠标右键单击对话框模板Properties
都能弹出对话框的属性框,见书193页对属性General的解释。
*6、为对话框添加类(194页)
对准对话框的任意非控件区域双击鼠标,将弹出书194页图5.11所示
的对话框,询问是否为对话框资源创建一个新类单击OK弹出书194页
图5.12所示的对话框你定义一个新类的名字如:
CMyDlg(注意:
类名必
须以C打头),下面的基类Baseclass和ID标识符DialogID内容一般不改。
*7、添映射消息(195页)
接上,点OK出现“MFCClassWizard”对话框,如书195页图5.13所示(保证类名处是CMyDlg)选定点黑IDC_BUTTON1单击BN_CLICKED消息AddFunction出现书195页图5.14对话框OKEditCode
*8、添加用户代码(195页)
接上,到MyDlg.cpp文件中,写:
voidCMyDlg:
:
OnButton1()
{
MessageBox(“欢迎进入对话框的设计!
”);
}//这时运行还不见对话框,接下
*9、在程序中使用对话框(196页)
由于对话框的代码是以类为模块来设计的,使用时需要在程序中加入该类
的头文件,并定义一个类对象,然后就可以使用该类的相关成员。
项目工作区FileView打开应用程序的.cpp文件,在前面加:
#include“MyDlg.h”
在InitInstance函数体中的returnTRUE语句之前添加下列代码:
CMyDlgdlg;
dlg.DoModal();//DoModal()函数是负责对话框的显示和终止。
运行!
则直接显示出对话框,单击按钮则出现“欢迎进入对话框的设计”
的字样。
本例建的CMyDlg类及以后在各个项目中建立的类,在文档、视图、主框
架类中都可同样使用。
(1)添加对话框资源
对话框资源类型:
IDD_DIALOGBAR对话条,往往和工具条放在一起。
IDD_FORMVIEW一个表状风格的对话框,用于无模式对话框或视图类
IDD_OLE_PROPPAGE_LARGE一个大的OLE属性页
IDD_OLE_PROPPAGE_SMALL一个小的OLE属性页
IDD_PROPPAGE_LARGE一个大属性页,用于属性对话框
IDD_PROPPAGE_MEDIUM一个中等大小的属性页,用于属性对话框
IDD_PROPPAGE_SMALL一个小的属性页,用于属性对话框
(2)改变对话框的属性
ID框:
修改或选择对话框的标识符名称
Caption框:
输入对话框的标题名称,中英文均可。
Font按钮:
单击此按钮可选择字体的种类(如宋体)及尺寸(如9号)
Xpos/Ypos:
对话框左上角在父窗口中的X,Y坐标都为0时表示居中
Menu框:
默认值为无,当对话框需要选单时输入或选择指定的选单资源
Classname:
默认值为无,它提供C/C++语言编程时所需要的对话框类名,对
MFC类库的资源文件来说,该项不被激活
三、控件的创建和使用方法(197页)
控件是在系统内部定义的能够完成特定功能的控制程序单元。
在应用程序中使用控件不仅简化了编程,还能完成常用的各种功能。
为了更好地发挥控件的作用,用户还必须理解和掌握控件的属性、消息以及创建和使用方法。
注:
控件工具栏及各按钮含义:
1、控件的选择2、静态文本3、组框4、复选框5、组合框6、水平滚动条
7、旋转按钮8、滑动条9、列表视图10、标签11、复合编辑12、月历
13、用户定制工具14、静态图片15、编辑框16、按钮17、单选框18、列表框
19、垂直滚动条20、进展条21、热键22、树形视图23、动画24、日期选择
25、IP地址26、组合框的扩展(从左边往下数,再从右边往下数)
1、控件的创建和使用方法(197页)
控件的创建方法有2种:
1)是在对话框摸板中用编辑器指定控件,也就是说,将控件的父窗口指定为对话框,如:
上面的BUTTON1按钮控件。
2)是将控件看做任意一窗口的子窗口,并通过调用相应的Create函数来创建。
下面我们用第2种方法创建控件(此种方法涉及的内容复杂,也不能发挥对话框编辑器可视化编程的优点,故不提倡此种方法,而用第一种方法)。
(1)打开上个项目,在CMyDlg类的头文件MyDlg.h里添加一个按钮类CButton
指针变量:
(public:
里)
CButton*m_btnWnd;
(2)按Ctrl+W或ViewClassWizard打开MFClassWizard对话框,并切换到
MessageMaps页面,在ObjectIDs列表中选定点黑CMyDlg项,并在
Message列表中找到WM_INITDIALOG消息点黑AddFunctionEditCode
(3)添加代码:
BOOLCMyDlg:
:
OnInitDialog()
{-----
m_btnWnd=newCButton();//构造按钮控件
//下面“”按钮上的字,创建子窗口|窗口最初是可见的|创建的是按键按钮
m_btnWnd->Create(“你好”,WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,
CRect(20,20,120,60),this,201);//创建
CFont*font=this->GetFont();//获取对话框的字体
m_btnWnd->SetFont(font);//设置控件字体
returnTRUE;//(程序原有的)
}
代码中,Create用来创建一个按钮控件,该函数的第一个参数用来指定该按钮的标题,第二个参数用来指定控件的风格,第三个参数用来指定它在父窗口中的位置和大小,第四个参数用来指定父窗口指针,最后一个参数是指定该控件的标识值。
WS_CHILD表示按钮是作为对话框的一个子窗口来创建的。
WS_VISIBLE是使控件可见。
BS_PUSHBUTTON表示创建的是按键按钮。
(4)编译并运行
2、控件的数据交换和数据效验(数据成员)(198页)
使用ClassWizard可以很容易地定义一个控件的成员变量及其数据范围。
例如:
上面的CMyDlg类的按钮控件IDC_BUTTON1添加并使用其成员变量m_MyBtn,步骤如下:
(1)打开上例项目,ViewClassWizardMemberVariables选定Classname
中为CMyDlg,然后在ControlIDs列表中点黑IDC_BUTTON1AddVariable
(或双击鼠标左键),弹出AddMemberVariable对话框,如书198页图5.17
写好数据成员名:
m_MyBtn下面Category和Variablestype里的不动
OK见表上已建成(如:
书199页图5.18)
下面是建成员变量的三个对话框图:
(2)再向对话框加一个编辑控件,并加成员变量m_strEdit,类型为CString置
数值为Value(注:
Category框内可选择Value或Control两种类型。
Control所对应的变量类型就是MFC为该控件封装的控件类。
Value所对应的是数值类型。
不同控件所提供的关联的数值类型各不同,例如:
对于编辑框来说,Variablestype中的数值类型有CString(字符串),int,UINT(32位无符号整数),long(32位带符号整数),DWORD(32位无符号整数,段地址和相关的偏移),float,double,BYTE(8位无符号整数),short,BOOL等)。
OK后在下面写20为最大值。
(下面见书199—200页)
打开本项目的MyDlg.h见到:
CButtonm_MyBtn;
CStringm_strEdit;
在MyDlg.cpp里见到:
m_strEdit=_T(““);
在DoDataExchange函数体内见:
DDX_Control(pDX,IDC_BUTTON1,m_MyBtn);
DDX_Text(pDX,IDC_EDIT1,m_strEdit);//IDC_EDIT1是标识m_strEdit
//是成员变量
DDV_MaxChars(pDX,m_strEdit,20);//校验m_strEdit的最大字符个数不超过20。
(3)将CMyDlg:
:
OnButton1()修改成:
voidCMyDlg:
:
OnButton1()
{
UpdateData();//默认参数值是真TRUE
m_MyBtn.SetWindowText(m_strEdit);
//GetDlgItem(IDC_BUTTON1)->SetWindowText(“欢迎”);//用此条代替
//上条也行,
//单击Button1按钮,此按钮名就是“欢迎”。
}
之后运行该程序,当在编辑框输入Hello后,单击Button1按钮,则该按
钮的名称就变成了编辑框中的内容Hello了,见书200页。
八、控件的通用属性(201页)
在控件的属性对话框中含有许多属性,如:
书201页(按钮的属性对话
框),General(一般属性)、Styles(控件的风格)、ExtendedStyles(控件的扩
展风格)。
Styles和ExtendedStyles是用来设定控件的外观的、辅助功能的。
不同控件具有不同的风格和扩展风格。
见201页表5.5.
控件的General属性:
ID:
控件的标识符,每种控件都有默认的ID,例如按钮控件为IDC_BUTTON1
Caption:
控件的标题,大多数控件都有默认的标题,例如按钮控件为Button1
Visible:
指定控件初始化时是否可见
Group:
指定控件组中的第一个控件,如果该项被选中,则此控件后的所有控件均被看成一组,成组的目的是可以让用户键盘方向键在同一组控件中进行切换
HelpID:
若该项被选中,则为该控件建立一个上下文相关的帮助标识符
Disabled:
指定控件初始化时是否禁用
TabStop:
若该项被选中,则用户可以使用Tab键来选择控件
九、控件的消息
对于每个消息,系统都会用一个MSG结构来记录(见201页)。
对一般控件来说,其通知消息是一条WM_COMMAND消息(见202页)。
例:
1、打开上面的项目“对话框”
2、ViewClassWizard在CMyDlg里(左边的ObjectIDs里点黑CMyDlg)
在Message里找到OnCommand点黑AddFunctionEditCode写:
BOOLCMyDlg:
:
OnCommand(WPARAMwParam,LPARAMlParam)
{
WORDnCode=HIWORD(wParam);//控件的通知消息
WORDnID=LOWORD(wParam);//控件的ID号
if((nID==201)&&(nCode==BN_CLICKED))//用户单击按钮产生的消息
MessageBox("你按下了\"你好\"按钮!
");
----
}//WORD是16位无符号整数
//EN_CHANGE是编辑框中的文本被改变时发出的消息
BN_CLICKED是当用户单击按钮产生的消息:
单击对话框中的“你好”按钮,弹出"你按下了\"你好\"按钮!
"的消息对话框。
由于Create创建的控件无法用ClassWizard直接映射其消息,因此上述方法祢补了ClassWizard的不足,使用时要特别注意。
见书202页通知消息是所有Windows控件所共有的:
NM_CLICK在控件中单击鼠标左键按钮
NM_DBLCLK在控件中双击鼠标左键按钮
NM_RDBLCLK在控件中双击鼠标右键按钮
NM_RETURN当控件具有输入焦点时按下ENTER键
NM_SETFOCUS控件得到输入焦点
NM_KILLFOCUS控件失去输入焦点
NM_OUTOFMEMORY没有足够的内存使控件
十、常用控件
静态控件CStatic用于向用户显示一些几乎固定不变的文字或图形描述
按钮CButton用于产生某些命令或改变某些选项设置
编辑框CEdit可完成文字的输入、输出双向操作,使用户能查看并编辑文字
列表框CListBox显示一个列表,让用户从中选取一个或多个项
组合框CComboBox它把列表框和编辑框有机地组合在一起,用户不仅能选择
列表中已有的项,还能编辑出新的项
滚动条CScrollBar通过滚动块在滚动条上的移动来改变某些数值
进展条CProgressCtrl用于指示一个操作的进度
旋转按钮CSpinButtonCtrl又称“上下控制”,是一对箭头按钮,用户单击它们
可以增加或减小某个值
滚动条CSliderCtrl是一个包含一个滑动块和可选的刻度线,用户可以用鼠标
或方向键沿某个方向移动滑动块
图象列表CImageList是一系列相同大小的图象的集合
标签控件CTabCtrl类似于一个笔记本的分割器或一个文件柜上的标签,使用它
可以将一个窗口或对话框的相同区域定义为多个页面
1、静态控件
静态控件是用于显示一个字符、框、矩形、图标、位图或增强的图元文件,它可以用做标签、框或用于分隔其它的控件。
一个静态控件一般不接受用户输入,也不产生通知消息。
在对话框编辑器的控件工具栏中,属于静态控件的有:
静态文本(StaticText)、
组框(GroupBox)、图片控件(Picture)三种。
其中,静态图片控件的属性对话框如:
书204页图5.21所示,表5.7列出了其一般属性和风格的各个项的意义。
我们可以选择Type(图片类型)、Image(图象资源)两个组合框中的有关选项内容,并可将应用程序资源中的图标、位图等内容显示在该静态图片控件中。
另外,用户还可设置其风格来改变控件的外观以及图象在控件的位置等。
静态图片控件的General和Style属性对话框:
Type图片类型,用户可以从中选择Frame(框)、Rectangle(矩形区域)、Icon(图标)、Bitmap(位图)、EnhancedMetafile(增强图元文件,它是各种绘图命令的集合)
Image当图片类型为Icon或Bitmap时,通过此框可选择指定的资源ID号
设置Frame和Rectangle的颜色,它可以是black(黑色)、white(白色)、
gray(灰色)、或者是具有3D外观的etched(腐蚀色)
Sunken选中时,在控件的周围有下沉的边框
Notify选中时,当用户单击或双击图片时会向其父窗口发出通知消息
Rightjustify选中时,用户重置图片大小,图片右下角是固定不变的
Border选中时,图片周围有边框
Centerimage选中时,图片显示在控件中央,其余区域由图片左上角的象素
颜色来填充
Realsizeimage选中时,按图片的原始大小来显示,超过控件区域的部分被裁剪
在它的属性中,用户可以选择Type(图片)、Image(图象资源)两个组合框中的有关选项内容,并可将应用程序资源中的图标、位图等内容显示在该静态图片控件中,另外,用户还可以设置其风格来改变控件的外观以及图象在控件的位置等。
例1:
图片控件(将一个.bmp图形显示在图片控件上)(附加举例)
1)建一个单文档(SDI)应用程序
2)创建对话框模板:
InsertResource点黑Dialognew
3)将图片控件Picture拖到对话框上,并拉大些,将OK和CANCEL拖到下面。
4)向项目中插入一个.bmp图片:
InsertResource点黑BitmapImport在
出现的表中要下拉出:
所有文件(*.*)在某处找到一个.bmp图形Import放到此项目中。
5)将这个图片放到图片控件上
右键对准图片控件单击出现属性框Type处下拉置Bitmapimage处下拉置IDB_BITMAP1,就将图片加到了图片控件上。
6)为刚才建的对话框添加类
双击新建对话框的任何位置OK类名写:
CMyDlg
7)创建一个菜单项,用来显示对话框
ResourceViewMenuIDR_MAINFRAME双击空白菜单点POPUP
ID处写:
ID_DLG菜单名写:
显示图片对话框关闭
8)将菜单命令映射到View中去
ViewClassWizard要加到View中ID-DLGCOMMANDEditCode
(在View.h的头部加:
#include“MyDlg.h”在public:
下加:
CMyDlg*dlg;)并
加代码:
CMyView:
:
OnDlg()
{dlg=newCMyDlg(this);
dlg->Create(IDD_DIALOG1);
dlg->ShowWindow(SW_RESTORE);
}
9)编译运行
2:
按钮
常见的按钮有三种类型:
(204页)
(1)按键按钮
按键按钮通常可以立即产生某个动作,执行某个命令,因此也常被称为命
令按钮。
(2)单选按钮
其外形是在文本前有一个圆圈,当它被选中时,就标上一个黑点。
(3)复选框
其外形是在文本前有一个空心方框,当它被选中时,就加上一个“∨”标记
1)按钮的消息
常见的按钮映射消息有两个:
(1)BN_CLICKED(单击按钮)
(2)BN_DOUBLE_CLICKED(双击按钮)
见下图:
2)按钮选中操作
最常用的按钮操作是设置或获取一个按钮或多个按钮的选中状态。
CButton类的以下2个成员函数原型如下:
voidSetCheck(intnCheck);//设置指定按钮的选中状态
intGetCheck()const;//获取指定按钮的选中状态
其中:
nCheck和GetCheck函数返回的值可以是:
0表示不选中,1表示选中,
2表示不确定(仅用于三态按钮)
而对于多个单选按钮的选中状态的设置或获取,需要使用CWnd类的成员函数CheckRadioButton和GetCheckedRadioButton,它们的原型如下:
voidCheckRadioButton(intnIDFirstButton,intnIDLastButton