我有一些自定义控件,我应该创建radiobuttons或复选框.子控件的计数仅在运行时可用(它加载一些文件,从中获取此计数).所以我需要创建可变数量的控件.我应该为此目的使用哪个系列?
解决方案1:简单地使用std :: vector< HWND> (或CArray< HWND>) – 不适合,因为我想使用MFC(CButton).当然,每当我需要这个窗口时,我可以将Attach()和稍后的Detach()句柄添加到窗口,但是它会带来很大的开销.
解决方案2:使用std :: vector< CButton *>或CArray< CButton *>或CList< CButton *>或者……在这种情况下,我需要注意在不需要控制时进行“新”和适当的“删除”.我很健忘:)
MFC句柄映射包含指向CButton的指针,我不能使用简单的CArray< CButton>,因为每当他的大小增长时它将移动我的对象.
……问题是:
我应该使用哪个集合来包含MFC控件类的变量计数?
最佳答案 如果您只想使用Count参数读取文件,请创建按钮,使用它们,然后将它们全部删除,然后CArray< CButton *>在我看来很好.要确保按钮被删除,您可以将CArray包装成一个帮助器,如:
class CMyButtonArrayWrapper
{
public:
CMyButtonArrayWrapper();
virtual ~CMyButtonArrayWrapper();
void ClearArray();
void Add(CButton* theButton);
private:
CArray<CButton*> m_Array;
}
CMyButtonArrayWrapper::CMyButtonArrayWrapper()
{
}
CMyButtonArrayWrapper::~CMyButtonArrayWrapper()
{
ClearArray();
}
void CMyButtonArrayWrapper::ClearArray()
{
for (int i=0; i<m_Array.GetSize(); i++)
{
CButton* aButton=m_Array.GetAt(i);
if (aButton)
delete aButton;
}
m_Array.RemoveAll();
}
void CMyButtonArrayWrapper::Add(CButton* theButton)
{
m_Array.Add(theButton);
}
然后将此类的对象作为成员添加到自定义控件(m_MyButtonArrayWrapper)并添加按钮:
CButton* aButton=new CButton;
aButton->Create( ... );
m_MyButtonArrayWrapper.Add(aButton);
如果您需要随机添加和删除按钮,CList可能更适合性能原因. (但你可能不会注意到使用CAAray的InsertAt / RemoveAt的性能差异,除了你的UI有几千个按钮.我想这将是一个艺术品而不是用户界面:))