MFC对话框文档格式.docx
《MFC对话框文档格式.docx》由会员分享,可在线阅读,更多相关《MFC对话框文档格式.docx(24页珍藏版)》请在冰豆网上搜索。
选择”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);
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)、使用标识来确定按钮是否创建,编写消息响应函数如下:
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)
按钮的单击、列表框的选择这类消息都属于通告消息。
四、控件的访问
1、静态文本控件的消息响应:
(1)、创建对话框资源,ID为IDD_DIALOG1,如下:
按住Ctrl键再点击控件,可以选择多个控件。
选择多个控件后可以用菜单栏中的Layout子菜单对这些控件进行布局。
也可使用工具栏的相应按钮来布局。
若要再添加一个对话框中已有类型的控件,可以按住Ctrl键,并用鼠标拖动这个已有控件到需要的位置,然后松开鼠标键,在松开Ctrl键,即可实现对已有控件的复制和粘贴功能。
(2)、通过ClassWizard为静态文本控件IDC_NUMBER1添加BN_CLICKED消息处理函数如下:
OnNumber1()
CStringstr;
//逗号表达式的结果是最后一个表达式的返回值。
if(GetDlgItem(IDC_NUMBER1)->
GetWindowText(str),str=="
Number:
"
)
GetDlgItem(IDC_NUMBER1)->
SetWindowText("
Text:
);
静态文本控件在默认状态下是不发送通告消息的。
为了使一个静态文本控件能够响应鼠标单击消息,需要两个步骤:
一是改变它的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()的方式):
//以下语句相当于GetDlgItem(IDC_EDIT1)->
GetDlgItemText(IDC_EDIT1,ch1,10);
GetDlgItemText(IDC_EDIT2,ch2,10);
SetDlgItemText(IDC_EDIT3,ch3);
方式三(GetDlgItemInt()的方式):
//GetDlgItemInt返回指定控件的文本,并将其转换为一个整型数值
num1=GetDlgItemInt(IDC_EDIT1);
num2=GetDlgItemInt(IDC_EDIT2);
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。
ⅱ、编写函数如下:
m_edit1.GetWindowText(ch1,10);
//m_edit1控件变量就相当于IDC_EDIT1控件
m_edit2.GetWindowText(ch2,10);
m_edit3.SetWindowText(ch3);
方式六(利用PlatformSDK的SendMessage函数):
intnum1,num2,num3;
:
SendMessage(GetDlgItem(IDC_EDIT1)->
m_hWnd,
WM_GETTEXT,10,(LPARAM)ch1);
SendMessage(GetDlgItem(IDC_EDIT2)->
WM_GETTEXT,10,(LPARAM)ch2);
ito