void CpropView::OnPropertysheet()
{
// TODO: 在此添加命令处理程序代码
CPropSheet propSheet(_T("属性表单"));
propSheet.SetWizardMode();
// propSheet.DoModal();
if((ID_WIZFINISH == propSheet.DoModal()))
{
m_iOccupation = propSheet.m_prop3.m_occupation;
m_strWorkAddr = propSheet.m_prop3.m_wrkaddr ;
m_bLike[0] = propSheet.m_prop2.m_football.GetCheck();
m_bLike[1] = propSheet.m_prop2.m_volyball.GetCheck();
m_bLike[2] = propSheet.m_prop2.m_swim.GetCheck();
m_bLike[3] = propSheet.m_prop2.m_basketball.GetCheck();
Invalidate();
}
}
昨天将 控件中添加的成员变量value和control的区别 好好研究了一番,差不多搞清楚怎么区分了。今天就遇到一个奇怪的问题。
前提是做了一个属性表单,包括三个属性页。在获取了用户的输入后,要在点属性页的“完成”之后将这些输入在屏幕上显示出来。
当属性表单是以wizard向导的形式创建时,DoModal会返回I D_WIZFINISH 或者 IDCANCEL,因此要检测到返回I D_WIZFINISH之后可以输出内容了。
其中
/*m_bLike[0] = propSheet.m_prop2.m_football.GetCheck();
m_bLike[1] = propSheet.m_prop2.m_volyball.GetCheck();
m_bLike[2] = propSheet.m_prop2.m_swim.GetCheck();
m_bLike[3] = propSheet.m_prop2.m_basketball.GetCheck();*/
m_football,m_volyball,m_swim,m_basketball是与复选框相关联的Control类CButton类型的变量,简单说说Control和Value的区别:
<span style="color: rgb(51, 51, 51); font-family: 微软雅黑; font-size: 14px; line-height: 25px;">control型变量可以获得控件的实例,通过这个变量,你可以操纵控件</span><span style="color: rgb(51, 51, 51); font-family: 微软雅黑; font-size: 14px; line-height: 25px;">,无须通过额外调用</span><span style="font-family: 微软雅黑; font-size: 14px; line-height: 25px; color: rgb(255, 0, 0);">UpdateData(TRUE)获得用户输入的更新</span><span style="color: rgb(51, 51, 51); font-family: 微软雅黑; font-size: 14px; line-height: 25px;"> ,而value型变量仅仅可以获得该控件的public型变量。 </span>
<span style="color: rgb(51, 51, 51); font-family: 微软雅黑; font-size: 14px; line-height: 25px;">因此可以通过Control类变量调用该控件类的函数比如getcheck去得到选择情况。此时点完成之后,会终止运行:</span>
<span style="color: rgb(51, 51, 51); font-family: 微软雅黑; font-size: 14px; line-height: 25px;"><img src="https://img-blog.csdn.net/20150124173326171" alt="" />
</span>
<span style="font-family: 微软雅黑; font-size: 14px; line-height: 25px;"><span style="color:#333333;">分析知,点完成,DoModal函数返回后,属性表单窗口就被销毁了,当然表单上的控件也就销毁了,与之关联的等同于该控件的Control类</span></span><pre name="code" class="html" style="font-weight: bold;"><span style="color:#333333;">m_football的地址就是无效的了,</span><span style="color:#ff0000;">注意,属性表单对象的生命周期并没有结束,他们不是同一个事物</span><span style="color:#333333;">。断点看看它此时的地址(为了区别,名字改成了m_ctlFootball)。</span>
<img src="https://img-blog.csdn.net/20150124174004507" alt="" />
此时m_ctlFootball的地址是0x0000000,hWnd也是0.这就是出错的原因。
然后再来对比下,在窗口和控件都存在的时候捕捉下Control变量。
<img src="https://img-blog.csdn.net/20150124174313704" alt="" />
。最后我将Control类的变量改成Value类了。问题解决。
</pre><pre name="code" class="html">