MFC对话框.docx

上传人:b****1 文档编号:412167 上传时间:2022-10-09 格式:DOCX 页数:24 大小:55.78KB
下载 相关 举报
MFC对话框.docx_第1页
第1页 / 共24页
MFC对话框.docx_第2页
第2页 / 共24页
MFC对话框.docx_第3页
第3页 / 共24页
MFC对话框.docx_第4页
第4页 / 共24页
MFC对话框.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

MFC对话框.docx

《MFC对话框.docx》由会员分享,可在线阅读,更多相关《MFC对话框.docx(24页珍藏版)》请在冰豆网上搜索。

MFC对话框.docx

MFC对话框

一、对话框

1、对话框就是一个窗口,它不仅可以接收消息,还可以被移动或关闭,在它上面可以放置各种各样的标准控件和扩展控件。

提示:

在MFC中,所有的控件类都是由CWnd类派生来的,因此,控件实际上也是窗口,控件通常是作为对话框的子窗口而创建的。

2、对话框的类型:

(1)、模态对话框

模态对话框是指当其显示时,程序会暂停执行,知道关闭这个模态对话框后,才能继续执行程序中其他任务。

(2)、非模态对话框

非模态对话框显示时,允许转而执行程序中其他任务,而不用关闭这个对话框。

注意:

单击OK按钮时,模态对话框和非模态对话框都会消失。

对于模态对话框而言,该对话框窗口对象被销毁,而对非模态对话框而言,对话框窗口对象并未被销毁,只是被隐藏了。

二、对话框的创建和显示

1、新建一个MFC单文档工程Dlg

2、新建对话框资源IDD_DIALOG1:

Insert->Resource->选择”Dialog”->单击”New”按钮

3、为新建资源添加对应的类:

View->ClassWizard->将类名取为”CTestDlg”,Baseclass选择CDialog->OK按钮

提示:

在MFC中,对资源的操作通常都是通过一个与资源相关的类来完成的。

对话框资源有一个相应的基类:

CDialog。

4、在菜单栏中添加菜单项Dialog,其ID设置为IDM_DIALOG。

利用ClassWizard为该菜单项添加COMMAND命令消息响应函数。

其中Classname选择CDlgView。

5、上步会在DlgView源文件中生成voidCDlgView:

:

OnDialog()函数,在此函数中创建不同的对话框:

(1)、创建模态对话框

CTestDlgdlg;//记得添加#include"TestDlg.h"

dlg.DoModal();//DoModal函数本身有显示模态对话框的作用

(2)、创建非模态对话框,由于生命周期的原因,不能将对话框对象定义为局部变量,可以:

ⅰ将dlg定义为全局变量

dlg.Create(IDD_DIALOG1,this);

dlg.ShowWindow(SW_SHOW);

注意:

此时必须重写ID为IDOK按钮的OnOK虚函数且不要再调用基类的OnOK函数,以免出错。

同样也须重写ID为IDCANCEL按钮的OnCancel虚函数。

如:

voidCTestDlg:

:

OnOK()

{

DestroyWindow();

}

ⅱ定义一个指针,在堆上分配内存

CTestDlg*PDlg=newCTestDlg;

PDlg->Create(IDD_DIALOG1,this);

PDlg->ShowWindow(SW_SHOW);

注意:

PDlg指针是局部变量,当它的生命周期结束时,它所保存的内存地址就丢失了,那么在程序中也就无法再引用到它所指向的那块内存了。

解决办法有两种:

一是将该指针定义为DlgView的成员变量,然后在View类的析构函数中调用delete函数。

二是在CTestDlg类

中重载PostNcDestroy虚函数,在该虚函数中调用delete函数释放指针所指向的内存。

如:

voidCTestDlg:

:

PostNcDestroy()

{

deletethis;

CDialog:

:

PostNcDestroy();

}

三、动态创建按钮

1、新建对话框资源,ID为IDD_DIALOG1。

2、添加一个按钮,ID设为IDC_BTN_ADD,Caption设为Add。

3、为IDC_BTN_ADD按钮添加BN_CLICKED消息响应函数,其中Classname选择CTestDlg。

(1)、使用标识来确定按钮是否创建,编写消息响应函数如下:

voidCTestDlg:

:

OnBtnAdd()

{

//m_bIsCreated是全局BOOL类型变量,标示点击IDC_BTN_ADD按钮时,m_btn按钮是否创建,在CTestDlg构造函数中初始化为FALSE。

m_btn是全局的CButton变量。

if(m_bIsCreated==FALSE)//还未动态生成按钮

{

m_btn.Create("New",BS_DEFPUSHBUTTON|WS_VISIBLE|WS_CHILD,

CRect(0,0,50,50),this,123);//生成动态按钮

m_bIsCreated=TRUE;//表示按钮已经动态生成

}

else

{

m_btn.DestroyWindow();//动态按钮已创建,现销毁

m_bIsCreated=FALSE;//表示动态按钮已销毁

}

}

提示:

创建按钮时,没有指定WS_VISIBLE风格,那么随后一定要调用这个按钮对象的ShowWindow函数,将该按钮控件显示出来。

(2)、CButton是CWnd子类,所以它有一个m_hWnd窗口句柄,可以通过该句柄判断按钮是否创建,编写消息响应函数如下:

if(!

m_btn.m_hWnd)

{

m_btn.Create("New",BS_DEFPUSHBUTTON|WS_VISIBLE|WS_CHILD,

CRect(0,0,50,50),this,123);

}

else

{

m_btn.DestroyWindow();

}

提示:

按钮的单击、列表框的选择这类消息都属于通告消息。

四、控件的访问

1、静态文本控件的消息响应:

(1)、创建对话框资源,ID为IDD_DIALOG1,如下:

提示:

按住Ctrl键再点击控件,可以选择多个控件。

选择多个控件后可以用菜单栏中的Layout子菜单对这些控件进行布局。

也可使用工具栏的相应按钮来布局。

若要再添加一个对话框中已有类型的控件,可以按住Ctrl键,并用鼠标拖动这个已有控件到需要的位置,然后松开鼠标键,在松开Ctrl键,即可实现对已有控件的复制和粘贴功能。

(2)、通过ClassWizard为静态文本控件IDC_NUMBER1添加BN_CLICKED消息处理函数如下:

voidCTestDlg:

:

OnNumber1()

{

CStringstr;

//逗号表达式的结果是最后一个表达式的返回值。

if(GetDlgItem(IDC_NUMBER1)->GetWindowText(str),str=="Number:

")

{

GetDlgItem(IDC_NUMBER1)->SetWindowText("Text:

");

}

else

{

GetDlgItem(IDC_NUMBER1)->SetWindowText("Number:

");

}

}

注意:

静态文本控件在默认状态下是不发送通告消息的。

为了使一个静态文本控件能够响应鼠标单击消息,需要两个步骤:

一是改变它的ID;二是在它的属性对话框Style选项卡下选中Notify选项。

2、编辑框控件的访问

方式一(GetDlgItem()的方式):

intnum1,num2,num3;

charch1[10],ch2[10],ch3[10];

//获得静态文本控件IDC_EDIT1的文本,将该文本放入ch1,10表示最大字符数

GetDlgItem(IDC_EDIT1)->GetWindowText(ch1,10);

GetDlgItem(IDC_EDIT2)->GetWindowText(ch2,10);

num1=atoi(ch1);//将字符数组转换成整型

num2=atoi(ch2);

num3=num1+num2;

//将num3转换成字符数组保存到ch3中,10表示十进制

itoa(num3,ch3,10);

GetDlgItem(IDC_EDIT3)->SetWindowText(ch3);

方式二(GetDlgItemText()的方式):

intnum1,num2,num3;

charch1[10],ch2[10],ch3[10];

//以下语句相当于GetDlgItem(IDC_EDIT1)->GetWindowText(ch1,10);

GetDlgItemText(IDC_EDIT1,ch1,10);

GetDlgItemText(IDC_EDIT2,ch2,10);

num1=atoi(ch1);

num2=atoi(ch2);

num3=num1+num2;

itoa(num3,ch3,10);

SetDlgItemText(IDC_EDIT3,ch3);

方式三(GetDlgItemInt()的方式):

intnum1,num2,num3;

//GetDlgItemInt返回指定控件的文本,并将其转换为一个整型数值

num1=GetDlgItemInt(IDC_EDIT1);

num2=GetDlgItemInt(IDC_EDIT2);

num3=num1+num2;

SetDlgItemInt(IDC_EDIT3,num3);

方式四(将控件和整型变量相关联):

ⅰ、使用ClassWizard为IDC_EDIT1控件添加变量m_num1,其中Category:

选择Value,Variabletype:

选择int。

同理可为其他控件添加变量。

提示:

ClassWizard还可设置变量的取值范围。

MFC中DDV_为前缀的函数用于数据校验,DDX_为前缀的函数用于数据交换。

ⅱ、使用UpdateData函数实现控件和变量数据的交换:

//将控件中的数据传到变量中

UpdateData(TRUE);

m_num3=m_num1+m_num2;

UpdateData(FALSE);//将变量的数据传回控件

提示:

对话框控件与类成员变量的关联是在类的DoDataExchange函数中实现的。

DoDataExchange函数主要用来完成对话框数据的交换和校验。

UpdateData函数会去调用DoDataExchange函数。

方式五(将控件和控件变量相关联):

ⅰ、使用ClassWizard为IDC_EDIT1等控件添加控件变量,即代表控件本身。

其中Category:

选择Control,Variabletype:

选择CEdit。

ⅱ、编写函数如下:

intnum1,num2,num3;

charch1[10],ch2[10],ch3[10];

m_edit1.GetWindowText(ch1,10);//m_edit1控件变量就相当于IDC_EDIT1控件

m_edit2.GetWindowText(ch2,10);

num1=atoi(ch1);

num2=atoi(ch2);

num3=num1+num2;

itoa(num3,ch3,10);

m_edit3.SetWindowText(ch3);

方式六(利用PlatformSDK的SendMessage函数):

intnum1,num2,num3;

charch1[10],ch2[10],ch3[10];

:

:

SendMessage(GetDlgItem(IDC_EDIT1)->m_hWnd,

WM_GETTEXT,10,(LPARAM)ch1);

:

:

SendMessage(GetDlgItem(IDC_EDIT2)->m_hWnd,

WM_GETTEXT,10,(LPARAM)ch2);

num1=atoi(ch1);

num2=atoi(ch2);

num3=num1+num2;

ito

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 教育学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1