当前位置:文档之家› MFC 对话框和常用教程

MFC 对话框和常用教程

MFC 对话框和常用教程
MFC 对话框和常用教程

第五章对话框和常用控件

对话框是Windows应用程序中最重要的用户界面元素之一,是与用户交互的重要手段,在程序运行过程中,对话框可用于扑捉用户的输入信息或数据。对话框是一个特殊类型的窗口,任何对窗口进行的操作(如:移动、最大化、最小化等)都可在对话框中实施,一般来说,在对话框中通过各种控件(如:按钮、编辑框、列表框、组合框等)来和用户进行交互。控件是在系统内部定义的用于和用户交互的基本单元。

一、对话框的使用

Visual C++提供的对话框编辑器能“可视”地进行设计、编辑,并可用

ClassWizard为对话框从CDialog基类中派生一个类,MFC的CDialog类封装了用于对话框的显示、关闭等操作的许多功能函数,例如:DoModal函数用来显示模式对话框并返回用户操作的结果。

1、模式对话框(为186附加举例页)

所谓模式对话框是指,当对话被弹出时,用户必须在对话框中进行相应的操作,在退出对话框之前,对话框所在的应用程序不能继续执行。平常我们所见到的对话框大多是模式对话框。

例:模式对话框(通过菜单命令弹出)

1)建一个单文档(SDI)应用程序

2)创建对话框模板

Insert→Resource→选中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的消息映射:View→ClassWizard→保证Class name里是CMainFrame,在ObjectIDs

里找到ID_PUPDIALOG点黑→Messages里(右边)点COMMAND建立主框架对象方法并加代码:

void CMainFrame::OnPupdialog()

{ CMyDlg MyDlg;

MyDlg.DoModal(); //DoModal()是CDialog类成员函数,通过调用该

//函数将显示对话框。

}

7)在CMainFrame.cpp文件里加:

#include “MyDlg.h”// 之后运行。

2、无模式对话框(为186附加页)

非模式对话框,弹出后,可一直保留在屏幕上,用户可继续在应用中进行其它操作或启动其它应用程序,当需要使用对话框时,只需象激活一般窗口一样激活对话框即可。

1)建一个SDI(单文档)应用程序

2)创建对话框模板

Insert→Resource→点黑Dialog→New

拖过一个静态文本,鼠标对准它,按右键点properties改标题为“新建非模式对话框”。3)为对话框创建类

点出对话框(IDD_DIALOG1缺省的ID号),双击对话框中的任意位置,出现一个表,你点OK→出现一个对话框,你写类名:CDlg保证基类为CDialog

4)创建菜单

打开工作区→Menu→IDR_MAINFRAME→双击空白菜单写“非模式对话框”关闭→再点下面空菜单写名字“显示非模式对话框”ID处写ID_DLG.

5)添加菜单命令消息

Wiew→ClassWizard→Message Maps→保证Class name里是Wiew类(视图类),在Object IDS里找到ID_DLG(菜单的ID)点黑右边COMMAND双击它→OK

6)a、你在Wiew.h里加:#include “Dlg.h”

b、在public:里加:CDlg *dlg;//创建CDlg对象

c、在View.cpp的OnDlg()函数里加:

CMyView::OnDlg()

{

dlg=new CDlg(this);

dlg->Create(IDD_DIALOG1);//使对话框摸板从资源中创建一个非

//模式对话框

dlg->ShowWindow(SW_RESTORE);//显示对话框

}

二、使用对话框编辑器(对话框编程)(187页)

*1、可建一个单文档应用程序名为“对话框编程”,在此程序中加入一个对话框:Insert→Resource→点黑Dialog→new 出现188页的图

2、拖入一些控件,对这些控件进行排序、布局、大小调整、上下对齐、测试等。*最后在对话框IDD_DIALOG1上留一个按钮控件,其标识符为:IDC_BUTTON1

3、识别控件工具栏(188页)

4、在加对话框时,Insert→Resource→点开+Dialog见有7类对话框,分别了解其

不同用途(见192页)。

5、对话框的属性

A、View→Properties

B、按Alt+Enter

C、用鼠标右键单击对话框模板→Properties

都能弹出对话框的属性框,见书193页对属性General的解释。

*6、为对话框添加类(194页)

对准对话框的任意非控件区域双击鼠标,将弹出书194页图5.11所示

的对话框,询问是否为对话框资源创建一个新类→单击OK→弹出书194页

图5.12所示的对话框→你定义一个新类的名字如:CMyDlg(注意:类名必

须以C打头),下面的基类Base class和ID标识符Dialog ID内容一般不改。

* 7、添映射消息(195页)

接上,点OK出现“MFC ClassWizard”对话框,如书195页图5.13所示→(保证类名处是CMyDlg)选定点黑IDC_BUTTON1→单击BN_CLICKED消息→Add Function→出现书195页图5.14对话框→OK→Edit Code

*8、添加用户代码(195页)

接上,到MyDlg.cpp文件中,写:

void CMyDlg::OnButton1()

{

MessageBox(“欢迎进入对话框的设计!”);

}//这时运行还不见对话框,接下

*9、在程序中使用对话框(196页)

由于对话框的代码是以类为模块来设计的,使用时需要在程序中加入该类的头文件,并定义一个类对象,然后就可以使用该类的相关成员。

项目工作区→FileView→打开应用程序的.cpp文件,在前面加:

#include “MyDlg.h”

在InitInstance函数体中的return TRUE语句之前添加下列代码:

CMyDlg dlg;

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框:默认值为无,当对话框需要选单时输入或选择指定的选单资源

Class name:默认值为无,它提供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或View→ClassWizard打开MFClassWizard对话框,并切换到Message Maps页面,在Object IDs列表中选定点黑CMyDlg项,并在

Message列表中找到WM_INITDIALOG消息点黑→AddFunction→EditCode

(3)添加代码:

BOOL CMyDlg::OnInitDialog()

{ -----

m_btnWnd=new CButton();//构造按钮控件

//下面“”按钮上的字,创建子窗口|窗口最初是可见的|创建的是按键按钮

m_btnWnd->Create(“你好”,WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,

CRect(20,20,120,60),this,201);//创建

CFont *font=this->GetFont();//获取对话框的字体

m_btnWnd->SetFont(font);//设置控件字体

return TRUE;//(程序原有的)

}

代码中,Create用来创建一个按钮控件,该函数的第一个参数用来指定该按钮的标题,第二个参数用来指定控件的风格,第三个参数用来指定它在父窗口中的位置和大小,第四个参数用来指定父窗口指针,最后一个参数是指定该控件的标识值。

WS_CHILD表示按钮是作为对话框的一个子窗口来创建的。

WS_VISIBLE是使控件可见。

BS_PUSHBUTTON表示创建的是按键按钮。

(4)编译并运行

2、控件的数据交换和数据效验(数据成员)(198页)

使用ClassWizard可以很容易地定义一个控件的成员变量及其数据范围。例如:上面的CMyDlg类的按钮控件IDC_BUTTON1添加并使用其成员变量m_MyBtn,步骤如下:

(1)打开上例项目,View→ClassWizard→Member V ariables→选定Class name 中为CMyDlg,然后在Control IDs列表中→点黑IDC_BUTTON1→AddV ariable

(或双击鼠标左键),弹出Add Member V ariable对话框,如书198页图5.17

→写好数据成员名:m_MyBtn下面Category和V ariables type里的不动

→OK→见表上已建成(如:书199页图5.18)

下面是建成员变量的三个对话框图:

(2)再向对话框加一个编辑控件,并加成员变量m_strEdit,类型为CString置数值为V alue(注:Category框内可选择V alue或Control两种类型。Control所对应的变量类型就是MFC为该控件封装的控件类。V alue所对应的是数值类型。不同控件所提供的关联的数值类型各不同,例如:对于编辑框来说,V ariables type中的数值类型有CString (字符串),int,UINT(32位无符号整数),long(32位带符号整数), DWORD(32位无符号整数,段地址和相关的偏移),float,double,BYTE(8位无符号整数),short,BOOL等)。OK后在下面写20为最大值。(下面见书199—200页)

打开本项目的MyDlg.h见到:

CButton m_MyBtn;

CString m_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()修改成:

void CMyDlg::OnButton1()

{

UpdateData();//默认参数值是真TRUE

m_MyBtn.SetWindowText(m_strEdit);

//GetDlgItem(IDC_BUTTON1)->SetWindowText(“欢迎”);//用此条代替

//上条也行,

//单击Button1按钮,此按钮名就是“欢迎”。

}

之后运行该程序,当在编辑框输入Hello后,单击Button1按钮,则该按钮的名称就变成了编辑框中的内容Hello了,见书200页。

八、控件的通用属性(201页)

在控件的属性对话框中含有许多属性,如:书201页(按钮的属性对话框),General(一般属性)、Styles(控件的风格)、Extended Styles(控件的扩

展风格)。Styles和Extended Styles是用来设定控件的外观的、辅助功能的。

不同控件具有不同的风格和扩展风格。见201页表5.5.

控件的General属性:

ID:控件的标识符,每种控件都有默认的ID,例如按钮控件为IDC_BUTTON1 Caption:控件的标题,大多数控件都有默认的标题,例如按钮控件为Button1

Visible:指定控件初始化时是否可见

Group:指定控件组中的第一个控件,如果该项被选中,则此控件后的所有控件均被看成一组,成组的目的是可以让用户键盘方向键在同一组控件中进行切换

Help ID:若该项被选中,则为该控件建立一个上下文相关的帮助标识符

Disabled:指定控件初始化时是否禁用

TabStop:若该项被选中,则用户可以使用Tab键来选择控件

九、控件的消息

对于每个消息,系统都会用一个MSG结构来记录(见201页)。对一般控件来说,其通知消息是一条WM_COMMAND消息(见202页)。例:

1、打开上面的项目“对话框”

2、View→ClassWizard→在CMyDlg里(左边的Object IDs里点黑CMyDlg)

→在Message里找到OnCommand点黑→Add Function→Edit Code→写:

BOOL CMyDlg::OnCommand(WPARAM wParam,LPARAM lParam)

{

WORD nCode=HIWORD(wParam);//控件的通知消息

WORD nID=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、静态控件

静态控件是用于显示一个字符、框、矩形、图标、位图或增强的图元文件,它可以用做标签、框或用于分隔其它的控件。一个静态控件一般不接受用户输入,也不产生通知消息。

在对话框编辑器的控件工具栏中,属于静态控件的有:静态文本(Static Text)、

组框(Group Box)、图片控件(Picture)三种。其中,静态图片控件的属性对话框如:书204页图5.21所示,表5.7列出了其一般属性和风格的各个项的意义。我们可以选择Type(图片类型)、Image(图象资源)两个组合框中的有关选项内容,并可将应用程序资源中的图标、位图等内容显示在该静态图片控件中。另外,用户还可设置其风格来改变控件的外观以及图象在控件的位置等。

静态图片控件的General和Style属性对话框:

Type 图片类型,用户可以从中选择Frame(框)、Rectangle(矩形区域)、Icon(图标)、Bitmap(位图)、Enhanced Metafile(增强图元文件,它是各种绘图命令的集合) Image 当图片类型为Icon或Bitmap时,通过此框可选择指定的资源ID号

设置Frame和Rectangle的颜色,它可以是black(黑色)、white(白色)、

gray(灰色)、或者是具有3D外观的etched(腐蚀色)

Sunken 选中时,在控件的周围有下沉的边框

Notify 选中时,当用户单击或双击图片时会向其父窗口发出通知消息

Right justify 选中时,用户重置图片大小,图片右下角是固定不变的

Border 选中时,图片周围有边框

Center image 选中时,图片显示在控件中央,其余区域由图片左上角的象素

颜色来填充

Real size image选中时,按图片的原始大小来显示,超过控件区域的部分被裁剪在它的属性中,用户可以选择Type(图片)、Image(图象资源)两个组合框中的有关选项内容,并可将应用程序资源中的图标、位图等内容显示在该静态图片控件中,另外,用户还可以设置其风格来改变控件的外观以及图象在控件的位置等。

例1:图片控件(将一个.bmp图形显示在图片控件上)(附加举例)

1)建一个单文档(SDI)应用程序

2)创建对话框模板:Insert→Resource→点黑Dialog→new

3)将图片控件Picture拖到对话框上,并拉大些,将OK和CANCEL拖到下面。

4)向项目中插入一个.bmp图片:Insert→Resource→点黑Bitmap→Import→在出现的表中要下拉出:所有文件(*.*)在某处找到一个.bmp图形→Import放到此项目中。

5)将这个图片放到图片控件上

右键对准图片控件单击→出现属性框→Type处下拉置Bitmap→image处下拉置IDB_BITMAP1,就将图片加到了图片控件上。

6)为刚才建的对话框添加类

双击新建对话框的任何位置→OK→类名写:CMyDlg

7)创建一个菜单项,用来显示对话框

ResourceView→Menu→IDR_MAINFRAME→双击空白菜单→点POPUP

ID处写:ID_DLG 菜单名写:显示图片对话框→关闭

8)将菜单命令映射到View中去

View→ClassWizard→要加到View中→ID-DLG→COMMAND→EditCode

(在View.h的头部加:#include “MyDlg.h”在public:下加:CMyDlg *dlg;)并

加代码:

CMyView::OnDlg()

{ dlg=new CMyDlg(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个成员函数原型如下:

void SetCheck(int nCheck); //设置指定按钮的选中状态

int GetCheck()const; //获取指定按钮的选中状态

其中:nCheck和GetCheck函数返回的值可以是:0表示不选中,1表示选中,

2表示不确定(仅用于三态按钮)

而对于多个单选按钮的选中状态的设置或获取,需要使用CWnd类的成员函数CheckRadioButton和GetCheckedRadioButton,它们的原型如下:

void CheckRadioButton(int nIDFirstButton,int nIDLastButton,int nIDCheckButton);

int GetCheckedRadioButton(int nIDFirstButton,int nIDLastButton);

其中,nIDFirstButton和nIDLastButton分别指定这组单选按钮的第一个和最后一个按钮ID值,nIDCheckButton用于指定要设置选中状态的按钮ID值,函数GetCheckedRadioButton返回被选中的按钮ID值。

例2:用静态图片、单选按钮、复选框和按键按钮控件设计界面,运行结果如:书205页图5.23所示。刚开始,所有单选按钮都是灰显的,我们不能选择它们,这种情况称为“禁用”,而当选中“允许”复选框后,所有单选按钮可以使用,用户选定一个单选框后,单击[应用]按钮,则弹出相应的消息对话框。

(1)用MFC AppWizard(exe)创建一个名为:“按钮的使用”的基于对话框的应用程序。(第一步将类型选择为Dialog Based,然后按[Finish]按钮即可。)

(2)打开属性对话框,将其标题改为“使用Windows常用控件”。

(3)参看书205页图5.23的控件布局,用编辑器为对话框添加如书206页表5.8 所示的一些控件。

(4)说明:上面4个单选按钮的Tab次序应连续,而且从IDC_RADIO1到IDC_RADIO4依次增加。

(5)View→ClassWizard(或按Ctrl+W快捷键)→切换到Member V ariables页面,在Class name中选择CMyDlg,在Control IDs里选中点黑IDC_CHECK1复选框ID号→Add V ariables按钮,为其添加一个BOOL类型的成员变量

m_bEnabled→OK。

(6)切换到ClassWizard的Message Maps页面,分别选中点黑复选框IDC_CHECK1和按钮IDC_BUTTON1,分别为其添加映射消息,并添如下代码:

void CMyDlg::OnCheck1()

{

UpdateData();

for(int i=0;i<4;i++)

GetDlgItem(IDC_RADIO1+i)->EnableWindow(m_bEnabled);

}//EnableWindow是使一个控件窗口禁用或允许使用,它取决于该函数

//的参数,为TRUE时表示可以使用,否则禁用。

void CMyDlg::OnButton1()

{

UpdateData();

if(!m_bEnabled) return;

int nID=GetCheckedRadioButton(IDC_RADIO1,IDC_RADIO4);

if(nID==IDC_RADIO1)

{ MessageBox(“1”); }

if(nID==IDC_RADIO2)

{ MessageBox(“2”); }

if(nID==IDC_RADIO3)

{ MessageBox(“3”); }

if(nID==IDC_RADIO4)

{ MessageBox(“4”); }

(7)在此文件中找到CMyDlg::OnInitDialog函数体,添加下列代码:

BOOL CMyDlg::OnInitDialog()

{

CheckRadioButton(IDC_RADIO1,IDC_RADIO4,IDC_RADIO1);

//设置第一个单选按钮为选中

OnCheck1();

return TRUE;//此条是原有的

(8)编译运行

3、编辑框

编辑框是一个让用户从键盘输入和编辑文本的矩形窗口,用户可以通过它,很方便地输入各种文本、数字或口令,也可使用它来编辑和修改简单的文本内容。

当编辑框被激活且具有输入焦点时,就会出现一个闪动的插入符(又可称为文本光标),表明当前插入点的位置。

1)编辑框的属性和风格

Align text 各行文本对齐方式:Left,Center,Right,默认时为Left

Multiline 选中时为多行编辑框,否则为单行编辑框

Number 选中时控件只能输入数字

Horizontal scroll 水平滚动,仅对多行编辑框有效

Auto HScroll当用户在行尾键入一个字符时,文本自动向右滚动

V ertical scroll 垂直滚动,仅对多行编辑框有效

Auto VScroll 当用户在最后一行按ENTER键时,文本自动向上滚动一页,仅对

多行编辑框有效

Password 选中时,键入编辑框的字符都将显示为”*”,用于口令设置,仅对

单行编辑框有效

No hide selection通常情况下,当编辑框失去键盘焦点时,被选择的文本仍然反

色显示,选中时,则不必具备此功能

OEM convert 选中时,实现对特定字符集的字符转换

Want return 选中时,用户按下ENTER键,编辑框中就会插入一个回车符

Border 选中时,在控件的周围存在边框

Uppercase 选中时,键入在编辑框的字符全部转换成大写形式

Lowercase 选中时,键入在编辑框的字符全部转换成小写形式

Read-Only 选中时,防止用户键入或编辑文本

多行编辑框具有简单文本编辑器的常用功能,例如:它可以有滚动条,用户按Enter 键另起一行以及文本的选定、复制、粘贴等常见操作。而单行编辑框功能较简单,它仅用于单行文本的显示和操作

2)编辑框的基本操作

A、设置口令

口令设置在编辑框中不同于一般的文本编辑框,用户输入的每个字符都被一个特殊的字符代替显示。这个特殊的字符称为口令字符。默认的口令字符是”*”。

应用程序可以用成员函数CEdit::SetPasswordChar 来定义自己的口令字符,其函数原形如下:

void SetPasswordChar(TCHAR ch);

其中,参数ch表示设定的口令字符;当ch=0时,编辑框内将显示实际字符。

B、选择文本

编程选择文本,调用成员函数CEdit::SetSel来实现,还有:

CEdit::GetSel和CEdit::ReplaceSel,它们分别用来获取编辑框中选择的开始和结束的位置以及替换被选择的文本。

C、设置编辑框的页面边距

用CEdit::SetMargins函数来实现,其函数原型如下:

void SetMargins(UINT nLeft,UINT nRight);

其中,参数nLeft和nRight分别用来指定左、右边距的象素大小。

D、剪帖板操作

E、获取多行编辑框文本(见书208页---209页)。

如何设置口令(密码):附加例题见后面(教案页)

3)编辑框的通知消息

当编辑框的文本修改或者被滚动时,会向其父窗口发送一些消息,这些消息

是:(参看书209页表5.10并由下图所示:)

EN_CHANGE当编辑框中的文本已被修改,在新的文本显示之后发送此消息

EN_HSCROLL当编辑框的水平滚动条被使用,在更新显示之前发送此消息

EN_KILLFOCUS编辑框失去键盘输入焦点时发送此消息

EN_MAXTEXT文本数目到达了限定值时发送此消息

EN_SETFOCUS编辑框得到键盘输入焦点时发送此消息

EN_UPDATE编辑框中的文本已被修改,新的文本显示之前发送此消息

EN_VSCROLL当编辑框的垂直滚动条被使用,在更新显示之前发送此消息

例:使用静态文本、组框、编辑框以及按钮等控件设计界面,运行结果参书209 页图5.25即下图所示。当用户在“成绩1”、“成绩2”、和“成绩3”编辑框中输入成绩后,单击[计算平均分]按钮,将显示出这三个成绩的平均分。

程序设计步骤如下:

(1)打开前面的项目“按钮的使用”。

(2)向应用程序中添加一个对话框资源,insert→Resource→点黑Dialog→new →出现一个新的对话框→右键单击这个新对话框→properties→打开其属

性对话框→Font→将其字体设置为“新宋体,9”,标题改为“使用编辑框”,

ID号改为IDD_EDIT,删除默认的Cancel按钮。

(3)、(4)、(5)按书210页往下作

书(6)m_strAve="0.00";

UpdateData(FALSE);//将成员变量数据传给控件,并在控件中显示

书(7)UpdateData();//将控件显示的数据传给成员变量

double ave=(double)(m_nScore1+m_nScore2+m_nScore3)/3.0;

m_strAve.Format("%6.2f",ave);//Format是CString类的一个经常使用的成

//员函数,它通过格式操作使任意类型的数据转换成一个字符串

UpdateData(FALSE);//将成员变量数据传给控件,并在控件中显示

书(8)定位到void CMyDlg::OnButton1()

{ ---------//注意,这是你上个程序的按钮命令,在里找到:

if(nID= =IDC_RADIO1)

{ CEditDlg dlg; //注意,将原来MessageBox("1");去掉

dlg.DoModal(); //加上这2条

}

书(9)在上个程序的:按钮的使用Dlg.cpp即CMyDlg.cpp的头文件处加:

#include "EditDlg.h"(就是(8)所在的文件)

编译运行

4、列表框

列表框是一个列有许多项目让用户选择的控件。它与单选按钮组或复选框组一样,都可让用户在其中选择一个或多个项。但不同的是,列表框中项的数目是可灵活变化的,程序运行时可往列表框中添加或删除某些项。并且,当列表框中项的数目较多而不能一次全部显示时,还可以自动提供滚动条来让用户浏览其余的列表项。

1)列表框的风格

按性质来分,列表框有单选、多选、扩展多选以及非选四种类型,默认风格

下的单选列表框让用户一次只能选择一个项,多列表框可让用户一次选择几个项,而扩展多项列表框允许用户用鼠标拖动或其它特殊组合键进行选择,非选列表框不提供选择功能。还有其它一系列风格,用于定义列表框的外观及操作方式,这些风格可在下图所示的列表框属性对话框中设置:列表框的Styl属性:

Selection指定列表框的类型:单选(Single)、多选(Multiple)、扩展多选(Extended)、不选(None) Owner draw自画列表框,默认为No

Has strings选中时,在自画列表框的项目中含有字符串文本

Border选中时,使列表框含有边框

Sort选中时,列表框的项目按字母顺序排列

Notify选中时,当用户对列表框操作就会向父窗口发送通知消息

Multi-column选中时,指定一个具有水平滚动的多列列表框

Horizontal scroll选中时,在列表框中创建一个水平滚动条

V ertical scroll选中时,在列表框中创建一个垂直滚动条

No redraw选中时,列表框发生变化后不会自动重画

Use tabstops选中时,允许使用停止位来调整列表项的水平位置

Want key input选中此项,当用户按键且列表框有输入焦点时,就会向列表框的父窗口发送相应消息

Disable no scroll选中时,即使列表框的列表项能全部显示,垂直滚动条也会显示,但此时是禁用的(灰显)

No integral height选中时,在创建列表框的过程中,系统会把用户指定的尺寸完全作为列表框的尺寸,而不论是否有项目在列表框,也不能完全显示出来

2)列表框的基本操作

当列表框创建之后,往往要添加、删除、改变或获取列表框中的列表项,这些操作都可以调用MFC的CListBox类成员函数加以实现。

索引:表明项目在列表框中排列的位置,它是以0为基数的,即列表框中第一项的索引是0,第二项的索引是1,依次类推。

(1)添加列表项

列表框创建时是一个空的列表,需要用户添加或插入一些列表项,其函数原型为:

int AddString(LPCTSTR lpszItem);

int InsertString(int nIndex,LPCTSTR lpszItem);

其中:列表项的字符串文本由参数pszItem来指定,成功返回列表在列表框的索引,错误返回LB_ERR,空间不够返回LB_ERRSPACE。

但:InsertString函数不会将列表项进行排序,不论列表框控件是否具有sort属性,只是将列表项插在指定索引的列表项之前,若nIndex等于-1,则列表项添加在列表框末尾。

而:AddString函数在当列表框控件具有sort属性时会自动将添加的列表项进行排序。

以上2个函数只能将字符串增加到列表框中,但有时用户还会需要根据列表项使用其他数据。这时,ListBox的SetItemData和SetItemDataPtr能有效解决这个问题,它们能使用户数据和某个列表项关联起来:

int SetItemData(int nIndex,DWORD dwItemData);

int SetItemDataPtr(int nIndex,void *pData);

其中,SetItemData是将一个32位数与某列表项(由nIndex指定)关联起来,而SetItemDataPtr可以将用户的数组、结构体等大量的数据与列表项关联

若产生错误,它们都返回LB_ERR

而:GetItemData和GetItemDataPar分别用来获取相关联的用户数据。

以下等待修改

(2)删除列表项(3)查找列表项(4)列表框的单项选择

(5)列表框的多项选择

3)列表框的通知消息

当列表框中发生了某个动作,如用户双击选择了列表框中某仪项时,列表框就会向父窗口发送一条通知消息。常用的通知消息如书214页表5.14所示。

例:将一个SCORE结构(含有三门成绩的数据成员)数据和列表中每一个学生姓名列表关联起来。当用户单击[添加记录]按钮时,学生成绩记录中的“姓

名“被添加在列表框中,且该学生的成绩与该列表项关联。当用户单击[删

除记录]按钮时,列表框中当前选择项被删除,相关联的数据所占的内存空

间被释放。任何时候选中列表框中某个学生,相应的记录数据被显示出来,

如:书214页图5.27所示。

(1)打开前面的基于对话框的项目“按钮的使用”。

(2)向项目中添加一个对话框资源IDD_LISTBOX,标题为“使用列表框”,并用ClassWizard为此对话框建类为:CListBoxDlg。

接着按书214页往下作:(3)、(4)-------

(可在此处将第9步、第11步作出…………. 因为第5步要用到SCORE结构体)

书(5)

UpdateData(TRUE);

if(m_strName.IsEmpty())//判断m_strName是否为空

{ MessageBox("姓名不能为空!");

return;

}

m_strName.TrimLeft();//裁剪m_strName左边的空格

m_strName.TrimRight();//裁剪m_strName右边的空格

if((m_List.FindString(-1,m_strName))!=LB_ERR)

{ MessageBox("列表框中已有相同姓名,不能添加!");

return;

}

int nIndex=m_List.AddString(m_strName);//向列表框添加学生

//姓名将该学生成绩与新增的列表项关联起来

SCORE data;

data.score1=m_nScore1;

data.score2=m_nScore2;

data.score3=m_nScore3;

m_List.SetItemDataPtr(nIndex,new SCORE(data));

书(6)

MFC知识点(自己整理的,只供参考)

