关于对话框的知识(函数的调用机制和控件的使用)

本文介绍了MFC中对话框的数据交互过程,包括OnInitDialog()和DoDataExchange()函数的作用及执行时机,UpdateData()函数的使用方法,以及颜色、字体和文件对话框的具体应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、OnInitDialog()函数的执行时机,是在执行DoModal()函数显示对话框之前系统会向对话框发出WM_INITDIALOG消息,这一消息将引发OnInitDialog()函数的执行。
2、DaDataExchange()函数用于进行对话框数据交换和验证。但是在控件和类的连接时,该函数执行的并不是这一任务,而只是实现了控件与类的连接。
void Cdialog_tsetDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_EDIT1, m_Cedit);//实现了控件与类的连接
}
DaDataExchange()函数的执行时机是在OnInitDialog()函数中的CDialog::OnInitDialog();语句执行之后。
3、MFC提供了类CDataExchange实现对话框类与控件之间的数据交换(DDX),该类还提供了数据有效机制(DDV)(这个目前还不知道有什么作用),数据交换和数据有效机制适用与编辑框、检查框、单选按钮、列表框和组合框等。
我们举一个很简单的例子:就拿编辑框来说:编辑框有控制变量和值变量两种,控制变量是和对象相关联的,而值变量则是和控件中的数据进行交换的。
当程序需要交换数据时,不要直接调用DoDataExchange函数,而应该调用CWnd::UpdateData函数。因为UpdateData函数内部调用了DoDataExchange,同时决定了数据交换的方向。
函数原型:BOOL UpdateData( BOOL bSaveAndValidate = TRUE );
但是方向什么时候,怎么流向的呢?
当参数为FALSE时,数据从对话框的数据成员流向控件;当参数为TRUE时,数据从控件流向对话框的数据成员。

ps:当单击“确定”按钮关闭对话框时,参数为TRUE;当系统调用OninitDialog()函数初始化对话框时,参数为FALSE。

颜色对话框:CColorDialog

使用方法:

CColorDialog dlg(RGB(255,0,0),CC_FULLOPEN,this);//集体参数意思可以自己查

得到所选的颜色的两种方法:

1:COLORFREF cr = dlg.GetColor();

m_cc的类型是一个结构体,详细的可以自己查

2:1:COLORFREF cr = dlg.m_cc.rgbResult();

字体对话框:

字体对话框及其使用的典型代码如下:

LOGFONT lf;

memset(&lf, 0,sizeof(LOGFONT));

strcpy(lf.lfFaceName,"宋体");//设置初始字体名称

CFontDialog dlg(&lf,CF_EFFECTS | CF_SCREENFONTS,0,this);

if(dlg.DoModal() == IDOK)

{

CClientDC dc(this);

dlg.GetCurrentFont(&lf);//获取字体对话框设置的字体信息

CFont myfont;

myfont.CreateFontIndirect(&lf);

dc.SelectObject(&myfont);

dc.TextOut(100,100,"Hello");

}

文件对话框:

CFileDialog(BOOL bOpenFileDialog,剩下的都有默认参数,详细的请参看MSDN)

bOpenFileDialog:为TRUE,则显示打开对话框,为FALSE则显示保存对话框。

CFileDialog类提供了一些成员函数:

GetPathName:得到完整的文件名,包括目录名和扩展名,如:“c:\test1.txt”

GetFileName:得到完整的文件名,如"test1.txt"

GetExtName:得到完整的文件扩展名,如:".txt"

GetFileTitle:得到完整的文件名,不包括目录名和扩展名,如"test1"

GetStartPosition:对于选择的多个文件的情况得到第一个文件的位置

GetNextPathName:对于选择了多个文件的情况得到下一个文件的位置,并同时返回当前文件名


例子:

//定义文件过滤器
CString szFilters = "MyType Files (*.my)|*.my |All Files (*.*)|*.*||";
CFileDialog file(TRUE,"txt","*.txt",OFN_FILEMUSTEXIST|OFN_HIDEREADONLY,szFilters,this);


if ( IDOK == file.DoModal() )
{
CString str1,str2,str3,str4;
str1 = file.GetPathName();
str2 = file.GetFileName();
str3 = file.GetFileTitle();
::SetWindowText(GetParent()->m_hWnd,str3);//将文本框的标题设置成所选的文件名



}

还有查找替换对话框,这里就不详细说了,有需要的可以查

类为:CFindReplaceDialog,这个对话框是一个非模态对话框,先new,在create,在showwindow();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值