对话框中使用控件变量的时机
来源:互联网 发布:灰色系统模型软件 编辑:程序博客网 时间: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
- 对话框中使用控件变量的时机
- 在别的对话框中使用控件变量
- 对话框中开辟线程,使用对话框变量的问题
- java中实例变量的初始化时机
- 使用ThreadLocal变量的时机和方法
- 使用ThreadLocal变量的时机和方法
- 使用ThreadLocal变量的时机和方法
- 使用ThreadLocal变量的时机和方法
- 使用ThreadLocal变量的时机和方法
- 使用ThreadLocal变量的时机和方法
- mfc中父对话框变量获取子对话框控件的变量
- 对话框控件的变量绑定
- MFC 对话框中tab控件的使用
- android中控件Dialog对话框的使用
- mark-fragment中获取控件的时机
- MFC中关于控件变量的使用!
- 7.8对话框控件的变量绑定及开源控件类的使用
- 第八节 对话框控件的变量绑定和开源控件的使用
- java final 关键字
- 中水处理设备:小区中水回用设备优势及特点简要说明
- Sublime Text 2快捷键大全
- shutil.rmtree
- ceph存储 多网卡的7种bond模式原理
- 对话框中使用控件变量的时机
- filter过滤器过滤特殊字符
- Something write in FSE 2014
- java.lang.UnsatisfiedLinkError: no XXX in java.library.path
- android pull 解析 用switch解析 容易看懂 if----else if 繁琐
- Partition does not start on physical sector boundary
- 高手帮看看artdialog的弹出选择数组返回
- ffmpeg中avio_open无法打开中文路径的解决方法
- 微信公众请求URL超时常见解决方法