ddx_control
场景:DDX_CONTROL的纳闷
DDX_CONTROL的疑惑
Flag for the direction of DDX and DDV.
这不是控制传输方向的么,为什么ddx_control一开头就断言为false,还咋从控件传输回去?
------解决方案--------------------
控件只能子类化一次
看 CDialog::OnInitDialog() 的源码, 初始化对话框后, 先调用的就是 UpdateData(FALSE),
------解决方案--------------------
好像VS没这个功能,只能在Debug的时候F11进入看,像source insight可以。
DDX_CONTROL的疑惑
void AFXAPI DDX_Control(CDataExchange* pDX, int nIDC, CWnd& rControl)m_bSaveAndValidate:
{
if ((rControl.m_hWnd == NULL) && (rControl.GetControlUnknown() == NULL)) // not subclassed yet
{
ASSERT(!pDX->m_bSaveAndValidate);
pDX->PrepareCtrl(nIDC);
HWND hWndCtrl;
pDX->m_pDlgWnd->GetDlgItem(nIDC, &hWndCtrl);
CMFCControlContainer* pMFCCtrlContainer = pDX->m_pDlgWnd->GetMFCControlContainer();
if (pMFCCtrlContainer != NULL && pMFCCtrlContainer->IsSubclassedFeaturePackControl(hWndCtrl))
{
pMFCCtrlContainer->ReSubclassControl(hWndCtrl, (WORD)nIDC, rControl);
return;
}
if ((hWndCtrl != NULL) && !rControl.SubclassWindow(hWndCtrl))
{
ASSERT(FALSE); // possibly trying to subclass twice?
AfxThrowNotSupportedException();
}
#ifndef _AFX_NO_OCC_SUPPORT
else
{
if (hWndCtrl == NULL)
{
if (pDX->m_pDlgWnd->GetOleControlSite(nIDC) != NULL)
{
rControl.AttachControlSite(pDX->m_pDlgWnd, nIDC);
}
}
else
{
// If the control has reparented itself (e.g., invisible control),
// make sure that the CWnd gets properly wired to its control site.
if (pDX->m_pDlgWnd->m_hWnd != ::GetParent(rControl.m_hWnd))
rControl.AttachControlSite(pDX->m_pDlgWnd);
}
}
#endif //!_AFX_NO_OCC_SUPPORT
}
}
Flag for the direction of DDX and DDV.
这不是控制传输方向的么,为什么ddx_control一开头就断言为false,还咋从控件传输回去?
------解决方案--------------------
控件只能子类化一次
看 CDialog::OnInitDialog() 的源码, 初始化对话框后, 先调用的就是 UpdateData(FALSE),
------解决方案--------------------
好像VS没这个功能,只能在Debug的时候F11进入看,像source insight可以。