是否有MFC对话框中定义的控件或控件容器列表

时间:2013-04-24 12:07:55

标签: c++ mfc controls containers cdialog

我在mfc对话框中询问列表或控件容器?我并不是说列出像这个问题Loop through MFC Child Dialogs, MDIFrames etc这样的对话框的子窗口,我想要的是在对话框类中定义为变量的控件列表,这些控件是应用DDX_Control方法的。

我需要有一个在对话框中定义的所有控制变量的列表

2 个答案:

答案 0 :(得分:1)

没有这样的事情。 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
}

所以你要做的就是

  • 为所有DDX_ *函数编写MY_DDX_ *函数(它们是 在afxdd_.h中定义)。
  • 在所有对话框中,将所有对DDX_ *函数的调用替换为我的MY_DDX_ *函数
  • 将m_ddxcontrols成员放在所有对话框中

答案 1 :(得分:0)

我不知道,但你可以将DoDataExchange块中的控制资源ID复制到一个零终止符的数组中:

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);
    ...
}

不是动态解决方案,但足够简单。