mfc对话框编程实例,mfc基于对话框编程
对话框
在VC中,一个窗口关联一个C类,对话框的基类是CDialog类。
对话框分为模态对话框和非模态对话框。在应用程序可以执行其他操作之前,必须关闭模式对话框。无模式对话框允许应用程序在不关闭对话框的情况下进行操作。
MSDN的说明:
这个类是用于在屏幕上显示对话框的基类。对话框有两种类型:模态和非模态。在应用程序继续之前,用户必须关闭模式对话框。无模式对话框允许用户显示对话框并返回到另一个任务,而无需取消或移除对话框。
3.创建一个对话框类。
选择新添加的对话框,View - ClassWizard创建一个基于CDialog的类与该对话框关联,输入类名、文件名、基类名和对话框ID。至此,我们在项目中添加了一个类。
4.创建一个对话框
A.模式对话框
使用DoModal() //调用DoModal()创建模态对话框,其返回值为cdialog:enddailog成员函数的参数,用于关闭对话框调用模态对话框,完成后返回。
//返回值:一个int值,指定传递给CDialog:EndDialog成员函数的nResult参数的值,该函数用于关闭对话框。如果函数无法创建对话框,则返回值为1;如果出现其他错误,则返回值为IDABORT,在这种情况下,输出窗口将包含来自GetLastError的错误信息。
备注:cdialog:enddailog//用于关闭模式对话框。
用法:
为菜单项添加响应对话框。
(1)新建一个对话框,双击对话框,为对话框新建一个CTestDlg类,以CDialog为基类。
(2)在菜单中添加一个新的菜单项,然后使用ClassWizard添加一个基于视图类的命令函数,并编写命令函数中的代码:
CTestDlg dlg
dlg。DoModal();
(3)在* * *视图开头增加# # include“ctestdlg . h”。Cpp,然后链接。
B.无模式对话框:
使用CDialog:Create()。
虚拟布尔创建(
UINT nIDTemplate,//对话ID号
CWnd* pParentWnd=NULL //对话框的父窗口C的对象指针);//初始化CDialog对象。创建一个无模式对话框,并将其附加到CDialog对象。
注意:调用Create()后,必须调用ShowWindow()函数来显示它,
BOOL show window(int nCmdShow);//设置窗口的可见性状态
注意,在创建非模态对话框时,一定要注意对话框对象的生命周期,因为对话框显示时程序一直在运行,但如果定义为部分非模态对话框,在其生命周期结束后就会被销毁。
用法:
在* * *看来。App类,添加成员变量:CTestDlg dlg
例如,在菜单中添加一个新的菜单项,然后使用ClassWizard添加一个基于视图类的命令函数,并在命令函数中编写代码:
dlg。Create(IDM_Dialog1,this);
dlg。SHOW window(SW _ SHOW);
另一种方法是为对话框变量分配堆内存。
CTestDialog * pDlg=new CTestDialog();
pDlg- Create(IDD_DIALOG1,this);
pDlg-SHOW window(SW _ SHOW);
注意:在模态对话框中,单击确定按钮销毁对话框;在无模式对话框中,单击“确定”按钮将对话框视为不可见,而不是销毁它。
非模式对话框应该覆盖其基类的OnOk()函数。MSDN中的描述:如果你在一个无模式对话框中实现ok按钮,你必须重写OnOK成员函数并在其中调用DestroyWindow。不要调用基类成员函数,因为它调用EndDialog,使对话框不可见但不破坏它。
5.在对话框中创建动态按钮:
示例:在对话框中添加一个按钮,按下按钮自动创建一个新按钮。
(1)在C***View类中添加一个成员变量:CButton m _ btn
(2)在dialog类中添加一个BOOL成员变量m_bIsCreate,并初始化为FALSE。
在对话框的按钮中添加响应函数,并添加代码:
if(m_bIsCreate==FALSE) //如果没有创建
{
m_btn .创建( Mickor .郭,BS _ def按钮 WS _ CHILD WS _ VISIBLE,
CRect(0,10,100,30),this,123);
m _ bIsCreate=TRUE
}
其他
{
m_btn .销毁窗口();//消毁窗口
m _ bIsCreate=FALSE
}
//该语句处理是为了防止重复按下该按钮时,出现错误。还有另外一种处理方法,就是不用设置m_bIsCreate为成员变量,而是设置为静态的局部变量,在如果语句之间加上:静态BOOL m _ bIsCreate=FALSE
最直接的方法,运用m_hWnd句柄的情况来创建:
如果(!m_btn.m_hWnd) //如果没有创建
{
m_btn .创建( Mickor .郭,BS _ def按钮 WS _ CHILD WS _ VISIBLE,
CRect(0,10,100,30),this,123);
}
其他
{
m_btn .销毁窗口();//消毁窗口
}
备注(按钮创建函数):
虚拟布尔按钮:创建(
LPCTSTR lpszCaption,//指定按钮控件的文本。按钮文本
DWORD dwStyle,//按钮样式指定按钮控件的样式。将按钮样式的任意组合应用于按钮。
康斯特const矩形,//按钮位置与大小指定按钮控件的大小和位置。
CWnd* pParentWnd,//父窗口指针
UINT nID //按钮身份
);//创建Windows操作系统按钮控件并将其附加到按钮对象。
6.静态文本框编程:
CString字符串;
if(GetDlgItem(IDC _ number 1)-GetWindowText(str),str==Number1 )
{
GetDlgItem(IDC _ number 1)-SetWindowText(数字1);
}
函数说明:
a.CWnd * GetDlgItem(int nID)const;//通过控件身份获得控件C对象指针
//此方法检索指向对话框或其他窗口中指定控件或子窗口的指针。返回的指针通常被强制转换为由突边标识的控件类型。
b . void GetWindowText(CString RS tring)const;//获得窗口文本
//此方法将拥塞窗口标题复制到lpszStringBuf指向的缓冲区或目标字符串rString中。如果拥塞窗口对象是一个控件,则内容方法复制控件中的文本,而不是复制标题。
c . void SetWindowText(LPCTSTR lpszString);//设置窗口文本
//此方法将窗口标题设置为指定的文本。如果窗口是一个控件,则设置控件中的文本。这个方法导致一个WM_SETTEXT消息被发送到这个窗口。
注意:逗号(,)运算符的应用
注意:在此之前,要设置静态文本控件的通知属性为真
7.编辑框编辑框编程:
对话框控件的七种访问方式:
A.GetDlgItem()-获取(设置)窗口文本()
B.GetDlgItemText()/SetDlgItemText()
C.GetDlgItemInt()/SetDlgItemInt()
D.将控件和整型变量相关联
E.将控件和控件变量相关联
F.发送消息()
G.SendDlgItemMessage()
例:为一个按钮添加加法的功能,按下,则将第一个编辑控件和第二个编辑控件的值相加,结果输出到第三个编辑控件中。
方法1:利用GetWindowText()和SetWindowText()实现。
在按钮响应函数中添加如下代码:
int num1、num2、num3
char ch1[10],ch2[10],CH3[10];
GetDlgItem(IDC _ edit 1)-GetWindowText(ch1,10);
GetDlgItem(IDC _ edit 2)-GetWindowText(CH2,10);
num 1=atoi(ch1);
num 2=atoi(CH2);
num3=num1 num2
itoa(num3,ch3,10);
GetDlgItem(IDC _ edit 3)-SetWindowText(CH3);
方法2:利用GetDlgItemText()和SetDlgItemText()实现
函数说明:
int GetDlgItemText( int nID,//控件身份
LPTSTR lpStr,//字符串数组
int nMaxCount //最大的字符数
)const//在一个窗口控件中读取文本到字符数组中
//此方法检索与对话框中控件关联的标题或文本。这个方法将文本复制到字符串指向的位置,并返回它复制的字节数。
void SetDlgItemText(
int nID,//控件身份
LPCTSTR lpszString);//字符串
//设置控件的文本内容此方法设置窗口或对话框所拥有的控件的标题或文本SetDlgItemText向给定控件发送WM_SETTEXT消息
用法:可以将上面的代码换成:
int num1、num2、num3
char ch1[10],ch2[10],CH3[10];
GetDlgItemText(IDC_EDIT1,ch1,10);
GetDlgItemText(IDC_EDIT1,ch2,10);
num 1=atoi(ch1);
num 2=atoi(CH2);
num3=num1 num2
itoa(num3,ch3,10);
SetDlgItemText(IDC_EDIT3,CH3);
方法3:GetDlgItemInt()和SetDlgItemInt()实现
函数说明:
UINT GetDlgItemInt(
int nID,//控件身份
BOOL* lpTrans=NULL,//控件文本是否有非数字字符,当设为空时,不进行报错
BOOL bSigned=TRUE ) //是否为有符号数值
const//获得控件文本,并转换成数值类型CWnd:GetDlgItemInt方法检索由突边参数标识的控件的文本。此方法通过去除文本开头的任何多余空格并转换十进制数字,将文本转换为整数值。当到达文本末尾或遇到任何非数字字符时,它会停止翻译。
void SetDlgItemInt(
int nID,//控件身份
UINT nValue,//数值
BOOL bSigned=TRUE //是否为有符号数值
);//把一个数值设置成控件文本此方法将对话框中指定控件的文本设置为指定整数值的字符串表示形式106 . SetDlgItemInt向给定控件发送WM_SETTEXT消息。
用法:
int num1、num2、num3
num 1=GetDlgItemInt(IDC _ edit 1);
num 2=GetDlgItemInt(IDC _ edit 2);
num3=num1 num2
SetDlgItemInt(IDC_EDIT3,num 3);
备注:
int atoi(常量char * string);//把一个字符串转为(同国际组织)国际组织类型的数值
char *_itoa(
(同Internationalorganizations)国际组织值,//要换的数值
char *string,//转换成的字符串
int radix //数值的进制2 - 36
);//把一个数值转换成字符串
方法4:利用数据交换与较验
A.视图-类向导-成员变量在此界面添加数据成员与控件的数据关联操作(即为各个控件添加成员变量),类名,控件名,数据成员名,数据类型,数据范围等
B.这里为3个编辑控件设置3个成员变量:m_num1,m_num2,m_num3。此时,类向导在程序中添加了如下代码:
在该对话框类的头文件中:
//{{AFX_DATA(CTestDialog)
枚举{ IDD=IDD _ dialog 1 };
intm _ num1//可知添加了3个成员变量
intm _ num2
intm _ num3
//}}AFX_DATA
在类的构造函数中,添加了3个成员变量的初始化:
C***Dlg:C***Dlg(……)
{…
m _ num 1=0;
m _ num 2=0;
m _ num 3=0;
}
在对话框类的数据交换函数中,将成员变量和控件进行了关联:
//}}AFX_DATA_MAP(C***Dlg)
DDX_Text(pDX,IDC_EDIT1,m _ num 1);
DDV _最小最大值(pDX,m_num1,0,100);
DDX_Text(pDX,IDC_EDIT2,m _ num 2);
DDX_Text(pDX,IDC_EDIT3,m _ num 3);
//}}AFX_DATA_MAP
备注:MSDN中注意:
虚拟void DoDataExchange(CDATA exchange * pDX);
//框架调用此方法来交换和验证对话数据
C.想要在程序中进行数据交互,必须调用更新数据()函数
BOOL更新数据(BOOL bSaveAndValidate=TRUE);//当参数为真实的时,将控件的值传给成员变量,当参数为错误的时,将成员变量的值传给控件
//注意:此方法初始化对话框中的数据,或者检索和验证对话框数据。指定一个标志,该标志指示对话框是正在初始化(错误)还是正在检索数据(真的).
用法:
在按钮的命令实现函数中,加入如下代码:
更新数据();
m _ num3=m _ num1 m _ num2
更新数据(假);
方法5:通过控件对象进行数据交互与关联
A.如同上面一样,在添加成员变量界面的种类下拉列表框中,选择控制,进行控件关联操作。(为编辑一关联m_edit1,为第二版关联m_edit2,为第三版关联m_edit3)
B.利用控件的成员函数进行操作,在按钮命令实现函数中加入代码:
int num1、num2、num3
char ch1[10],ch2[10],CH3[10];
第一版.GetWindowText(ch1,10);
第二版.GetWindowText(ch2,10);
num 1=atoi(ch1);
num 2=atoi(CH2);
num3=num1 num2
itoa(num3,ch3,10);
第三版.SetWindowText(CH3);
方法6:通过Windows操作系统操作系统消息进行数据交互
A.想要获得一个控件文本,可以有以下四种方式:
* sendmessage(getdlgitem(IDC _ edit 1)-m _ hwnd,WM_GETTEXT,10,(LPAR)ch 1)://利用Win32中函数发送消息(发送消息)发送一个获取文本的消息
* SendMessage(m _ edit 1 . m _ hWnd,WM_GETTEXT,10,(LPAR)ch 1)://利用控件变量
getdlgitem(IDC _ edit 1)-sendmessage(WM _ gettext,10,(LPAR)ch 1);//直接用CWnd加拿大)的成员函数发送消息(发送消息)去发送消息
S7-1200可编程控制器SendMessage(WM_GETTEXT,10,(LPAR)ch 1);//利用控件变量的成员函数发送消息(发送消息)去发送消息
B.设置控件文本可以:
S7-1200可编程控制器SendMessage(WM_SETTEXT,0,(LPAR)ch 1);
或* sendmessage(getdlgitem(IDC _ edit 1)-m _ hwnd,WM_SETTEXT,0,(LPAR)ch 1);
用法:
在按钮命令响应函数中,添加代码:
S7-1200可编程控制器SendMessage(WM_GETTEXT,10,(la pram)ch1);
S7-1200可编程控制器SendMessage(WM_GETTEXT,10,(LPAR)CH2);
num 1=atoi(ch1);
num 2=atoi(CH2);
数字3=数字1=数字2;
伊托阿(第3号、第3号、第10号);
S7-1200可编程控制器SendMessage(WM_SETTEXT,0,(LPAR)CH3);
备注:
lresult(
HWND,//控件句柄
UINT消息,//Windows消息,这里为WM_GETTEXT获得文本/WM_SETTEXT设置文本
WPARAM,//WM_GETTEXT时,为最大字符数量,WM_SETTEXT时,要设为0
lParam //要获得或设置的文本
);//发送一个Windows操作系统操作系统消息
方法第七:利用senddlgitemmessage()函数,直接给对话框子控件发送消息
函数说明:
lrsult发送地址(
int nID,//控件身份号
UINT消息:
wParam=0,
lparam=0
);//此方法向控件发送消息。参数同上
用法:
senddlgitmessage(IDC _ edit 1,WM_GETTEXT,10,(lapram)ch1);
senddgitive(IDC _ edit 2,WM_GETTEXT,10,(lapram)CH2);
num 1=atoi(ch1);
num 2=atoi(CH2);
数字3=数字1=数字2;
伊托阿(第3号、第3号、第10号);
senddlgitmessage(IDC _ edit 2,WM_SETTEXT,0,(LPAR)CH3);