知识点:不是很全面,只供参考 第一章 Windows应用程序使用的界面是由各种图形元素组成的图形界面(GUI)。 Windows提供了大量预定义的用C语言编写的函数,这些函数就叫做API(Application Programming Interface)函数。 在Windows应用程序中,存在着许多与DOS应用程序不同的复杂对象,例如窗口、按钮、滚动条等等。Windows把为这种复杂对象所定义的标识叫做句柄。 常用的句柄类型:HWND 窗口句柄,HDC 图形设备环境句柄,HINSTANCE 当前程序应用实例句柄,HBITMAP 位图句柄,HICON 图标句柄,HCURSOR 光标句柄,HBRUSH 画刷句柄,HPEN 画笔句柄,HFONT 字体句柄,HMENU 菜单句柄,HFILE 文件句柄 事件的描述是一个消息 消息的结构: typedef struct tagMSG { HWND hwnd; //产生消息的窗口句柄 UINT message;//消息的标识码 WPARAM wParam;//消息的附加信息1 LPARAM lParam;//消息的附加信息2 DWORD time; //消息进入消息队列的时刻 POINT pt; //表示发送该消息时鼠标的位置 }MSG; 消息循环: while(GetMessage(&msg,NULL,NULL,NULL))//系统处理了消息后返回 { TranslateMessage(&msg);//把键盘消息翻译成字符消息 DispatchMessage(&msg);//把消息派发给Windows系统 创建窗口的三个步骤: 注册窗口类: RegisterClass(&wc); 创建窗口: hwnd=CreateWindow( lpszClassName, "Windows", WS_OVERLAPPEDWINDOW, 120,50,800,600, NULL, NULL, hInstance, NULL); 显示窗口: ShowWindow(hwnd,nCmdShow); UpdateWindow(hwnd); 大题:用函数封装Windows程序(P16) 第二章

MFC入门--对话框实例

MFC入门--对话框实例 实例1 目的:设计一个基于对话框的程序,界面上有一个“延迟6秒”的按钮,点击后,程序主窗口在6秒内无法拖动。 关键点:MFC程序入门、线程与进程、消息机制 操作过程: 1-新建项目,选择MFC AppWizard (exe),命名项目为“SingleThread”。如图: (注:关于各项目类型的说明,请参见文件“VC功能简介.ppt”的第8页) 2-选择“Dialog based”,点击Finish,仔细观察项目信息。

3-在资源视图内对主对话框添加静态文本:“我的第一个MFC程序”和“演示耗时的单线程”,继而添加一个按钮,按钮现实文字“延迟6秒”,如图: 4-在资源视图内,双击“延时6秒”按钮,为其添加BN_CLICKED消息(按下按钮时发出的消息)的响应函数OnButton1()。在其中添加代码: Sleep(6000); 请根据老师对程序的讲解,思考如下问题: 1.类的继承:三个的类(CAboutDlg、CSingleThreadApp、CStringThreadDlg) 的继承轨迹是怎样的? 2.程序的入口在哪里?有没有类似Win32 Application中对于WM_CREATE的 处理? 3.三个类的对象的关系。 4.消息如何映射?

设计一个基于对话框的程序,开始运行后,每两秒弹出一个消息框。 关键点:MFC程序入门;定时器的建立、使用与删除;消息映射 操作过程: 1-新建项目,选择MFC AppWizard (exe),命名项目为“Test”。 2-选择“Dialog based”。 3-在BOOL CTestDlg::OnInitDialog()函数中添加 SetTimer(1,2000,NULL); // 启动定时器 4-通过ClassWizard给对话框添加WM_DESTROY的响应函数。如图: 在其中添加代码: KillTimer(1); 5-通过ClassWizard给对话框添加WM_TIMER的响应函数。在其中添加代码: if(nIDEvent==1) { ::MessageBox(0,"嘿嘿","你点啊!!",MB_OK); } 请根据老师对程序的讲解,思考如下问题: 1.MFC下与Win32 Application下定时器的使用有什么不同,又有什么相同之 处?

(适合初学者)MFC基础教程

Visual C++/MFC初学教程 目录 +-- 第一章VC入门 |------ 1.1 如何学好VC |------ 1.2 理解Windows消息机制 |------ 1.3 利用Visual C++/MFC开发Windows程序的优势|------ 1.4 利用MFC进行开发的通用方法介绍 |------ 1.5 MFC中常用类,宏,函数介绍 +-- 第二章图形输出 |------ 2.1 和GUI有关的各种对象 |------ 2.2 在窗口中输出文字 |------ 2.3 使用点,刷子,笔进行绘图 |------ 2.4 在窗口中绘制设备相关位图,图标,设备无关位图|------ 2.5 使用各种映射方式 |------ 2.6 多边形和剪贴区域 +-- 第三章文档视结构 |------ 3.1 文档视图框架窗口间的关系和消息传送规律 |------ 3.2 接收用户输入 |------ 3.3 使用菜单

|------ 3.4 文档,视,框架之间相互作用 |------ 3.5 利用序列化进行文件读写 |------ 3.6 MFC中所提供的各种视类介绍 +-- 第四章窗口控件 |------ 4.1 Button |------ 4.2 Static Box |------ 4.3 Edit Box |------ 4.4 Scroll Bar |------ 4.5 List Box/Check List Box |------ 4.6 Combo Box/Combo Box Ex |------ 4.7 Tree Ctrl |------ 4.8 List Ctrl |------ 4.9 Tab Ctrl |------ 4.A Tool Bar |------ 4.B Status Bar |------ 4.C Dialog Bar |------ 4.D 利用AppWizard创建并使用ToolBar StatusBar Dialog Bar |------ 4.E General Window |------ 4.F 关于WM_NOTIFY的使用方法 +-- 第五章对话框 |------ 5.1 使用资源编辑器编辑对话框 |------ 5.2 创建有模式对话框

MFC编程基础教程

第1章基于对话框的Windows应用程序 1.简介Windows编程的两种方法,即Windows API编程和MFC编程。 2.基于对话框的应用程序的创建过程: ?建立基于对话框的MFC 应用程序框架; ?放置控件; ?设置控件属性; ?为控件连接变量,即为控件命名; ?添加并且编写消息处理函数。 3.常用基本控件: ?静态文本框:主要用来显示文本信息,不能接受用户输入 ?命令按钮:是最常见的、应用最广泛的一种控件。在程序执行期间,当单击某个命令按钮后就会执行相应的消息处理函数。 ?编辑框:是一个文本编辑区域,用户可以在该区域输入、编辑和显示正文内容。 ?框架:将一组相关的控件框起来,达到标识一组控件的作用。 ?单选按钮:用户在一组单选按钮中最多只能选择一项。当某一项被选定后,其他选项自动变成未选状态。 ?复选框:列出了可供选择的项,用户可根据需要选择其中的一项或多项,各选项之间的状态互不相关。 ?列表框:通过显示多个选项,供用户选择,达到与用户对话的目的。 ?组合框:组合了编辑框和列表框的特性而形成的一种控件。在列表框中列出可供用户选择的项,当用户选定某项后,该项内容自动装入编辑框中。 ?滚动条:通常附在对话框上用来协助观察数据或确定位置,也可以用来作为数据输入的工具。 1.1 Windows编程基础 Windows 应用程序的主要特点是: ?具有标准的图形用户界面。 ?具有与硬件无关的特性。 ?采用“消息传递,事件驱动”的运行机制。 用Visual C++ 编写Windows 应用程序主要有两种方法:一是使用Windows 提供的应用程序接口(Application Programming Interface ,API )函数;二是使用Microsoft 提供的微软基础类(Microsoft Foundation Class ,MFC )。

创建基于对话框的MFC工程(详细图示)

实例001 如何创建基于对话框的MFC工程 《Visual C++开发实战1200例(第I卷)》本书以开发人员在项目开发中经常遇到的问题和必须掌握的技术为中心,介绍了应用Visual C++进行程序开发各个方面的知识和技巧,主要包括编程基础、界面设计、应用程序控制和图形图像。本节为大家介绍实例001 如何创建基于对话框的MFC工程。 AD: 第1章开发环境 工程创建 开发环境设置与使用 程序调试 1.1 工程创建 实例001 如何创建基于对话框的MFC工程 要使用Visual C++开发软件,首先要创建一个工程,而基于对话框的MFC工程则是用户广泛使用的工程。图1.1将是一个新创建的基于对话框的MFC工程。本实例将介绍如何创建基于对话框的MFC工程。

( New窗口的Projects选项卡中选择MFC AppWizard[exe](MFC应用程序向导)选项,在Project name文本框中输入创建的工程名"Hello",在Location文本

(2)单击OK按钮,弹出MFC AppWizard-Step 1窗口,如图1.3所示。 在MFC AppWizard-Step1窗口中可以指定生成框架的类型。 Single document:生成单文档应用程序框架。 Multiple documents:生成多文档应用程序框架。 Dialog based:生成基于对话框的应用程序框架。 Document/View architecture support:选中该复选框,允许生成文档/视图和非文档/视图结构程序。 (3)本实例选中Dialog based单选按钮,创建一个生成基于对话框的应用程序。单击Next按钮,弹出MFC AppWizard-Step 2 of 4窗口,如图1.4所示。

简易MFC对话框程序设计教程

简易MFC对话框程序设计教程 天津大学仁爱学院信息系杨晓龙 我们之前所学习的C语言是一种面向过程的语言,重点在于程序或算法执行过程,提供那些过程才能实现程序,每一个操作都由我们自己完成。C++是一种面向对象的语言。对象是一个封装体,是一个实例,它里面不仅封装了程序运行时所需变量,更重要的是它还封装了程序运行所需操作即函数,其实真正定义它们的是一种叫“类”的数据结构,不过要引用里面的数据和操作必须通过类所定义的对象。这样做的好处是可以把经常使用的,属于同一类型的数据和操作包含在类当中,在编程时通过该类所实例化的对象调用它们(对象避免了重复,而且对象可以代表一种变量、一个实例或某个控件),简化了代码,提高了代码的复用性,增强了程序的可移植性,降低了错误发生率,摆脱了每次编写程序都要编写大量代码的麻烦。MFC(Microsoft Foundation Class)是微软提供给编程者的基础类库,它里面包含了创建对话框程序所需的各种类,在向导的帮助下,它会自动生成一些代码,我们只需调用它里面的少量成员函数便可完成对话框的创建和对话框程序的编程,如果让我们自己编写将是浩大而艰难的工程。MFC将常用的几乎所有的有关对话框的函数和变量封装起来,使我们避免了编写复杂而且重复的代码。 用C语言所编写的程序是DOS程序,只能在黑乎乎的DOS界面下运行,但C语言是C++的基础,而C++又是MFC的基础,用MFC编写的是windows应用程序有对话框,所以要回MFC 编程得先学C语言和C++才能学MFC。以下将以编写求三角形面积的程序为例说明简单MFC 程序的制作方法。 打开vc6.0,文件—新建—选择MFC AppWizard(exe),工程名称“三角形面积计算器”—确定—选择“基本对话框”,此时即可点“完成”,也可点下一步,直到出现询问“您希望使用MFC库吗?”若选择“作为共享的DLL”,则程序在未安装vc6.0的电脑上无法运行;若选择“作为静态的DLL”,则程序在未安装vc6.0的电脑上也能运行。此后一直点确定即可。 点击“完成”后出现由向导创建的基本对话框,在对话框上点右键—属性,可更改对话框标题和字体。在右侧选择组件,先插入三个编辑框作为三角形三边长,在插入一按钮发出计算命令,然后再插入一编辑框作为面积输出。在每一个编辑框旁配上静态文本说明,修改按钮标题。在vc6.0左侧的资源视图中选中关于对话框,可修改版本信息。至此对话框主体设计完成。 以下是程序最关键的部分。我们拥有C语言的基础,用C语言编写三角形面积代码(算法)不是问题,问题在于如何将编辑框中输入的数据传给算法中的变量以及如何使计算完成的结果输出到编辑框。实现这一数据交换(传输)有七中方法,其中最简单、最直观、最实用的方法是将编辑框与算法中的变量其的关联。步骤如下:选中对应编辑框,右键选择建立类向导,选择“Member Variables(成员变量)”选项卡,选择要关联变量的控件ID号,再点击“Add Variable(添加变量)”,设定变量名如“m_sizeA”,在Variable Type(变量类型)中选择float(不同程序视所需变量类型确定),OK。同样方法,将其他两边和面积分别关联变量。这样就使编辑框分别与各变量取得了关联,以后可认为编辑框和变量是一样的,对变量的任何操作都会反映到编辑框中,接下来我们就可以像编C程序一样编写代码了。可是代码应该写在什么地方呢,程序在什么时候执行呢?我们的目的是在按下计算按钮后程序执行,所以还需对按钮进行设定,让按钮被按下后执行程序。这个过程被称作消息捕获,操作系统捕获到“点击”的消息后将信息传给应用程序,应用程序便转入执行算法。在按钮上点击右键,选择“建立类向导”,选择“Message Maps(消息地图)”选项卡,选中按钮ID号,在“Messages(消息)”中选中“BN_CLICKED(按钮单击)”消息响应方式(因为按钮可以有单击、双击、移动等多种操作,所以对应有多种消息响应方式,即选择:当对按钮执行怎样的操作后执行消息响应函数),然后点击“Add Function(添加消息响应函数)”添加响应消息的函数或操作,也就是指当按钮被按下后要做什么,在弹出的对话框中可以更改函数名,确定后点击“Edit Code(编辑代码)”便自动转入消息响应函数中,我们就可以在这里写我们的算法代码了。代码如下:

MFC对话框几个对话框程序例子建立对话框与相应程序相关联

MFC对话框和对话框类几个对话框程序例子建立对话框与相应的程序相关联如何建立对话框与相应的程序相关联: 在MFC中,对资源的操作都是建立相关的类来完成的; 所以我门先NEW 一个对话框资源然后建立他的类与相应的应用程序相关联就可以; 步骤: 1 NEW 一个对话框资源 2 在资源上选择 Classwarrzd上创建一个新的类(或在资源上双击左键) 3 起名字!(注意文件名将会去掉C 例如我门的名字叫 CDaiDlg那么文件名是 DaiDlg); 对话框的俩种类型: 1 模态对话框(特性:当建立模态对话框时,将不允许用户点击对话框以外的控件后应用程序本身,也就是说当模态对话框建立时应用程序停止运行而只运行对话框,所以模态对话框是可以使用局部变量的定义方法的!) 模态对话框是比较方便的一种对话框~建立函数: int CDialog::DoMadol() //注意他是CDialog类成员也就是说想使用先建立一个 CDialog 对象吧 如果我门想要在View类中建立一个 CDialog对象不要忘了要在View的Cpp 文件中包含 CDialog.h 2 非模态对话框(特性与模态的相反) 使用成员函数 BOOL CDialog::Create( UINT nIDTemplate, CWnd* pParentWnd = NULL ); nIDTemplate 为对话框的ID号 pParentWnd 拥有这个对话框的对象指针,如果是NULL 为默认的主应用窗口也就是 Frame应用窗口 注意如果我门在使用Create创建非模态对话框时要调用一个函数来显示这个对话框 CWnd::ShowWindow(SW_SHOW);不仅这样非模态对话框时不能是局部变量!

mfc单文档插入对话框

2012/7/18 1.新建一个mfc单文档工程Test. 2.在资源视图中,dialog处右键insert dialog. 3.在新建的dialog上右击,属性-style-child,对话框上双击,新建类 name CCdialod,选择base class为cformview. 4.在cmainframe类上添加变量CSplitterWnd m_wndSplitter选为 protected. 5.classwizard在cmainframe中重载OnCreateClient函数 BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) { m_wndSplitter.CreateStatic(this,1,2); m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CTestView), CSize(1100, 0), pContext); //CMy039View是视图类 m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CCdialod), CSize(0, 0), pContext); //LDLG是对话框类 SetActiveView((CTestView*)m_wndSplitter.GetPane(0, 0)); //指定类视图 return true; } 6.在TestView.h中添加头文件 #include "TestDoc.h" 7.在mainframe.h中添加 #include "TestView.h" #include "Cdialod.h"

MFC开发常用知识点总结

开辟空间 cmd_zone=newchar[CMD_LENGH];//指令空间 data_zone=newchar[DATA_LENGH];//数据空间 ax=newchar[4]; bx=newchar[4]; cx=newchar[4]; sp=newchar[SP_LENGH];//堆栈空间 pc=newchar[4]; memset(cmd_zone,0,CMD_LENGH);//设置大小 memset(data_zone,0,DATA_LENGH); memset(ax,0,4); memset(bx,0,4); memset(cx,0,4); memset(sp,0,SP_LENGH); memset(pc,0,4); srand((unsignedint)(time(0)));//随机数起始 分配地址(16位:2,2,4,4,4) cmd_code=*((unsignedshort*)cmd_zone); cmd_nouse=*((unsignedshort*)cmd_zone+2); cmd_arg1=*(unsignedint *)(cmd_zone+4); cmd_arg2=*(unsignedint *)(cmd_zone+8); cmd_arg3=*(unsignedint*)(cmd_zone+12); 输出数据(EDITCONTROL) CString bbb; bbb.Format(_T("%d %d %d %d %d"),X,X,X,X,X); UpdateData(true); myedit += bbb + _T("\r\n"); UpdateData(false); 动态创建按钮 static CButton *btn =new CButton();

简单的MFC多对话框演示程序

简单的MFC多对话框演示程序 “MultiDialog” 演示如何在工程中拥有多个对话框,及如何在一个对话框中调用另一个对话框。 重点:1、多个对话框类的建立;2、对话框的模式(Modal)调用方法;3、Spin控件的使用。 新建一个基于对话框的MFC工程, 通过菜单"Insert>>Resource"打开添加资源对话框, 在其中选择Dialog后点击New创建一个新的对话框 按Ctrl+W打开ClassWizard,系统会提示刚才创建了一个新的对话框资源,是否建立对应的类, 选择建立,然后在New Class窗口中Class Name栏输入它的名称:CSubClass1, 确定后系统会自动生成SubClass1.h和SubClass1.cpp并加入工程中,其中有已经创建好的CSubClass1的类的基本代码。 把这个对话框的Caption属性改为“难度选择”,在它上面画三个Radio“简单”、“标准”、“困难”, 并建立相关联的变量m_Option1。(要注意的是在ClassWizard中注意Class Name中应该选CSubClass1而不是之前的主对话框类) 按照相同方法建立第二个新对话框,类名“CSubClass2”,Caption为“关卡选择”。 在上面画一个Edit和一个Spin,注意先画Edit后画Spin,将Spin的Auto buddy和Set buddy integer勾上。 按Ctrl+W打开ClassWizard,为Edit建立关联变量,不过注意是int型而不是CString型,也为Spin建立关联变量m_Spin1,注意这次是Control型变量CSpinButtonCtrl。

MFC分析对话框的运行机制心得体会

VC++ MFC属性表对话框的运行机制 2012-07-01 19:09 属性表对话框的初始化包括框架对话框的初始化和页的初始化。页的初始化工作可在OnInitDialog函数中进行,而框架对话框的初始化应该在OnCreate函数中完成。 根据CPropertySheet::DoModal返回的是IDOK还是IDCANCEL,程序可以判断出关闭对话框时按的是OK还是Cancel按钮,这与普通对话框是一样的。 如果属性表对话框是模态对话框,在其底部会有3个按钮,依次为OK、Cancel和Apply (应用)按钮,如果对话框是非模态的,则没有这些按钮。OK与Cancel按钮的意义与普通按钮没什么两样,Apply按钮则是属性

表对话框所特有的。普通的模态对话框只有在用户按下了OK按钮返回后,对话框的设置才能生效,而设计Apply的意图是让用户能在不关闭对话框的情况下使对话框的设置立即生效。由此可见,Apply按钮的作用是使用户在设置完数据后,不必退出对话框,就可以反复进行设置,这在许多应用场合下是很有用的。 为了对上述3个按钮作出响应,CPropertyPage类提供了OnOK,OnCancel 和OnApply函数,用户可覆盖这3个函数以完成所需的工作。需要指出的是这3个函数并不是直接响应按钮的BN_CLICKED消息的,但在按钮按下后它们是被间接调用。这些函数的说明如下: 1.Virtual void OnOK( ):在按下OK或Apply按钮后,该函数被调用。默认的OnOK

函数几乎什么也不干,像数据交换和关闭对话框这样的工作是在别的地方完成的,这与普通对话框的OnOK函数是不同的: 2.Virtual void OnCancel( ):在按下Cancel 按钮后,该函数将被调用。默认的OnCancel 函数也是几乎什么也不干; 3.Virtual BOOL OnApply( ):在按下OK 或Apply按钮后,该函数将被调用。默认的OnApply 会调用OnOK函数。函数的返回值如果是TRUE,则对话框中的设置将生效,否则无效。 令人不解的是,MFC并未考虑CPropertySheet类的按钮响应问题,不要指望能通过ClassWizard来自动创建按钮的BN_CLICKED消息处理函数,通常的按钮

mfc对话框基础要点

第五章对话框 对话框是一种用户界面,它的主要功能是输出信息和接收用户的输入。对话框与控件是密不可分的,在每个对话框内一般都有一些控件,对话框依靠这些控件与用户进行交互。一个典型的对话框例子是选择了File-Open命令后弹出的文件对话框。 5.1对话框和控件的基本概念 5.1.1对话框的基本概念 对话框(Dialog)实际上是一个窗口。在MFC中,对话框的功能被封装在了CDialog类中,CDialog类是CWnd类的派生类。 对话框分为模态对话框和非模态对话框两种。大部分读者都会有这样的经历,当你通过File-Open命令打开一个文件对话框后,再用鼠标去选择菜单将只会发出嘟嘟声,这是因为文件对话框是一个模态对话框。模态对话框垄断了用户的输入,当一个模态对话框打开时,用户只能与该对话框进行交互,而其它用户界面对象收不到输入信息。我们平时所遇到的大部分对话框都是模态对话框。非模态对话框的典型例子是Windows95提供的写字板程序中的搜索对话框,搜索对话框不垄断用户的输入,打开搜索对话框后,仍可与其它用户界面对象进行交互,用户可以一边搜索,一边修改文章,这样就大大方便了使用。 本节主要介绍模态对话框,在第四节将介绍非模态对话框。 从MFC编程的角度来看,一个对话框由两部分组成: 1.对话框模板资源。对话框模板用于指定对话框的控件及其分布,Windows根据对话框模板来创建并显示对话框。 2.对话框类。对话框类用来实现对话框的功能,由于对话框行使的功能各不相同,因此一般需要从CDialog类派生一个新类,以完成特定的功能。 5.1.2控件的基本概念

图5.1对话框中的控件 控件(Control)是独立的小部件,在对话框与用户的交互过程中,控件担任着主要角色。控件的种类较多,图5.1显示了对话框中的一些基本的控件。MFC的控件类封装了控件的功能,表5.1介绍了一些常用的控件及其对应的控件类。 表5.1 子窗口而创建的,控件也可以出现在视窗口,工具条和状态条中。 对话框的设计包括对话框模板的设计和对话框类的设计两个主要方面。 1.与对话框有关的消息主要包括WM_INITDIALOG消息和控件通知消息。在对话框创建时,会收到WM_INITDIALOG消息,对话框对该消息的处理函数是OnInitDialog 。 2.OnInitDialog的主要用处是初始化对话框。对话框的控件会向对话框发送控件通知消息,以表明控件的状态发生了变化。 5.2对话框模板的设计 利用Developer Studio提供的可视化设计工具,用户可以方便地设计对话框模板。 请读者按前面章节介绍的方法利用AppWizard建立一个名为Register的MFC应用程序,并在进入MFC AppWizard对话框后按下面几步操作: 1.在第1步中选中Single document以建立一个单文档应用程序。 2.在第4步中使Docking toolbar项不选中,这样AppWizard就不会创建工具条。 3.在第6步中先选择CRegisterView,然后在Base class栏中选择CEditView,这样 CRegisterView将是CEditView的继承类,从而使视图具有了编辑功能。 编译并运行Register,读者会发现Register居然是个编辑器,它可以打开、编辑和保存文本文件。当然,Register的目的不仅仅是个编辑器。假设要对某一地区的就业情况进行调查,我们希望Register程序能够登录就业情况数据并将数据存储起来。 要登录数据,用对话框是再合适不过了。一个典型的就业情况登录对话框如图5.1所示,本节的任务就是设计如图5.1的中文对话框模板。

MFC 对话框和常用教程

第五章对话框和常用控件 对话框是Windows应用程序中最重要的用户界面元素之一,是与用户交互的重要手段,在程序运行过程中,对话框可用于扑捉用户的输入信息或数据。对话框是一个特殊类型的窗口,任何对窗口进行的操作(如:移动、最大化、最小化等)都可在对话框中实施,一般来说,在对话框中通过各种控件(如:按钮、编辑框、列表框、组合框等)来和用户进行交互。控件是在系统内部定义的用于和用户交互的基本单元。 一、对话框的使用 Visual C++提供的对话框编辑器能“可视”地进行设计、编辑,并可用 ClassWizard为对话框从CDialog基类中派生一个类,MFC的CDialog类封装了用于对话框的显示、关闭等操作的许多功能函数,例如:DoModal函数用来显示模式对话框并返回用户操作的结果。 1、模式对话框(为186附加举例页) 所谓模式对话框是指,当对话被弹出时,用户必须在对话框中进行相应的操作,在退出对话框之前,对话框所在的应用程序不能继续执行。平常我们所见到的对话框大多是模式对话框。 例:模式对话框(通过菜单命令弹出) 1)建一个单文档(SDI)应用程序 2)创建对话框模板 Insert→Resource→选中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的消息映射:View→ClassWizard→保证Class name里是CMainFrame,在ObjectIDs 里找到ID_PUPDIALOG点黑→Messages里(右边)点COMMAND建立主框架对象方法并加代码: void CMainFrame::OnPupdialog() { CMyDlg MyDlg; MyDlg.DoModal(); //DoModal()是CDialog类成员函数,通过调用该 //函数将显示对话框。 } 7)在CMainFrame.cpp文件里加: #include “MyDlg.h”// 之后运行。 2、无模式对话框(为186附加页) 非模式对话框,弹出后,可一直保留在屏幕上,用户可继续在应用中进行其它操作或启动其它应用程序,当需要使用对话框时,只需象激活一般窗口一样激活对话框即可。

VC++6.0入门【第六章 创建和使用对话框】

第6章创建和使用对话框 对话框是一种用户界面,几乎每一个Windows程序都使用对话框与用户进行交互。对话框可能是一个简单的只含有OK按钮的消息框,也可以是一个复杂的数据输入表单。对话框上有一些方便用户输入的控件,对话框依靠这些控件与用户进行交互,其实质是一个接收消息的窗口。 在本章节我们主要讲述模式对话框和无模式对话框的原理和使用方法,下一章将详细介绍各种控件的使用。你将学习创建一个对话框,使用对话框模板编辑一个对话框资源,并在程序中调用对话框的方法。 6.1 对话框的基本原理 6.1.1 对话框的工作原理 在创建一个对话框之前,我们先来了解一下对话框是如何工作的,对话框的数据来自三方面:对话框资源、对话框对象、和一个文档对象: 1.对话框资源 对话框资源是一个用户输入或取得数据的图形界面。这个图形界面是使用Develop Studio的对话框编辑器在对话框模板上创建的,程序员可以在对话框模板上增加并编辑控件,生成对话框资源。当应用程序运行时,就可以得到一个对话框。 2.对话框对象 MFC使用CDialog类来描述对话框,它是CWnd类的派生类。在CWnd类的基础上增加了数据交换的功能。当创建一个新的对话框资源后,使用ClassWizard可以创建一个对话框类的派生类。对话框对象实现了对话框和应用程序之间的通信。在应用程序中定义一个对话框对象后,在对话框显示前,可以通过访问对话框对象的成员变量为一个对话框的控件初始化,在对话框关闭后,可以通过访问对话框对象的成员变量获得用户的输入数据。 3.文档对象 MFC使用文档对象描述应用程序处理的数据,用户输入的数据要进一步的处理,通常要先存贮到文档对象中。例如:一个学生记录处理的应用程序,用户通过一个对话框输入学生记录并贮存到一个文件中。应用程序的处理顺序是:用户在对话框中输入信息,通过对话框对象得到输入信息,将输入信息整理到文档对象中,使用序列化函数将文档对象存贮到一个文件中,所以文档对象扮演了一个很重要的数据交换的角色。 MFC使用以上三者实现用户与应用程序之间数据交换,数据交换流程见图6-1所示,遵循四个步骤。

MFC编程基础教程

M F C编程基础教程 Prepared on 24 November 2020

第1章基于对话框的Windows应用程序 1.简介Windows编程的两种方法,即WindowsAPI编程和MFC编程。 2.基于对话框的应用程序的创建过程: 建立基于对话框的MFC应用程序框架; 放置控件; 设置控件属性; 为控件连接变量,即为控件命名; 添加并且编写消息处理函数。 3.常用基本控件: 静态文本框:主要用来显示文本信息,不能接受用户输入 命令按钮:是最常见的、应用最广泛的一种控件。在程序执行期间,当单击某个命令按钮后就会执行相应的消息处理函数。 编辑框:是一个文本编辑区域,用户可以在该区域输入、编辑和显示正文内容。 框架:将一组相关的控件框起来,达到标识一组控件的作用。 单选按钮:用户在一组单选按钮中最多只能选择一项。当某一项被选定后,其他选项自动变成未选状态。 复选框:列出了可供选择的项,用户可根据需要选择其中的一项或多项,各选项之间的状态互不相关。 列表框:通过显示多个选项,供用户选择,达到与用户对话的目的。

组合框:组合了编辑框和列表框的特性而形成的一种控件。在列表框中列出可供用户选择的项,当用户选定某项后,该项内容自动装入编辑框中。 滚动条:通常附在对话框上用来协助观察数据或确定位置,也可以用来作为数据输入的工具。 编程基础 Windows应用程序的主要特点是: 具有标准的图形用户界面。 具有与硬件无关的特性。 采用“消息传递,事件驱动”的运行机制。 用VisualC++编写Windows应用程序主要有两种方法:一是使用Windows 提供的应用程序接口(ApplicationProgrammingInterface,API)函数;二是使用Microsoft提供的微软基础类(MicrosoftFoundationClass,MFC)。 1.1.1WindowsAPI编程 从本质上来说,API是Windows系统支持的函数定义、参数定义和消息格式的集合,共有上千个标准的API函数可供应用程序调用。调用WindowsAPI 函数的方法与调用C语言库函数的方法基本相同。 下面通过一个简单的实例来说明WindowsAPI编程是如何调用API函数的。 ………………………………………………………… #include"" intAPIENTRYWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance, LPSTRlpCmdLine,intnCmdShow) { MessageBox(NULL,"这是一个简单的Windows应用程序!","API函数调用示例",MB_OK); return0; } …………………………………………………………

相关主题
文本预览
相关文档 最新文档