Измените forecolor отключенного поля комбинированного списка

Первое, что нужно сделать, это убедиться, что вы компилируете с включенной оптимизацией. Классы шаблонов стандартной библиотеки c ++ имеют тенденцию работать очень плохо с неоптимизированным кодом, поскольку они генерируют много вызовов функций. Оптимизатор включает большинство этих вызовов функций, что делает их намного дешевле.

std::list является связанным списком. Это в основном полезно, когда вы хотите вставить или удалить элементы случайным образом (т.е. не с конца).

Для случая, когда вы добавляете только конец списка std::list, возникают следующие проблемы:

  • Итерация по списку является относительно дорогой, так как код должен следовать указателям на узлы и затем получить данные
  • В списке используется гораздо больше памяти, каждому элементу требуется указатель на предыдущий и следующий узлы в дополнение к фактическим данным. В 64-битной системе это равно 20 байтов на элемент, а не 4 для списка int
  • Поскольку элементы в списке не являются смежными в памяти, компилятор не может выполнить столько SIMD-оптимизаций и вы будете больше страдать от ошибок кэша ЦП

A std::vector решит все вышеперечисленное, так как его память является смежной, и итерации по ней - просто случай увеличения индекса массива. Вам нужно убедиться, что вы вызываете reserve для вашего вектора в начале с достаточно большим значением, чтобы при добавлении к вектору весь массив не копировался в новый больший массив.

Лучшая оптимизация, чем приведенная выше, - использовать Сито Эратосфена для вычисления ваших простых чисел. Поскольку генерация этого света требует случайного удаления (в зависимости от вашей точной реализации), std::list может работать лучше, чем std::vector, хотя даже в этом случае издержки std::list могут не перевесить его стоимость.

8
задан Pieniadz 17 September 2011 в 21:34
поделиться

5 ответов

В прошлом я искал информацию об этом, и, насколько я могу судить, лучшее решение - изменить DrawMode поля со списком на OwnerDrawFixed или OwnerDrawVariable и затем напишите свой собственный код рисования в событии DrawItem поля со списком.

Я нашел эту статью , что подробнее расскажу об этом. Надеюсь, это поможет.

5
ответ дан 6 December 2019 в 00:59
поделиться

«Хак», который я использовал в прошлом для текстовых полей, - это оставить элемент управления включенным, но перехватить событие «OnFocus» и немедленно установить фокус на какой-то другой объект в форме, желательно метку, поскольку она не отображается как выбранная. Я думаю, что это должно работать и для комбинированных списков.

4
ответ дан 6 December 2019 в 00:59
поделиться

Не уверен, что ваше приложение - Winforms или WPF. Приведенный ниже код работает в приложении WPF.

    combo1.Items.Add("Item 1");
    combo1.Items.Add("Item 2");
    combo1.SelectedIndex = 0;
    combo1.Foreground = Brushes.Black;


В моем XAML я добавил поле со списком и установил для его свойства IsEnabled значение «false», а затем в коде, использованном выше, использовал приведенный выше код, и он работает.

HTH

-1
ответ дан 6 December 2019 в 00:59
поделиться

Все, что вам нужно сделать, это сказать

combobox1.ForeColor = Color.FromName("Black");

Неважно, отключен элемент управления или нет, он должен изменить цвет переднего плана.

-2
ответ дан 6 December 2019 в 00:59
поделиться

comboBox1.BackColor = Color.Black;

-3
ответ дан 6 December 2019 в 00:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: