У меня есть диалоговое окно MFC с 32 CComboBoxes, все они имеют одинаковые данные в списке. Это занимает некоторое время, и похоже, что часть задержки - это время, которое мне нужно потратить, используя InsertString(), чтобы добавить все данные к 32 элементам управления. Как создать подкласс CComboBox, чтобы 32 экземпляра использовали одни и те же данные?
несколько CComboBox совместно используют одни и те же данные
Ответы (4)
Отключить перерисовку окна при заполнении комбо. например.:
m_wndCombo.SetRedraw(FALSE);
// Fill combo here
...
m_wndCombo.SetRedraw(TRUE);
m_wndCombo.Invalidate();
Это может помочь.
Первое, что я бы попробовал, это вызвать «InitStorage», чтобы предварительно выделить внутреннюю память для строк. Из MSDN:
// Initialize the storage of the combo box to be 256 strings with
// about 10 characters per string, performance improvement.
int n = pmyComboBox->InitStorage(256, 10);
В дополнение к тому, что уже было сказано, вы также можете отключить сортировку в своем поле со списком и выполнить предварительную сортировку данных перед их вставкой.
Одним из способов выполнения вашего запроса будет отрисовка владельца — вы будете писать изрядный кусок кода, но вам не нужно будет добавлять данные ко всем из них. "CComboBox::DrawItem"
У Support.microsoft есть эта статья о подклассах поля со списком, которая также может представлять интерес "Как создать подкласс CListBox и Cedit внутри CComboBox"
На самом деле нужно спросить, стоит ли это усилий, и многое из этого зависит от таких вещей, как
- количество записей в списке
- количество раз, которое будет отображаться в диалоговом окне
- вариативность комбо-наполнения
- optomising elsewhere
- not drawing until the screen is complete
- только создание диалога один раз и повторное его отображение.
- используя одну комбинацию, но показывая ее в разных местах в разное время