我在询问 mfc 对话框中的列表或控件容器?我并不是说像这个问题那样列出对话框的子窗口Loop through MFC Child Dialogs, MDIFrames etc,我想要的是在对话框类中定义为变量的控件列表,这些控件应用了 DDX_Control 方法。
我需要在对话框中定义所有控制变量的列表
我在询问 mfc 对话框中的列表或控件容器?我并不是说像这个问题那样列出对话框的子窗口Loop through MFC Child Dialogs, MDIFrames etc,我想要的是在对话框类中定义为变量的控件列表,这些控件应用了 DDX_Control 方法。
我需要在对话框中定义所有控制变量的列表
哪有这回事。DDX 使用控件是因为在对话框类的 DoDataExchange 方法中调用了相应的 DDX_* 函数。没有可以解析的表,因此无法动态确定在 DoDataExchange 方法中调用了哪个 DDX_* 函数。
void CMySampleDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CReprendBudgetDlg)
DDX_Text(pDX, IDC_EDIT1, m_name1);
DDX_Text(pDX, IDC_EDIT2, m_name2);
//}}AFX_DATA_MAP
}
但是您可以通过您自己的一些函数“覆盖” DDX_* 函数,这些函数会将控件 ID 放入数组中。因此,一旦执行了 DoDataExchage 函数,该数组将包含 DDX 使用的所有控件 ID。
void AFXAPI MY_DDX_Text(CDataExchange* pDX, int nIDC, CString& value, CWordArray & ddxcontrols)
{
DDX_Text(pDX, nIDC, value);
if (!pDX->bSaveAndValidate)
ddxcontrols.Add(nIDC) ;
}
#define DDX_Text(a,b,c) MY_DDX_Text(a,b,c) // now we can continue to use DDX_Text
// and the Class Wizard will be happy
class CMySampleDlg : public CDialog
{
...
protected:
CWordArray m_ddxcontrols ; // array that will contain all control IDs use by DDX
...
}
void CMySampleDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CReprendBudgetDlg)
DDX_Text(pDX, IDC_EDIT1, m_name1, m_ddxcontrols);
DDX_Text(pDX, IDC_EDIT2, m_name2, m_ddxcontrols);
//}}AFX_DATA_MAP
}
所以你所要做的就是
我不知道,但您可以将控制资源 ID 从 DoDataExchange 块复制到一个带有零终止符的数组中:
const UINT myControls[] =
{
IDC_EDIT1, IDC_EDIT2, IDC_EDIT3,
IDC_BUTTON1, IDC_BUTTON2, IDC_BUTTON3,
IDC_STATIC1, IDC_STATIC2, IDC_STATIC3,
0
};
然后你可以使用这个数组来迭代你想要的控件:
for (const UINT* p = myControls; *p; ++p)
{
CWnd *wnd = GetDlgItem(*p);
...
}
不是动态解决方案,但足够简单。