对话框中使用控件变量的时机

来源:互联网 发布:灰色系统模型软件 编辑:程序博客网 时间:2024/05/17 23:33

当我们用VC创建一个对话框后,在对话框中加入一些控件,且这些控件都有关联的控件变量,同时我们想在对话框中的OnInitDialog()中做一些控件的初始显示工作。

这里以时间控件为例,在对话框中增加一个Date time picker控件,其关联的控件变量是CDateTimeCtrl m_dtDateTime。

然后我们想在OnInitDialog()中设置我们自定义的时间,比如“2014/11/17 11:11:11”,这时候我们的代码可能如下:

<span style="font-size:18px;">BOOL CDlgDragConfirm::OnInitDialog(){CString sBeginTime = _T("2014/11/17 11:11:11");int nYear,nMonth,nDay,nHour,nMin,nSec;char* pszBeginTime=NULL;pszBeginTime = sBeginTime.GetBuffer(sBeginTime.GetLength());sBeginTime.ReleaseBuffer();sscanf(pszBeginTime, "%d/%d/%d %d:%d:%d ",&nYear,&nMonth,&nDay,&nHour,&nMin,&nSec); COleDateTime dtTime;dtTime.SetDateTime(nYear,nMonth,nDay,nHour,nMin,nSec);<span style="color:#ff0000;">m_dtDateTime.SetFormat(_T("yyyy-MM-dd HH:mm:ss"));</span>return CDialog::OnInitDialog();}</span>
这样实现看起来一点问题都没有,但当你运行程序时,会报错。然后我们把代码换成如下:

<span style="font-size:18px;">BOOL CDlgDragConfirm::OnInitDialog(){CString sBeginTime = _T("2014/11/17 11:11:11");int nYear,nMonth,nDay,nHour,nMin,nSec;char* pszBeginTime=NULL;pszBeginTime = sBeginTime.GetBuffer(sBeginTime.GetLength());sBeginTime.ReleaseBuffer();</span>
<span style="font-size:18px;"><span style="white-space:pre">CDateTimeCtrl* pdt = (CDateTimeCtrl*)GetDlgItem(IDC_DATETIMEPICKER_BEGINTIME);</span>sscanf(pszBeginTime, "%d/%d/%d %d:%d:%d ",&nYear,&nMonth,&nDay,&nHour,&nMin,&nSec); COleDateTime dtTime;dtTime.SetDateTime(nYear,nMonth,nDay,nHour,nMin,nSec);</span><span style="color: rgb(255, 0, 0); font-size: 18px; font-family: Arial, Helvetica, sans-serif;">pdt-></span><span style="color: rgb(255, 0, 0); font-size: 18px; font-family: Arial, Helvetica, sans-serif;">SetFormat(_T("yyyy-MM-dd HH:mm:ss"));</span><span style="font-size:18px;">return CDialog::OnInitDialog();}</span>
我们仅仅是把控件变量换成了控件指针,程序就没有问题了。


究其原因,是我们在使用控件变量的时候没有注意到,控件变量与控件的关联存在一个特定的时机。

我们想让控件变量生效,需要在对话框的父类进行初始化后,才能使用,也就是在

<span style="font-size: 18px;">CDialog::OnInitDialog();</span><span style="font-size: 18px; font-family: Arial, Helvetica, sans-serif;">执行之后才能直接使用控件变量,要不能只能使用控件指针(这一点上我犯了很多次,但是终究不知道为什么,现在知道了)。</span>

容易出现误用可能是因为,对话框父类的初始化放在了继承类初始化函数的最后,

<span style="font-size: 18px;">return CDialog::OnInitDialog();所以我们无意中就直接使用了控件变量。</span>
但是在CFormView的子类中一般不会,因为CFormView的继承类的初始化函数的第一条语句就是调用父类的初始化函数。如下:

void CFormDragPlan::OnInitialUpdate() {CFormView::OnInitialUpdate();InitView();//这里会使用到控件变量}
所以我们一般在CFormView的子类中不会遇到上述报错的问题,但是在对话框子类中,经常遇到。




0 0
原创粉丝点击