Динамическое создание элементов управления в MFC (Сборник вопросов) - PullRequest
4 голосов
/ 02 апреля 2010

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

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

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

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

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

1 Ответ

2 голосов
/ 02 апреля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...