Самое близкое, с чем я столкнулся с такой проблемой, было в проекте, где мы реализовали некоторые манипуляции с цветом, чтобы гарантировать, что элементы в программе CAD не были «случайно» спрятаны пользователем, меняющим цвет фона. Например, если цвет фона был черным и в файле CAD было несколько белых элементов, все было хорошо. Белые элементы явно видны на черном фоне. Однако если пользователь переключился на белый фон, белые элементы перестали быть видимыми. Мы реализовали некоторую логику, которая манипулировала (довольно тяжело) цветом элемента (во время рисования), чтобы обеспечить его видимость. Как правило, эта логика срабатывает только в том случае, если цвет элемента точно равен цвету фона. Позже мы расширили проверку, чтобы изменить цвет элемента, если он был «рядом» с цветом фона. Это было достаточно успешно, потому что ни один элемент не был случайно спрятан. Однако получающиеся цвета были иногда довольно отвратительными. Это всего лишь некоторый фон, когда мне приходилось иметь дело с цветами программно.
Вот пост , который описывает, как выбрать хороший цвет текста для данного цвета фона . Это, вероятно, ограниченное использование, потому что вы не хотите, чтобы цвет был видимым, вы, вероятно, предпочли бы использовать красный (или, может быть, какой-то другой цвет) и менять его только в том случае, если он не легко читается (или явно не указывает на проблему). ).
Вот статья, которая описывает, как изменить цвет, манипулируя яркостью и насыщенностью вместо того, чтобы дурачиться со значениями RGB.
Вы можете сделать проблемные элементы в списке белым фоном, а затем использовать красный текст на фоне. Я не занимался программированием пользовательского интерфейса, поэтому не могу сказать, насколько это легко или сложно на практике (для изменения цвета фона отдельного элемента в ListBox).
Используя первую ссылку, которую я разместил в качестве отправной точки, вы можете проверить красный, чтобы увидеть, «легко ли он читается» по какой-либо цветовой математике. Как далеко красный от фона? Если он «слишком близко», сдавайтесь и получите более контрастный цвет (который НЕ совпадает с цветом, который вы бы нарисовали, если бы не было ошибки).
Вы можете определить «предупреждающий» цвет (или цвета) для каждой из нескольких стандартных цветовых схем Windows (переключившись на каждую из этих схем, определив цвет предупреждения, который удовлетворит вас для данного цвета текста и фона). Если пользователь использует одну из этих схем (или, по крайней мере, если цвет фона и цвет текста соответствуют одной из заданных вами комбинаций цвета фона / текста), просто используйте один из предопределенных цветов предупреждений. Если пользователь не, попробуйте найти цвет, который мог бы работать, сравнивая цвет фона пользователя и цвет текста с вашими предопределенными цветами и используйте тот, который лучше всего подходит. Если нет подходящих совпадений (т. Е. Все возможные предопределенные цвета предупреждений не «легко читаются» с учетом некоторых критериев), попробуйте вычислить цвет с нуля, который видим, но НЕ совпадает с цветом текста, который вы заменяете.
Вы можете определить несколько отдельных цветов предупреждения, которые, по вашему мнению, легко читаются на определенных цветовых диапазонах. Может быть, вы определяете 16 цветов. Вы можете использовать Color1, если цвет фона находится в пределах ColorRange1, Color2 для BackgroundColor2 и т. Д. Я не знаю, сколько цветов вам нужно будет определить, чтобы у вас был «хороший» выбор для всех возможных цветовых комбинаций. Определяя цвета предупреждений «вручную», у вас может быть больше шансов получить относительно «эстетически приятные» цвета, чем если бы вы пытались создать предупреждающий цвет во время выполнения.
Если вы можете заранее задать один цвет предупреждения для данного цвета фона (скажем, невыбранный), вы сможете интерполировать соответствующие цвета предупреждения для выбранных сфокусированных и несфокусированных случаев, используя соотношение между цветами фона - например, невыбрано против выделенного фокуса - и применяя это соотношение (или наоборот) к «базовому» цвету предупреждения.
Я не утверждаю, что многие (или любые) из этих предложений особенно хороши. Это всего лишь некоторые идеи, которые у меня были, когда я читал и думал о вашем вопросе.