文档库 最新最全的文档下载
当前位置:文档库 › MFC编程基础 1 基于对话框的Windows应用程序

MFC编程基础 1 基于对话框的Windows应用程序

MFC编程基础 1 基于对话框的Windows应用程序
MFC编程基础 1 基于对话框的Windows应用程序

第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 )。

1.1.1 Windows API编程

从本质上来说,API 是Windows 系统支持的函数定义、参数定义和消息格式的集合,共有上千个标准的API 函数可供应用程序调用。调用Windows API 函数的方法与调用C 语言库函数的方法基本相同。

下面通过一个简单的实例来说明Windows API 编程是如何调用API 函数的。

…………………………………………………………

# include "windows.h"

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,

LPSTR lpCmdLine, int nCmdShow)

{

MessageBox ( NULL," 这是一个简单的Windows 应用程序!","API 函数调用示例",MB_OK );

return 0;

}

…………………………………………………………

这是一个简单的Windows 应用程序。Windows 应用程序的主函数是WinMain() ,不是main() 函数。函数体中调用了Windows API 函数MessageBox() ,弹出如图所示的对话框。

在直接使用API 函数进行Windows 编程时,程序员不仅需要熟记一大堆常用的API 函数,而且还要对Windows 操作系统有深入的了解,编写大量的代码。用这种方式即使是开发一个很简单的应用程序也需要大量的工作,直接用API 函数进行编程是需要极大的耐心和丰富的编程经验的。

1.1.2 MFC编程

MFC 是Visual C++ 的核心。虽然在Windows 应用程序中可以直接调用API 函数,但是一般不经常直接调用,而是从MFC 类创建对象并调用属于这些对象的成员函数。MFC 是Microsoft 公司提供的用来编写Windows 应用程序的C++ 类库,MFC 大约有200 多个类,可以分成两种:一是Cobject 类的派生类,它们以层次结构的形式组织起来,几乎每个子层次结构都与一个具体的Windows 实体对应;二是非Cobject 派生类,这些都是独立的类,如表示点的Cpoint 类,表示矩形的Crect 类。

在Visual C++ 中,可以创建以下3 类典型的Windows 应用程序,它们都是通过MFC AppWizard(exe) (以下简称AppWizard )向导创建的:

(1)基于对话框的应用程序:这类程序适合于文档较少而交互操作较多的应用场合,如Windows 自带的计算器程序。

(2)单文档界面(SDI )应用程序:这类程序一次只能打开一个文档,如Windows 自带的Notepad 程序。

(3)多文档界面(MDI )应用程序:这类程序可以同时打开多个文档并进行处理,处理的过程中很容易地进行切换,如Microsoft Word 。

1.2 基于对话框的Windows应用程序

对话框是一种特殊类型的窗口,绝大多数Windows程序都通过对话框与用户进行交互。在Visual C++中,对话框既可以单独组成一个简单的应用程序,又可以成为文档/视图结构程序的资源。

1.2.1 简单应用程序实例

创建对话框程序的步骤:

(1)建立基于对话框的MFC 应用程序框架;

(2)放置控件;

(3)设置控件属性;

(4)为控件连接变量,即为控件命名;

(5)添加并且编写消息处理函数。

【例1.1】编写一个如图所示的应用程序。若单击“复制”按钮,则把上面的编辑框中的内容复制到下面的编辑框中;若单击“结束”按钮,则退出程序的运行。

程序的创建过程:

(1)建立基于对话框的MFC 应用程序框架。

①选择“文件| 新建”命令;

②在“工程”选项卡中,选定“MFC AppWizard(exe) ”,输入工程名称,选择“确定”。

③选定“D 基本对话”,即创建基于对话框的应用程序,选择“完成”。

(2)放置控件

?删除原有的控件。

?放置所需的控件:两个编辑框和两个命令按钮。方法是:先单击控件工具栏上的控件图标选择所需的控件,然后在对话框设计界面上按住鼠标左键拖拉出所需要的大小后释放。

(3)设置控件属性

选定控件,在其快捷菜单中选择“属性”命令,在弹出如图所示的对话框中进行设置。

上面编辑框的属性设置为:

?选定“Multiline ”复选框,编辑框中可以输入多行文本。

?选定“Vertical scroll ”和“Auto Vscroll ”,编辑框将有垂直滚动条。

?选定“Want return ”。

下面编辑框属性的设置与上面编辑框基本一样,只是可以不选定“Want return ”。

从图中可以看到编辑框的ID 为IDC_EDIT1 ,这是该控件的标识。任何一个控件都有一个ID ,某些函数需要通过ID 对控件进行操作。

(4)连接变量

为控件连接变量就是为控件起一个名称。每一个控件都是一个对象,调用MFC 类库中的函数都是通过对象来实现的。为IDC_EDIT1 连接变量m_e1 的步骤为:

①在IDC_EDIT1 编辑框的快捷菜单中选“建立类向导”,弹出“MFC ClassWiard ”对话框。

②在“Member Variables ”中,选定“IDC_EDIT1 ”,再选择“Add Variable ”命令。

③在“Add Member Variable ”对话框中输入以下的数据:

Member Variable name (内存变量名):m_e1 ;

Category (类别):Control ;

Variable type (类型):Cedit

用同样的方法再为IDC_EDIT2 连接一个变量m_e2 。

(5)添加并且编写消息处理函数。

本例要求单击“复制”按钮后上面编辑框中的内容复制到下面的编辑框中。也就是说,在程序运行时,在“复制”按钮上发生单击事件后,Windows 向对话框发出了一个BN_CLICKED 消息,CTESTDlg 类应有一个处理该消息的函数。

添加和编写这个消息处理函数的过程是:

①双击“复制”按钮,弹出的“Add Member Function ”对话框,输入函数名(缺省函数名为OnButton1 ),选择“确定”按钮后,添加了一个空函数。另一个方法是在“MFC ClassWiard ”对话框“Message Maps ”选项卡中,选定IDC_BUTTON1 和BN_CLICKED 消息,然后选择“Add Function ”按钮即可。添加的空函数如下:

void CTESTDlg::OnButton1()

{

// TODO: Add your control notification handler code here

}

②为void CTESTDlg::OnButton1() 添加代码

void CTESTDlg::OnButton1()

{

// TODO: Add your control notification handler code here

m_e1.SetSel(0,-1); // 选定编辑框m_e1 中的所有内容

m_e1.Copy(); //把编辑框m_e1 中选定的内容复制到剪贴板

m_e2.SetSel(0,-1); // 选定编辑框m_e2 中的所有内容

m_e2.Paste(); // 将剪贴板中内容粘贴到编辑框m_e2 中,替换所有选定的内容

}

用同样的方法为“结束”按钮添加、编写如下的消息处理函数:

void CTESTDlg::OnButton2()

{

// TODO: Add your control notification handler code here

CDialog::OnOK(); // 退出对话框程序

}

1.2.2 对话框应用程序框架

