什么时候才使用DoDataExchange 而不用消息处理函数来更新对话框的数据成员?

来源:百度知道 编辑:UC知道 时间:2024/06/08 08:16:44
要一次性的更新对话框类的很多数据成员使用DDX,那么一般情况下如果只更新个别的数据成员 是不是可以不用DDX 直接用消息处理函数就行了呢?
下面算是用消息更新对话框的数据成员吗?
void C2Dlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
CString strAdjust;
CSliderCtrl * pSlide =( CSliderCtrl*) pScrollBar;
strAdjust.Format("%d",pSlide->GetPos());
switch(pScrollBar->GetDlgCtrlID()) {
case IDC_SLIDER_Threshold:
m_nTrackbar_Threshold=pSlide->GetPos(); //m_nTrackbar_Threshold是对话框的数据成员
SetDlgItemText(IDC_STATIC_Threshold,strAdjust);
if (c_CorrespondAutoDetect==true && c_AutoThresholdOptions==false)
{
OnBtnAutodetect();
MyDraw();
}
break;
case IDC_SLIDER_CrMean:
strAdjust.Format("%d",pSlide->GetPos());
CrMean=pSlide->GetPos(); //CrMean是对话框的数据成员
SetDlgItemText(IDC_STATIC_CrMean,strAdjust);
break;
... ...

这个代码更新IDC_STATIC_CrMean和IDC_STATIC_Threshold子控制,不用DDX也可以更新子控制,或者从子控制里面读取数据。

但这样麻烦,比如你这个例子里边的,需要格式化字符串,因为子控制只能接受字符串,所以如果是整数类型,必须转换为字符串然后才能写入控制。
strAdjust.Format("%d",pSlide->GetPos());

这样很麻烦,其实使用DDX就是为了省掉这些麻烦。所以一般来说能用DDX就不会用直接访问控制,不用DDX的情形一般是比较复杂的控制,DDX支持不好的,比如CListCtrl控制、甚至CComboBox,这些只能用DDX把它们映射到MFC控制类,然后在消息处理函数里边设置和读取数据。

你可以这样处理

CEdit* pEdit =(CEdit*)GetDlgItem(控件ID);
pEdit->SetWindowText("字符串");