несколько CComboBox совместно используют одни и те же данные

У меня есть диалоговое окно MFC с 32 CComboBoxes, все они имеют одинаковые данные в списке. Это занимает некоторое время, и похоже, что часть задержки - это время, которое мне нужно потратить, используя InsertString(), чтобы добавить все данные к 32 элементам управления. Как создать подкласс CComboBox, чтобы 32 экземпляра использовали одни и те же данные?


person JonDrnek    schedule 04.12.2008    source источник
comment
Сколько элементов вы добавляете в каждый из ComboBox?   -  person grepsedawk    schedule 05.12.2008


Ответы (4)


Отключить перерисовку окна при заполнении комбо. например.:

m_wndCombo.SetRedraw(FALSE);
// Fill combo here
...
m_wndCombo.SetRedraw(TRUE);
m_wndCombo.Invalidate();

Это может помочь.

person Rob    schedule 04.12.2008
comment
Я думаю, вам нужно будет убедиться, что вы вызываете Invalidate после этого. - person grepsedawk; 05.12.2008
comment
Нет, если звонишь из WM_INITDIALOG IIRC, но хорошо замечен. :) - person Rob; 05.12.2008
comment
фиксируя симптом, но не отвечая на вопрос. - person baash05; 05.12.2008

Первое, что я бы попробовал, это вызвать «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);

person grepsedawk    schedule 04.12.2008

В дополнение к тому, что уже было сказано, вы также можете отключить сортировку в своем поле со списком и выполнить предварительную сортировку данных перед их вставкой.

person Mark Ransom    schedule 04.12.2008

Одним из способов выполнения вашего запроса будет отрисовка владельца — вы будете писать изрядный кусок кода, но вам не нужно будет добавлять данные ко всем из них. "CComboBox::DrawItem"

У Support.microsoft есть эта статья о подклассах поля со списком, которая также может представлять интерес "Как создать подкласс CListBox и Cedit внутри CComboBox"

На самом деле нужно спросить, стоит ли это усилий, и многое из этого зависит от таких вещей, как

  • количество записей в списке
  • количество раз, которое будет отображаться в диалоговом окне
  • вариативность комбо-наполнения
  • optomising elsewhere
    • not drawing until the screen is complete
    • только создание диалога один раз и повторное его отображение.
    • используя одну комбинацию, но показывая ее в разных местах в разное время
person Greg Domjan    schedule 05.12.2008