gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 07:39:05 24 4
gpt4 key购买 nike

我问的是 mfc 对话框中的列表或控件容器?我不是说像这个问题一样列出对话框的子窗口 Loop through MFC Child Dialogs, MDIFrames etc ,我想要的是在对话框类中定义为变量的控件列表,这些控件应用了 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 放入数组中。因此,一旦执行了 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 成员放入所有对话框中

关于c++ - MFC 对话框中是否有定义的控件列表或控件容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16191612/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com