用AppWizard 创建基于对话框的应用程序框架(假定工程名为TEST )后,项目工作区上增加了一个“ResourceView ”选项卡,中间是对话框设计界面,右边是控件工具栏。

1.ResourceView

在Visual C++ 中,与用户进行交互的对话框界面被认为是一种资源。展开“Dialog ”,可以看到有一个ID 为IDD_TEST_DIALOG 的资源,对应中间的对话框设计界面。不管在何时,只要双击对话框资源的ID ,对话框设计界面就会显示在中间。

2.ClassView

在ClassView 中,如图所示,可以看到生成了3 个类:CAboutDlg 、CTESTApp 和CTESTDlg 。

(1)CAboutDlg :对应生成的版本信息对话框。

(2)CTESTDlg :对话框类,从Cdialog 继承过来的,在程序运行时看到的对话框就是它的一个具体对象。

(3)CTESTApp :应用程序类,从CWinApp 继承过来,封装了初始化、运行、终止该程序的代码。

3.对话框设计界面

对话框设计界面是进行对话框设计的地方,可以将各种控件放置在这里。

4.控件工具栏

控件工具栏上有26 个控件图标,可以通过这些图标在对话框上设计出所需的控件。

1.3 静态文本框、命令按钮和编辑框

静态文本框、命令按钮和编辑框是Windows应用程序中最基本的控件。静态文本框是CStatic类的对象,命令按钮是CButton类的对象,编辑框是CEdit类的对象。这三个类都是从CWnd类直接派生来的,具有CWnd类的全部功能。

1.3.1 静态文本框

静态文本框是最简单的控件。它主要用来显示文本信息,不能接受用户输入,一般不需要连接变量,也不需要处理消息。

静态文本框的重要属性有:

(1)ID :所有静态文本框的缺省ID 都是IDC_STA TIC ,一般不需要重新设置。

(2)标题:需要显示的文本信息是在这里设置的。

(3)边框:边框属性在Styles 选项卡中,决定是否带有边框。

1.3.2 命令按钮

命令按钮是最常见的、应用最广泛的一种控件。在程序执行期间,当单击某个命令按钮后就会执行相应的消息处理函数。

命令按钮的主要属性是标题属性,该属性用来设置在命令按钮上显示的文本。

命令按钮一般不需要连接变量。

命令按钮能处理的消息是BN_CLICKED 。

1.3.3 编辑框

1. 属性设置

编辑框的属性主要在Styles 选项卡中设置。重要属性有:

(1)Multiline :定义该编辑框为多行文本框。

(2)Number :限定输入的字符只能是数字字符。

(3)Border :为控件创建边界。

(4)Read-only :编辑框成为只读的,禁止用户编辑。

2. 成员函数

编辑框常用的成员函数见表。

此外编辑框还可以使用CWnd 类的成员函数。CWnd 类的重要成员函数有:

(1)获取编辑中的内容

形式 1 :void GetWindowText( CString& rString ) const;

说明:将编辑框中的内容复制到CString 类对象rString 中。

示例:将编辑框m_e 中的内容复制到CString 类对象ch 中。

CString ch;

m_e.GetWindowText(ch);

形式 2 :int GetWindowText( LPTSTR lpszStringBuf, int nMaxCount ) const;

说明:将编辑框中的内容复制到lpszStringBuf 中,最多复制nMaxCount 个字符。lpszStringBuf 是字符数组或字符指针。

示例:将编辑框m_e 中的内容复制到字符数组ch 中。

char ch[80];

m_e.GetWindowText(ch,80);

(2)设置编辑框中的内容

形式:void SetWindowText( LPCTSTR lpszString );

说明:将lpszString 中的内容替换编辑框中原有内容,lpszString 是字符数组或字符指针。

示例:设置编辑框中的内容为“abcdefg ”

char ch[20]="abcdefg";

m_e.SetWindowText(ch);

3. 连接变量

编辑框在连接变量时,除了要指定变量名之外,还要确定变量类别。变量类别有两个可选择:一是Control,意味着该变量作控件使用,对应的变量类型只能是Cedit,可以使用该控件类的成员函数;二是Value,意味着该变量当作C/C++中普通的变量使用,对应的变量类型有CString、int、double等,可以使用这些数据类型的函数,但是不能使用控件的成员函数。

若一个编辑框连接了一个Value类别的变量,则该变量就表示这个编辑框,编辑框中显示的内容就是变量的值。但是,改变了编辑框的内容并不会自动更新对应的变量的值,同样,改变了变量的值也不会自动刷新编辑框的内容。若要保持一致,需要使用UpdateData()函数更新,如图所示。若编辑框的内容改变了,则应使用语句UpdateData(TRUE);更新对应的变量的值;若变量的值改变了,则应使用语句UpdateData(FALSE);刷新编辑框的内容。

4. 消息处理函数

在编辑框能处理的消息中是最重要的是EN_CHANGE ,这是编辑框中的文本被修改后发出的消息。

【例1.2】输入一元二次方程ax2 +bx+c=0 的系数a 、b 、c ,计算并输出两个根x1 、x2 ,如图所示。

求方程的根

对话框上有5个静态文本框、5个编辑框和2个命令按钮。编辑框按表连接变量,其余控件不需要连接变量。

为了要计算b2 -4ac 的平方根,需要使用sqrt() 函数,因此在TESTDlg.cpp 文件的开始添加了文件包含命令:

#include "math.h" // "计算"按钮的函数这条要放在最后

…………………………………………………………

void CTESTDlg::OnCalc()

{

// TODO: Add your control notification handler code here

UpdateData(TRUE);

double a=m_a;

double b=m_b;

double c=m_c;

m_x1=(-b+sqrt(b*b-4*a*c))/(2*a);

m_x2=(-b-sqrt(b*b-4*a*c))/(2*a);

UpdateData(FALSE);

}

// “结束”按钮的函数

…………………………………………………………

void CTESTDlg::OnOk()

{

// TODO: Add your control notification handler code here

CDialog::OnOK(); //OnOK();

}

…………………………………………………………

【例1.3】字符串转换程序

转换规则为:大写字母转换成小写;

将小写字母转换成大写;

换行符和回车符不变;

其余字符转换为“*”

要求:每输入一个字符立即转换

第1个编辑框连接变量m_e1 (Control )

属性选定:Multiline

Vertical scroll

Auto VScroll(在多行控件中,当用户在最后一行按下ENTER键时自动向上滚动文本) Want return(使多行编辑器接收回车键,表示换行。如果不指定,按回车键会选择缺省的命令按钮,这往往会导致对话框的关闭)

第2个编辑框连接变量m_e2 (Control )

属性选定:Multiline

Vertical scroll

Auto VScroll

Read-only

对第1个编辑框添加EN_CHANGE 消息处理函数

void CTESTDlg::OnChangeEdit1()

{

// TODO: Add your control notification handler code here

char s[80];

m_e1.GetWindowText(s,80);

for(int i=0;s[i]!='\0';i++)

if (s[i]>='A' && s[i]<='Z')

s[i]=s[i]+'a'-'A';

else

if(s[i]>='a' && s[i]<='z')

s[i]=s[i]+'A'-'a';

else

if (s[i]=='\n' || s[i]=='\r')

s[i]=s[i];

else

s[i]='*';

m_e2.SetWindowText(s);

}

