簡體   English   中英

是否在MFC對話框中定義了控件列表或控件容器

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

我問的是“ MFC”對話框中的列表或控件容器? 我不是要列出像這樣的問題的對話框的子窗口, 通過MFC子對話框,MDIFrames等循環 ,我想要的是在對話框類中定義為變量的控件的列表,這些控件上應用了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
}

所以你要做的就是

  • 為所有DDX_ *函數編寫MY_DDX_ *函數(它們在afxdd_.h中定義)。
  • 在所有對話框中,替換所有對DDX_ *函數和MY_DDX_ *函數的調用
  • 將m_ddxcontrols成員放入所有對話框中

我不知道,但是您可以將控制資源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);
    ...
}

不是動態解決方案,但足夠簡單。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM