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

Is there a list of controls or controls container defined in an MFC dialog

本文关键字:控件 列表 定义 MFC 对话框 是否      更新时间:2023-10-16

我在问mfc对话框中的列表或控件容器?我不是指列出对话框的子窗口,像这样的问题循环通过MFC子对话框,MDIFrames等,我想要的是一个列表的控件定义为变量在对话框类的那些DDX_Control方法应用于他们。

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

没有这种事。控件由DDX使用是因为相应的DDX_*函数在对话框类的DoDataExchange方法中被调用。没有可以解析的表,因此无法动态确定在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放在一个数组中。因此,一旦dodataexchange函数被执行,该数组将包含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成员放到所有的对话框中

我知道没有,但是您可以将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);
    ...
}

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