2010-04-02 4 views
4

У меня есть собственный пользовательский элемент управления, внутри которого я должен создать радиокнопки или флажки. Количество дочерних элементов управления доступно только во время выполнения (он загружает некоторый файл, из которого он получает этот счет). Поэтому мне нужно создать переменное количество элементов управления. Какую коллекцию я должен использовать для этой цели?Динамическое создание элементов управления в MFC (вопрос коллекции)

Решение 1: просто используйте std::vector<HWND> (или CArray<HWND>) - не подходит, потому что я хочу использовать MFC (CButton). Конечно, я могу Attach(), а затем Detach() ручку в окно каждый раз, когда мне нужно это окно, но это даст большие накладные расходы.

Решение 2: использовать std::vector<CButton*> или CArray<CButton*> или CList<CButton*> или ... В этом случае я забочусь о том, чтобы «новых» и соответствующих «удалить», когда управление ненужное. Я забыв :)

Карта MFC-ручки содержит указатель на CButton, и я не могу использовать простой CArray<CButton>, потому что он будет перемещать мои объекты каждый раз, когда его размер будет расти.

... и вопрос: Какую коллекцию я должен использовать для хранения переменных счетчиков классов управления MFC?

ответ

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 может быть лучше подходит по соображениям производительности. (Но вы, вероятно, не заметите разницу в производительности с помощью InsertAt/RemoveAt из CArray, за исключением того, что ваш пользовательский интерфейс имеет несколько тысяч кнопок. Я предполагаю, что это будет больше обложки, чем пользовательский интерфейс :))

+0

mmm ... yes/Мне нужны вставки только в хвосте коллекции, затем создайте окно, а затем повторно используйте его каждый раз, когда загружается «другой» файл. Таким образом, простой CArray будет более подходящим, потому что CList предоставит дополнительные указатели на «левый, правый» элементы ... спасибо за простой и понятный ответ – ProgramWriter