在MFC中动态创建控件(集合问题)

时间:2010-04-02 08:59:53

标签: mfc dynamic controls creation

我有一些自定义控件,我应该在其中创建radiobuttons或复选框。子控件的计数仅在运行时可用(它加载一些文件,从中获取此计数)。所以我需要创建可变数量的控件。我应该为此目的使用哪个系列?

解决方案1:只需使用std::vector<HWND>(或CArray<HWND>) - 不合适,因为我想使用MFC(CButton)。当然,每当我需要这个窗口时,我可以Attach()和更晚Detach()处理窗口,但这会带来很大的开销。

解决方案2:使用std::vector<CButton*>CArray<CButton*>CList<CButton*>或......在这种情况下,我需要注意在不需要控制时进行'新'和适当的'删除'。我很健忘:))

MFC句柄地图包含指向CButton的指针,我不能使用简单的CArray<CButton>,因为每次他的大小增加时它都会移动我的对象。

......问题是: 我应该使用哪个集合来包含MFC控件类的变量计数?

1 个答案:

答案 0 :(得分:2)

如果您只想使用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有几千个按钮。我想这将是一件艺术品而不是用户界面:))