1.4 框架、单选按钮和复选框

框架、单选按钮和复选框都是对话框的常见控件。框架与静态文本框一样是CStatic类的对象,单选按钮和复选框与命令按钮一样都是CButton类的对象。

1.4.1 框架

当对话框上控件较多时,可以使用框架将一组相关的控件框起来,达到标识一组控件的作用。框架不需要连接变量,也不需要处理消息。框架的重要属性有:

(1)ID :所有框架的缺省ID 都是IDC_STATIC ,不需要重新设置。

(2)标题:该属性决定框架上的标题文本。

1.4.2 单选按钮

1. 设计要求

同一组中的按钮必须一个接一个地放进对话框中,中间不能插入其他控件,并且一个组的第一个按扭要选中“Group”属性,表示一组控件的开始。

2. 重要属性

(1)ID :每个命令按钮都有一个缺省ID ,如IDC_RADIO1 ,可以重新设置。

(2)标题:该属性值就是单选按钮右边显示的文本标题。

(3)Group :一组中第一个按钮选中该属性,表示它是一组的开始。

3. 消息

单选按钮能处理的消息是BN_CLICKED。

4. 重要函数

(1)设定单选按钮选中状态

初始时,可使用Windows API 函数CheckRadioButton() 设定一组单选按钮中选中的按钮。

形式:void CheckRadioButton(int nIDFirstButton, int nIDLastButton, int nIDCheckButton);

说明:

①nIDFirstButton 是一组中第一个单选按钮的ID ;

②nIDLastButton 是一组中最后一个单选按钮的ID ;

③nIDCheckButton 为初始时设置为选中的那个单选按钮的ID 。

(2)判定单选按钮是否被选定

形式:UINT IsDlgButtonChecked( int nIDButton ) const;

说明:如果ID 为nIDButton 的按钮被选定,则该函数的返回值为true ,否则为false 。

【例 1.4】设计一个如图所示的程序。当单击“确定”后,用AfxMessageBox 函数显示一个如图所示的消息框。

(1)界面设计

首先创建一个对话框程序框架,然后放置各控件,进行属性设置,将编辑框连接到Cstring 类型的m_e 变量,其余控件不需要连接变量。将“男”和“教授”对应的单选钮的Group属性勾上。

(2)初始化

单选按钮的初始化工作在对话框的初始化函数实现。

BOOL CTESTDlg::OnInitDialog()

{

CheckRadioButton(IDC_RADIO1, IDC_RADIO2, IDC_RADIO1); //

CheckRadioButton(IDC_RADIO3, IDC_RADIO5, IDC_RADIO3);

};

(3)消息处理函数

void CTESTDlg::OnButton1()

{

// TODO: Add your control notification handler code here

UpdateData(TRUE);//注意“oxa1”是表示出现了tab键

CString s;

s+=m_e;

if(IsDlgButtonChecked(IDC_RADIO1))

s+=" 男";

else

s+= " 女";

if(IsDlgButtonChecked(IDC_RADIO3))

s +=" 教授";

else if(IsDlgButtonChecked(IDC_RADIO4))

s+= " 副教授";

else

s+= " 讲师";

AfxMessageBox(s);

}

1.4.3 复选框

1. 重要属性

(1)ID :每个复选框都有一个缺省ID ,如IDC_CHECK1 ,可以重新设置。

(2)标题:该属性值决定了复选框右边显示的文本标题。

2. 连接变量

复选框通常被连接到Value类别BOOL类型的变量。

3. 消息

复选框能处理BN_CLICKED 消息。

【例5】设计一个如图所示的程序。当单击“确定”后,在右边的编辑框中显示有关信息。

复选框应用示例

4. 界面设计

首先创建一个对话框程序框架,然后放置各控件,进行属性设计,各编辑框和复选框按表连接变量,其余控件不需要连接变量。

5. 消息处理函数

void CTESTDlg::OnButton1()

{

// TODO: Add your control notification handler code here

UpdateData(TRUE);

CString s;

s=m_e1;

s+= " 爱好:";

if (m_c1) s+=" 旅游";

if (m_c2) s+= "运动";

if (m_c3) s+= " 音乐";

m_e2=s;

UpdateData(FALSE);

}

1.5 列表框和组合框

列表框是CListBox类的对象,组合框是CComboBox的对象。

1.5.1 列表框

1. 属性设置

列表框的属性在如图所示的属性窗口中设置。

重要的属性有:

(1)Selection

该属性决定用户的选择方式,缺省值为Single 。属性值有:

Single ──单项选择

Multiple ──多项选择,但是忽略Ctrl 和Alt 键。

Extended ──允许使用Ctrl 和Alt 进行多项选择

None ──禁止选择

(2)Sort

当该属性被选定后,列表框中的选项按字母顺序排列。

2. 常用成员函数

(1)添加项目

格式:int AddString( LPCTSTR lpszItem );

例如:语句m_l. AddString(" 陈蓉") ;把“陈蓉”添加到了列表框m_l 中。

(2)删除项目

格式:int DeleteString( UINT nIndex );

说明:nIndex 表示被删除项目在列表框中的位置,对于第一个选项,nIndex 应为0 。

例如:语句m_l. DeleteString (4) ;删除列表框中的第 5 个项目。

(3)获取当前被选定的项目的序号

格式:int GetCurSel( ) const;

例如:语句int I=m_l.GetCurSel(); 将使I 获得m_l 列表框中当前选定的项目的序号。

(4)获取列表框中指定的项目

格式 1 :int GetText( int nIndex, LPTSTR lpszBuffer ) const;

格式 2 :void GetText( int nIndex, CString& rString ) const;

说明:将列表框中第nIndex 个选项的文本送到lpszBuffer 或rString 中。

例如:假定有说明语句char s1[20]; CString s2; ,则语句m_l. GetText(4, s1); 和m_l. GetText(4, rString); 把第5 项内容分别送到s1 和s2 中。

【例1. 6】编写一个能对列表框进行项目添加、修改和删除操作的应用程序,如图所示。“添加”按钮的功能是将文本框中的内容添加到列表框,“删除”按钮的功能是删除列表框中选定的选项。如果要修改列表框,则首先选定选项,然后单击“修改”按钮,所选的选项显示在文本框中,当在文本框中修改完之后再单击“修改确定”按钮更新列表框。

列表框应用示例

(1)界面设计

首先创建一个对话框应用程序框架,然后放置按钮。列表框和命令按钮按表连接变量,其余控件不需要连接变量。

(2)初始化

列表框的选项在对话框的初始化函数中用AddString 函数添加。

BOOL CTESTDlg::OnInitDialog()

{

// TODO: Add extra initialization here

m_l.AddString(" 大学计算机基础");

m_l.AddString("C/C++ 程序设计");

m_l.AddString("VB 程序设计");

m_l.AddString(" 软件技术基础");

}

