在您调用 foo() 时尚未创建组合框窗口。您可能希望将 CStringArray 成员添加到 CClass1,然后将其设置为使用 DDX 加载组合框。 DDX 步骤将在组合框窗口创建后发生。
这里有一个自定义 DDX 函数可以完成这项任务:
void AFXAPI
DDX_CBStringArray (CDataExchange* pDX, int nIDC, CStringArray& strings)
{
HWND hWndCtrl = pDX->PrepareCtrl(nIDC);
bool bMine = false;
CComboBox* pCB = dynamic_cast<CComboBox*>(CWnd::FromHandlePermanent(hWndCtrl));
if (!pCB)
{
pCB = new CComboBox;
pCB->Attach(hWndCtrl);
bMine = true;
}
if (pDX->m_bSaveAndValidate)
{
strings.RemoveAll();
int nNumStrings = pCB->GetCount();
CString strVal("");
for (int x = 0; x < nNumStrings; ++x)
{
pCB->GetLBText(x, strVal);
strings.Add(strVal);
}
}
else
{
pCB->ResetContent();
INT_PTR nSize = strings.GetSize();
for (INT_PTR x = 0; x < nSize; ++x)
{
pCB->AddString(strings.GetAt(x));
}
}
if (bMine)
{
pCB->Detach();
delete pCB;
}
}
您将向 CClass1 添加一个 CStringArray 成员,并在您的 DDX 块中添加对此函数的引用。在构造类实例之后,但在调用 DoModal() 之前,将 ComboBox 中所需的字符串添加到 StringArray 变量中。此函数将为您填充组合框。
CClass1 改变如下:
CClass1 : public CDialogEx
{
...
public:
CStringArray myStringEntries;
...
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
...
};
您的 DoDataExchange 覆盖将如下所示:
void CClass1::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CClass1)
DDX_CBStringArray(pDX, IDC_COMBO1, myStringEntries);
...
//}}AFX_DATA_MAP
}
您的调用类更改为:
CClass1 dlg(this);
dlg.myStringEntries.Add("Some text");
dlg.myStringEntries.Add("More text");
dlg.DoModal();
或者,或者,可以更改 CClass1::foo() 以填充 CStringArray:
void CClass1::Foo()
{
myStringEntries.Add(TEXT("text"));
myStringEntries.Add(TEXT("more text"));
}