(3)消息处理函数

…………………………………………………………

void CTESTDlg::OnButton1() // 选择“添加”后执行的函数

{

// TODO: Add your control notification handler code here

UpdateData(TRUE);

m_l.AddString(m_e);

m_e="";

UpdateData(FALSE);

}

…………………………………………………………

void CTESTDlg::OnButton2() // 选择“删除”后执行的函数

{

// TODO: Add your control notification handler code here

int n=m_l.GetCurSel();

m_l.DeleteString(n);

}

…………………………………………………………

void CTESTDlg::OnButton3() // 选择“修改”后执行的函数

{

// 将选定的项目送编辑框供修改

// TODO: Add your control notification handler code here

CString s;

int n=m_l.GetCurSel();

m_l.GetText(n,s);

m_e=s;

UpdateData(FALSE);

}

…………………………………………………………

void CTESTDlg::OnButton4() // 选择“确定修改”后执行的函数

{

// 将修改后的项目送回列表框中,替换原项目,实现修改。

// TODO: Add your control notification handler code here

UpdateData(TRUE);

int n=m_l.GetCurSel();

m_l.DeleteString(n);

m_l.InsertString(n,m_e);

m_e="";

UpdateData(FALSE);

}

…………………………………………………………

1.5.2 组合框

1. 属性设置

(1)类(Type )

该属性用于指定组合框的类型,共有三个选择:Simple 、Dropdown 和Droplist ,默认值为Dropdown 。

(2)键入列表框项(Enter listbox items )

在列表框的属性窗口“Data ”选项卡中有一个键入列表框项,这是在设计阶段输入选项的地方,如图所示。每当输入一项后按Ctrl+Enter 键才能输入下一项。(注意在设计ComboBox时,点下向下箭头,然后将控件下边向下拉,之后才输入数据,这样才能显示出ComboBox的下拉的项。或者,在新建该控件时往下拖放足够大的区域)

组合框属性窗口Data选项卡

2. 常用成员函数

编辑框和列表框的成员函数几乎都可以用于组合框,但是列表框的成员函数GetText() 在组合框中的是GetLBText() 。

形式 1 :int GetLBText( int nIndex, LPTSTR lpszText ) const;

形式 2 :void GetLBText( int nIndex, CString& rString ) const;

说明:使用GetLBText 函数可以将组合框中的第nIndex 个项目的文本送入lpszText 或rString 中。

3. 组合框发出的消息

(1)CBN_SELECTCHANGE :组合框的列表框中的选项改变时发送。

(2)CBN_EDITCHANGE :组合框的编辑框中文本改变时发出。

【例1.7】设计一个如图所示的对话框。如果单击“确定”按钮,则用MessageBox 显示如图所示的信息框。

(1)首先创建一个对话框程序框架,然后放置各控件,进行属性设置,组合框的选项在设计阶段直接输入,按表连接变量,其余控件不需要连接变量。

(2)消息处理函数

void CTESTDlg::OnButton1()

{

// TODO: Add your control notification handler code here

UpdateData(TRUE);

CString s;

s=" 品牌:";

s=s+m_c;

s=s+"\n";

s=s+" 数量:";

s=s+m_e;

MessageBox(s);

}

1.6 滚动条

滚动条是CScrollBar 类的对象,是Windows 应用程序中一个很重要的控件,通常附在对话框上用来协助观察数据或确定位置,也可以用来作为数据输入的工具。滚动条有水平和垂直两种。

【例8】建立一个水平滚动条,最小值为0 ,最大值为100 ,单击滚动条两端箭头时滑块移动的增量值为 2 ,单击滚动条中的空白处(滑块与两端箭头之间的区域)时滑块移动的增量值为10 。另有一个只读的编辑框,显示了滑块当前位置所代表的值。

假定工程名为TEST 。

1 .界面设计

首先创建一个对话框应用程序框架,然后放置水平滚动条、编辑框,按表连接变量,编辑框设置为只读。

2 .初始化

滚动条的初始化就是设置最小值,最大值,以及初始时滑块所代表的值。滚动条初始化在对话框的初始化函数中完成,涉及两个函数:

(1)设置最大值和最小值

形式:void SetScrollRange(int nMinPos , int nMaxPos , BOOL bRedraw = TRUE);

说明:nMinPos 表示最小值,nMinPos 表示最大值。当bRedraw 为TRUE 时

重画滚动条。

(2)设置滑块的位置

格式:int SetScrollPos( int nPos , BOOL bRedraw = TRUE );

说明:nPos 表示滑块的位置。当bRedraw 为TRUE 时重画滚动条。

滚动条初始化代码如下:

BOOL CTESTDlg::OnInitDialog()

{

// TODO: Add extra initialization here

m_s.SetScrollRange(0,100);

m_s.SetScrollPos(50);

m_e=50; // 初始时,编辑框显示50 。

UpdateData(FALSE); // 更新编辑框显示的内容。

};

3 .编写消息处理函数

当用户在滚动条上进行操作时,滚动条接收不到任何消息。但是对话框却能接收到WM_Hscroll (水平滚动条)或WM_Vscroll (垂直滚动条)消息,也就是说,程序对滚动条的操作只能在OnHScroll() 或OnVScroll() 中编写代码。

滚动条处理WM_Hscroll 消息的函数为:

void CTESTDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)

{

// TODO: Add your message handler code here and/or call default

Cdialog::OnHScroll(nSBCode, nPos, pScrollBar);

}

VC 中自己创建对话框方法

VC中自己创建对话框的方法 这里讲在VC中不需要打开MFC工程,通过代码直接创建一个对话框,我看这个对话框比MFC的漂亮多了,而且要写会代码不需要研究MFC就直接开发新的工程. 先打开VC++ 6.0 版本, 第一步:创建一个工程名为:Main Dialog 的Win32 Application。创建过程如下: 打开File菜单中New,选自Win32 Application,工程名为:Main Dialog,点击OK,再选自A simple Win32 application。点击Finish,再点击OK.(见图1) 第二步:创建资源脚本。再打开File菜单中New,选自File选项的Resource Script(就是资源脚本),文件名为Dialog,点击OK。

(见图2) 第三步:插入对话框。刚才建立的脚本Dialog显示为Dialog.rc,就在Dialog.rc上面点击鼠标右键Insert(插入)Resource中选自插入Dialog(对话框),点击New(新建),这样对话框插入完毕。(见图3)

第四步:添加resource.h。我们把第四步插入的对话框ID改为IDD_MAIN ,在FileView中有个Header Files的文件,上面点击右键,选择Add Files to Folder...(添加文件到目录),弹出一个工程目录窗口,中间找到resource.h,然后OK了(添加)。(见图4)

第五步:复制代码。双击Main Dialog.cpp,我们写代码的位置出现了(见图5),那里有几行代码,把它们全部删掉,下面已经准备好的代码全部复制到那里,编译,执行,您的是否成功了? #include "stdafx.h" #include "resource.h" #include BOOL WINAPI Main_Proc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam); BOOL Main_OnInitDialog(HWND hwnd,HWND hwndFocus,LPARAM lParam); void Main_OnCommand(HWND hwnd,int id,HWND hwndCtl,

MFC对话框程序中的各组件常用方法

MFC对话框程序中的各组件常用方法: Static Text: 将ID号改成唯一的一个,如:IDC_XX,然后进一次类向导点确定产生这个ID,之后更改Caption属性: GetDlgItem(IDC_XX)->SetWindowText(L"dsgdhfgdffd"); 设置字体: CFont *pFont = new CFont; pFont->CreatePointFont(120,_T("华文行楷")); GetDlgItem(IDC_XX)->SetFont(pFont); Edit Control: 设置文本: SetDlgItemText(IDC_XX,L"iuewurebfdjf"); 获取所有输入: 建立类向导创建一个成员变量(假设是shuru1,shuru2……)类型选value,变量类型任选。 UpdateData(true); GetDlgItem(IDC_XX)->SetWindowText(shuru1); 第一句更新所有建立了变量的对话框组件,获取输入的值。第二句将前面的IDC_XX的静态文本内容改为shuru1输入的内容。 若类型选用control: 1.设置只读属性: shuru1.SetReadOnly(true); 2.判断edit中光标状态并得到选中内容(richedit同样适用) int nStart, nEnd; CString strTemp; shuru1.GetSel(nStart, nEnd); if(nStart == nEnd) { strTemp.Format(_T(" 光标在%d" ), nStart); AfxMessageBox(strTemp); } else { //得到edit选中的内容 shuru1.GetWindowText(strTemp); strTemp = strTemp.Mid(nStart,nEnd-nStart); AfxMessageBox(strTemp); } 其中nStart和nEnd分别表示光标的起始和终止位置,从0开始。strTemp.Format 方法用于格式化字符串。AfxMessageBox(strTemp)显示一个提示对话框,其内容是字符串strTemp。 strTemp = strTemp.Mid(nStart,nEnd-nStart)返回一个被截取的字符串,从nStart开始,长度为nEnd-nStart。如果nStart == nEnd说明没有选择文本。 注:SetSel(0,-1)表示全选;SetSel(-1,i)表示删除所选。

Visual C++基于对话框的MFC应用程序---简单的时钟实例实验一

1.1 创建对话框的应用程序 1.使用AppWizard创建应用程序框架 首先,创建一个对话框应用程序,其工程文件名为:ch1.dsp。具体步骤如下: (1)启动Visual C++ 6.0,在File菜单中选择new菜单项;(2)在new对话框的Project页中选择 MFC AppWizard(exe)选项,在Project name框中输入:ch1,并在Location 框中指定希望的目录路径,编译系统生成的各种文件将会存放在该目录下,然后点击[OK]按钮 (3)MFC AppWizard-Step1 中选择Dialog based 选项,MFC AppWizard-Step2 到MFC AppWizard-Step4中取默认选项;(4)进入VC对话框设计界面后,选中 [TODO:在这里设置对话控制。]静态框并按del键删除该框,选中[取消]按钮并按del键删除该按钮; (5)将[确认]按钮拖曳到对话框的下方中间。生成的对话框设计窗口(如图1-1所示)。 图1-1

2.向类中添加系统消息响应函数 Windows应用程序的采用事件触发、消息驱动机制和大量的消息响应函数构成了应用程序的主体。本示例需要用到两个消息响应函数OnCtlColor()和OnTimer(),前者响应窗口消息:WM_CTLCOLOR,后者响应窗口消息:WM_TIMER。关于这两个函数的功能和用法暂且略过,留待后面小节再叙。这里先介绍响应函数加载的方法。 在CCh1Dlg类中添加OnCtlColor( )函数的操作方法如下:(1)打开类向导(MFC ClassWizard)窗口,选择Message Maps 页; (2)选择工程、类和对象标识。在Message Maps页的Project、Class name、Object Ids框中 分别选择:ch1、CCh1Dlg、CCh1Dlg; (3)添加响应函数。在Message Maps页的Messages框中选中并双击窗口消息:WM_CTLCOLOR,此时,消息WM_CTLCOLOR 的响应函数OnCtlColor( )被添加到类向导底部Member Functions框中。 注意,添加OnTimer( )函数的过程与上述过程相似,只是第(3)步选择WM_TIMER消息,而不是WM_CTLCOLOR。 添加完毕后,按[OK]按钮退出类向导。回到项目工作区,在项目工作区窗口展开CCh1Dlg类,可以看到类中添加了OnCtlColor( )和OnTimer( )两个消息响应函数。

MFC对话框向主窗体传递消息机制

对话框向主窗体传递消息,在视图中显示 现举例说明对话框向主窗体传递消息,以及主窗体响应消息的过程。我们拿单文档来说明,我们要实现下列功能:通过对话框,在文本框中输入字符串,在视图中显示刚才输入的字符串。 1、在应用程序向导中选择单个文档,然后完成。我这里的项目名称为mybook 2、在资源视图中,插入一对话框,对话框名称为dlg_wzm。 3、在刚才生成的对话框中插入一文本框,设置好相应的类和变量。为确认按钮生成响应函数。同时在mybook.cpp的BOOL CMyBookApp::InitInstance()函数中让该对话框启动,也就是加入CDlg_wzm dlg; dlg.DoModal();两行程序,当然在前面的要加入#include "dlg_wzm.h"。(详细过程略) 4、下面重点在于点击该对话框的确认按钮向主窗体发送消息。要现定义一个消息名称。

在stdafx.h文件中加入一行: #define WM_MYMESSAGE WM_USER+100 5、在CMainFrame的pulic申明中加入一变量CString wzmstr。目的是为了保存对话框中的字符串的值。在对话框的Onok()函数中: void CDlg_wzm::OnOK() { // TODO: Add extra validation here this->UpdateData(true); CMainFrame* pWnd=(CMainFrame*)AfxGetMainWnd(); //得到父窗体的指针 pWnd->wzmstr=this->m_input_edit; ASSERT(pWnd!=NULL); ::SendMessage(pWnd->GetSafeHwnd(), WM_MYMESSAGE,0,0); //发送消息 //注意WM_MYMESSAGE就是我们前面定义的消息。 //CDialog::OnOK(); } 6、下面我们看看主窗体怎么接受消息。我们要在主窗体中设置消息映射。 在mainfrm.h的protected声明中: afx_msg void OnMyMessage(WPARAM wParam, LPARAM lParam); 在mainfrm.cpp文件中, BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) //{{AFX_MSG_MAP(CMainFrame) // NOTE - the ClassWizard will add and remove mapping macros here. // DO NOT EDIT what you see in these blocks of generated code ! ON_WM_CREATE() ON_MESSAGE(WM_MYMESSAGE,OnMyMessage) //这里是我们加入的。 //}}AFX_MSG_MAP END_MESSAGE_MAP() 然后在mainfrm.cpp的文件最下面加入一个函数: void CMainFrame::OnMyMessage(WPARAM wParam, LPARAM lParam) { CView *pView=this->GetActiveView(); //得到视图指针 if(pView)

在VC对话框中实现打印和打印预览

在VC对话框中实现打印和打印预览(附实现步骤) 时间:2008-01-27作者:佚名 在一般的软件开发中打印和打印预览是经常要用到的功能,对于VC6.0中的文档/视图(Doc/View)框架,可以很方便的使用缺省的打印和打印预览。但是,如果应用程序是基于对话框的就没有办法利用这种便利。而很多情况下,基于对话框的程序也需要打印和打印预览功能。那该怎么办呢?这正是本文将要解决的问题。 1实现打印 在对话框应用程序中不具备MFC的视和框架交互,要想实现打印和打印预览必须直接获取打印机的设备环境句柄,这时可以设置CPringDialog类中的构造函数的参数,获取打印机的设备环境句柄。利用这个句柄,转换为指针,则按打印流程实现打印任务。 (1)从CFrameWnd类派生出主窗口类CMyFrameWnd加入项目,这个类将作为控制类来实现程序的打印和打印预。 (2)在CMyFrameWnd中加入打印和打印预览相关的函数,为了方便起见,名字和CView视图类中缺省的打印和打印预览虚函数名相同。但这些函数是以成员函数的形式加入的,而不是重载。这里主要介绍Print和OnPrint函数。 Print函数是打印控制函数,由它来弹出打印对话框,取得用户设置信息,如打印机、纸张大小等。还有建立一个打印机DC和设置DOCINFO 结构,该结构包含输入输出文件名及其它一些信息,StartDoc函数要该结构作参数。还要设置打印区域,调用打印函数等 void CMyFrameWnd::Print() { CDC dc; CPrintDialog printDlg(FALSE); if (printDlg.DoModal() != IDOK) //弹出打印对话框,取得用户设置参数 return; dc.Attach(printDlg.GetPrinterDC());

基于MFC对话框的报表打印和预览功能(推荐文档)

基于MFC对话框的报表打印和预览功能 第一步:在工程中加入实现打印功能的四个文件PrintFrame.h, PringtView.h,PrintFrame.cpp, PrintView.cpp CPrintFrame和CPrintView类是两个个可重用的类,开发者只需要把这两个类对应的四个文件拷贝到工程文件所在目录中(PrintFrame.h, PringtView.h,PrintFrame.cpp, PrintView.cpp),并将这四个文件加入工程,并在需要执行打印功能的代码处加入 #include "PrintFrame.h" #include "PrintView.h" 第二步:添加三个消息响应函数来执行该功能 ON_MESSAGE(WM_BEGIN_PRINTING,OnBeginPrinting) ON_MESSAGE(WM_END_PRINTING,OnEndPrinting) ON_MESSAGE(WM_MY_PRINT,OnMyPrint) 这三个消息响应函数放在.cpp文件的BEGIN_MESSAGE_MAP(CReportDlg, CDialog)与END_MESSAGE_MAP()之间,如下:BEGIN_MESSAGE_MAP(CReportDlg, CDialog) //{{AFX_MSG_MAP(CReportDlg) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_BUTTON1, OnButton1) ON_MESSAGE(WM_BEGIN_PRINTING,OnBeginPrinting) ON_MESSAGE(WM_END_PRINTING,OnEndPrinting) ON_MESSAGE(WM_MY_PRINT,OnMyPrint) ON_BN_CLICKED(IDC_BUTTON2, OnButton2) //}}AFX_MSG_MAP END_MESSAGE_MAP() 其中OnMyPrint是跟具体要打印什么内容有关的开发人员要重点完成的代码,可以打印表格,图片,数据,只要GDI绘图可以进行的操作在这里都可以完成。由于打印预览的一部分工作在CView类里完成,因此在用户程序中只需要相应 WM_MY_PRINT消息就可以执行打印预览的功能,而不需要另外编写打印预览代码。 第三步: 建立一个CPrintFrame的对象,设该对象的指针为pFrame,并将对话框的指针传给该对象的m_pCallerDlg,即pFrame->m_pCallerDlg = this;

MFC中在一个对话框中弹出另一个对话框

在一个对话框中点按一个按钮弹出另外一个对话框。 弹出的对话框可以是模态和非模态两种,简单点讲,模态对话框就是在弹出的对话框没有关闭之前,是不能操作父对话框的。非模态可以。 这里介绍建立模态对话框。 在建立的时候可以有两种形式,一种是直接新建,一种是将已有的对话框整合添加进来。 (我是在WinCE平台下。也是类似MFC的) 第一种方式:新建弹窗 操作步骤 首先按步骤建立一个简单的对话框,并添加按钮。 然后点击Dialog 添加资源 选择Dialog 新建

此时会出现新建好的对话框,右击选择属性可以修改名称。 设计新建的对话框 在对话框上右击选择添加类

填写类名称,点击完成 此时在解决方案资源管理器视图中就会有新建的类,源文件及头文件

将这个头文件包含到主对话框的头文件中。 然后就是调用关系的产生, 双击主窗口在中的按钮,添加相应的处理函数 此时调试运行,点“刀”按钮,就会弹出设计好的刀的对话框。 当然,刀对话框中的设计就是走原来熟悉的路了。 另外一个键“剑” 也是同样的步骤。 这样弹出的对话框有个问题,就是感觉弹出的对话框缩放了,字体变小了。在对话框上右击选择属性就可以看见设置字体的选项了,修改字体即可。

下来介绍第二种方式,添加现有的窗口。第一步:同样按部就班的建立好基本工程。编译一下(F7) 第二步:拷贝文件 首先在当前工程目录下新建一个文件夹用来存放原有工程源码

需要拷贝下面选中的这几个文件。拷贝到新建的这个文件夹下。由于现有工程中有resource.h文件,所以需要提前改一下名称,相应的WifiConfig.rc文件中有调用到这个文件,所以也要修改。用记事本打开.rc文件,将#include“Resource.h” 改为#include “Resource_2.h”(如果是准备新建文件夹来组织代码的话就可以不用改。就像下面这样,其实可以不用改)将这几个文件拷贝到新建的文件夹下。 还需要将原有工程res目录下的图标拷贝到现在工程的res目录下 第三步:添加文件到工程 首先是资源文件添加 现有项,找到WiFI2Uart目录下的.rc文件。确定。

MFC简单的登录对话框

登录对话框 我们利用MFC编写一个简单的登录对话框。主窗体是单文档界面。程序运行的时候,先弹出一个简单的登录对话框,输入用户名和密码后主窗体显示出来。 1、开打VC++6.0。点击文件,新建,点击工程中的MFC AppWizard(exe),在右边选择工程保存的位置,并且为工程取好名字。 2、点击确定后,选择单个文档,你可以一直点击下一步,直到完成,或者在这里直接点击完成即可,完成后界面如下。 3、点击工具栏中的“!”号试着编译运行一次,看是否有问题。如果没有问题,我们继续。点击左边的ResourceView,在Dialog上面鼠标右键单击弹出一弹出框,单击Insert Dialog。

4、在右边新增的对话框中,适当改变窗口大小,加入静态文本框和文本编辑框。 输入用户名:。然后回车

同样在下面的第二个静态文本框的属性标题改为:输入密码:。然后回车。 6、在第一个文本编辑框上右键单击,点击属性,把ID框中的IDC_EDIT1改为容易理解的名字,如:IDC_EDIT_NAME,注意前面的IDC_EDIT最好不要去掉,这样容易见名而知义。同样,对第二个文本编辑框的属性中的IDC_EDIT2改为:IDC_EDIT_PWD 7、在对话框上的任何空白的地方右键单击,点击建立类向导。

然后弹出 选择建立Create a new class,点击OK。 这是为这个对话框创建一个新的类。在Name中,为该对话框类取个名字:CDlg_login。下面的Base class以及Dialog ID不要随便改动。然后点击OK。这样新的类CDlg_login就与本对话框建立起了联系。

(完整word版)MFC可收对话框实现

MFC可收缩对话框实现 1可收缩对话框使用 可使用窗口的SetWindowPos()函数,下面重点介绍一下这个函数及具体实现过程。 1.1S etWind owPos函数说明 BOOL SetWindowPos(HWND hWndlnsertAfter, int X,int Y,int cX,int cY,UNIT Flags): 1.1.1hWndInsertAfter 此句柄用于控制对话框在Z轴上的显示顺序,它可以是以下值: ?一个窗口句柄:则对话框会显示在此窗口的下一层; ?HWND_BOTTOM:将窗口置于Z序的底部; ?HWND_DOTTOPMOST:将窗口置于所有非顶层窗口之上(即在所有顶层窗口之后);?HWND_TOP:将窗口置于Z序的顶部。 ?HWND_TOPMOST:将窗口置于所有非顶层窗口之上。即使窗口未被激活窗口也将保持顶级位置。 1.1.2X、Y 相对以客户坐标指定窗口新位置的左边界、上边界;注意,这个X、Y是相对于调整之前窗口的左上角坐标而言的,即(0, 0)表示左上角不变。 1.1.3cX、cY 指定调整后新窗口的宽度和高度;

1.1.4Flags 指定窗口尺寸和定位的标志。它可能为以下值: ?SWP_ASNCWINDOWPOS:如果调用进程不拥有窗口,系统会向拥有窗口的线程发出需求。这就防止调用线程在其他线程处理需求的时候发生死锁。 ?SWP_DEFERERASE:防止产生WM_SYNCPAINT消息。 ?SWP_DRAWFRAME:在窗口周围画一个边框(定义在窗口类描述中)。 ?SWP_FRAMECHANGED:给窗口发送WM_NCCALCSIZE消息,即使窗口尺寸没有改变也会发送该消息。如果未指定这个标志,只有在改变了窗口尺寸时才发送WM_NCCALCSIZE。 ?SWP_HIDEWINDOW:隐藏窗口。 ?SWP_NOACTIV A TE:不激活窗口。如果未设置标志,则窗口被激活,并被设置到其他最高级窗口或非最高级组的顶部(根据参数hWndlnsertAfter设置)。 ?SWP_NOCOPYBITS:清除客户区的所有内容。如果未设置该标志,客户区的有效内容被保存并且在窗口尺寸更新和重定位后拷贝回客户区。 ?SWP_NOMOVE:维持当前位置(忽略X和Y参数)。 ?SWP_NOOWNERZORDER:不改变z序中的所有者窗口的位置。 ?SWP_NOREDRAW:不重画改变的内容。如果设置了这个标志,则不发生任何重画动作。适用于客户区和非客户区(包括标题栏和滚动条)和任何由于窗回移动而露出的父窗口的所有部分。如果设置了这个标志,应用程序必须明确地使窗口无效并区重画窗口的任何部分和父窗口需要重画的部分。 ?SWP_NOREPOSITION:与SWP_NOOWNERZORDER标志相同。 ?SWP_NOSENDCHANGING:防止窗口接收WM_WINDOWPOSCHANGING消息。?SWP_NOSIZE:维持当前尺寸(忽略cx和Cy参数)。 ?SWP_NOZORDER:维持当前Z序(忽略hWndlnsertAfter参数)。 ?SWP_SHOWWINDOW:显示窗口。 对于对话框程序,通常只用设置为:SWP_NOZORDER|SWP_NOMOVE,即保持左上角坐标不变,且保持Z轴顺序不变。

MFC之编写一个简单的登录对话框

编写一个简单的登录对话框 大家好,我们利用MFC编写一个简单的登录对话框。主窗体是单文档界面。程序运行的时候,先弹出一个简单的登录对话框,输入用户名和密码后主窗体显示出来。 1、开打VC++6.0。点击文件,新建,点击工程中的MFC AppWizard(exe),在右边选择工程保存的位置,并且为工程取好名字。 2、点击确定后,选择单个文档,你可以一直点击下一步,直到完成,或者在这里直接点击完成即可,完成后界面如下。 3、点击工具栏中的“!”号试着编译运行一次,看是否有问题。如果没有问题,我们继续。点击左边的ResourceView,在Dialog上面鼠标右键单击弹出一弹出框,单击Insert Dialog。

4、在右边新增的对话框中,适当改变窗口大小,加入静态文本框和文本编辑框。 输入用户名:。然后回车

同样在下面的第二个静态文本框的属性标题改为:输入密码:。然后回车。 6、在第一个文本编辑框上右键单击,点击属性,把ID框中的IDC_EDIT1改为容易理解的名字,如:IDC_EDIT_NAME,注意前面的IDC_EDIT最好不要去掉,这样容易见名而知义。同样,对第二个文本编辑框的属性中的IDC_EDIT2改为:IDC_EDIT_PWD 7、在对话框上的任何空白的地方右键单击,点击建立类向导。

然后弹出 选择建立Create a new class,点击OK。 这是为这个对话框创建一个新的类。在Name中,为该对话框类取个名字:CDlg_login。下面的Base class以及Dialog ID不要随便改动。然后点击OK。这样新的类CDlg_login就与本对话框建立起了联系。

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多对话框演示程序

简单的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教程对话框的编辑

第五章对话框 5.1 使用资源编辑器编辑对话框 在Windows 开发中弹出对话框是一种常用的输入/输出手段,同时编辑好的对话框可以保存在资源文件中。Visual C++提供了对话框编辑工具,利用编辑工具可以方便的添加各种控件到对话框中,而且利用ClassWizard 可以方便的生成新的对话框类和映射消息。 首先资源列表中按下右键,可以在弹出菜单中选择“插入对话框”,如图1。然后再打开该对话框进行编辑,你会在屏幕上看到一个控件板,如图2。你可以将所需要添加的控件拖到对话框上,或是先选中后再在对话框上用鼠标画出所占的区域。 接下来我们在对话框上产生一个输入框,和一个用于显示图标的图片框。之后我们使用鼠标右键单击产生的控件并选择其属性,如图3。我们可以在属性对话框中编辑控件的属性同时也需要指定控件ID,如图4,如果在选择对话框本身的属性那么你可以选择对话框的一些属性,包括字体,外观,是否有系统菜单等等。最后我们编辑图片控件的属性,如图5,我们设置控件的属性为显示图标并指明一个图标ID。 接下来我们添加一些其他的控件,最后的效果如图6。按下CtrlT 可以测试该对话框。此外 在对话框中还有一个有用的特性,就是可以利用Tab 键让输入焦点在各个控件间移动,要达到这一点首先需要为控件设置在Tab 键按下时可以接受焦点移动的属性Tab Stop,如果某一个控件不打算利用这一特性,你需要清除这一属性。然后从菜单“Layout”选择Tab Order 来确定焦点移动顺序,如图7。使用鼠标依此点击控件就可以重新规定焦点移动次序。最后按下CtrlT 进行测试。 最后我们需要为对话框产生新的类,ClassWizard 可以替我们完成大部分的工作,我们只需要填写几个参数就可以了。在编辑好的对话框上双击,然后系统回询问是否添加新的对话框,选择是并在接下来的对话框中输入类名就可以了。ClassWizard 会为你产生所需要的头文件和CPP 文件。然后在需要使用的地方包含相应的头文件,对于有模式对话框使用DoModal() 产生,对于无模式对话框使用Create()产生。相关代码如下; void CMy51_s1View::OnCreateDlg() {//产生无模式对话框 CTestDlg *dlg=new CTestDlg? dlg> Create(IDD_TEST_DLG)? dlg> ShowWindow(SW_SHOW)? } void CMy51_s1View::OnDoModal() {//产生有模式对话框 CTestDlg dlg? int iRet=dlg.DoModal()? TRACE("dlg return %d\n",iRet)? } 下载例子。如果你在调试这个程序时你会发现程序在退出后会有内存泄漏,这是因为我没有释放无模式对话框所使用的内存,这一问题会在以后的章节5.3 创建无模式对话框中专门讲述。 关于在使用对话框时Enter 键和Escape 键的处理:在使用对话框是你会发现当你按下Enter

MFC 对话框与对话框之间的参数传递 实例

MFC 对话框与对话框之间的参数传递实例 手把手教:基于MFC AppWizard (exe)的基本对话框应用程序中的对话框与对话框中的参数传递。实现当单击对话框A中的一个按钮控件时,对话框B中的一个按钮处于不可用状态,再单击一下,则变为可用。(要实现这种功能,关键在于使得对话框A中可以找到指向对话框B的指针,这样才能找到对应的按钮) 步骤: 1.新建-工程- MFC AppWizard (exe)-工程名“TMTD”-应用程序类型:基本对话框;ClassWizard步骤选项 均为缺省,完成。 2.删除静态控件“TODO: 在这里设置对话控制。”;在对话框资源上从工具箱中添加上一个Tab Control 控 件(ID: IDC_TAB) 3.使用ClassWizard-Member Variable为这个控件添加一个控制变量,(Member valiable name: m_TabCtrl; Category: Control; Valiable type: TabCtrl)。 4.创建两个新的对话框资源(ID: IDD_DIALOGA; ID: IDD_DIALOGB ),其属性作如下修改: 样式:重叠;边框:无。 5.从这两个对话框模板生成两个新的对话框类(CDlgChildA; CDlgChildB)。 6.在CTMTDDlg (TMTDDlg.h)中添加头文件: #include "DlgChildA.h" #include "DlgChildB.h" 7.在主对话框(CTMTDDlg.h )中为新添加进来的两个对话框类增加两个成员变量: Public: CDlgChildA m_Tab1; Public: CDlgChildB m_Tab2; 8.在主对话框(CTMTDDlg.h )的OnInitDialog()函数中添加如下类似的代码: // TODO: Add extra initialization here TCITEM item; item.mask = TCIF_TEXT; item.pszText = "第一页"; m_TabCtrl.InsertItem (0, &item); item.pszText ="第二页"; m_TabCtrl.InsertItem (1, &item); m_Tab1.Create (IDD_DIALOGA, &m_TabCtrl); m_Tab2.Create (IDD_DIALOGB, &m_TabCtrl); m_Tab1.m_MyDlg2 = &m_Tab2; CRect r; m_TabCtrl.GetClientRect (&r); m_Tab1.SetWindowPos(NULL, 10, 30, r.right-20, r.bottom-40, SWP_SHOWWINDOW); m_Tab2.SetWindowPos(NULL, 10, r.bottom-40, r.right-20, r.bottom-40, SWP_HIDEWINDOW);

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对话框与对话框之间的参数传递实例

MFC对话框与对话框之间的参数传递实例 基于MFC AppWizard (exe)的基本对话框应用程序中的对话框与对话框中的参数传递。实现当单击对话框A 中的一个按钮控件时,对话框B中的一个按钮处于不可用状态,再单击一下,则变为可用。(要实现这种功能,关键在于使得对话框A中可以找到指向对话框B的指针,这样才能找到对应的按钮) 步骤: 1.新建-工程- MFC AppWizard (exe)-工程名“TMTD”-应用程序类型:基本对话框;ClassWizard步骤选项 均为缺省,完成。 2.删除静态控件“TODO: 在这里设置对话控制。”;在对话框资源上从工具箱中添加上一个Tab Control 控 件(ID: IDC_TAB) 3.使用ClassWizard-Member Variable为这个控件添加一个控制变量,(Member valiable name: m_TabCtrl; Category: Control; Valiable type: TabCtrl)。 4.创建两个新的对话框资源(ID: IDD_DIALOGA; ID: IDD_DIALOGB ),其属性作如下修改: 样式:重叠;边框:无。 5.从这两个对话框模板生成两个新的对话框类(CDlgChildA; CDlgChildB)。 6.在CTMTDDlg (TMTDDlg.h)中添加头文件: #include "DlgChildA.h" #include "DlgChildB.h" 7.在主对话框(CTMTDDlg.h )中为新添加进来的两个对话框类增加两个成员变量: Public: CDlgChildA m_Tab1; Public: CDlgChildB m_Tab2; 8.在主对话框(CTMTDDlg.h )的OnInitDialog()函数中添加如下类似的代码: // TODO: Add extra initialization here TCITEM item; item.mask = TCIF_TEXT; item.pszText = "第一页"; m_TabCtrl.InsertItem (0, &item); item.pszText ="第二页"; m_TabCtrl.InsertItem (1, &item); m_Tab1.Create (IDD_DIALOGA, &m_TabCtrl); m_Tab2.Create (IDD_DIALOGB, &m_TabCtrl); m_Tab1.m_MyDlg2 = &m_Tab2; CRect r; m_TabCtrl.GetClientRect (&r); m_Tab1.SetWindowPos(NULL, 10, 30, r.right-20, r.bottom-40, SWP_SHOWWINDOW); m_Tab2.SetWindowPos(NULL, 10, r.bottom-40, r.right-20, r.bottom-40, SWP_HIDEWINDOW); 说明:

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

相关文档
相关文档 最新文档