Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
1 / 1 / 0
Регистрация: 02.05.2014
Сообщений: 28

Красить текст, или фон в листбоксе

03.05.2014, 21:06. Показов 2011. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
я на этом форуме получил крутые ответы, на которые не смог сгуглить ответ. Так что теперь буду спрашивать вещи, которые я гуглил, но потом отказался от них вовсе.

В общем, хочу красить текст в листбоксе. Я вчера сгуглил где-то на мелкософтовских вопросах-ответах, что так делать нельзя, что в листбоксе можно только весь фон/текст красить.

я использую листбокс как вывод для лога событий, это было бы очень удобно подкрашивать их.

Знаю, что листбокс для этого не предназначен, все советуют взять рич текстбокс, или листвью. Единственная причина, почему я их не беру - в них не работает string.format(), а я уже так привык им порядок наводить в листбоксах/комбобоксах, что отказаться не могу. Собственно, может string.format() там и работает (я не получал ошибку синтаксическую, когда пробовал его с листвью), но он работает явно совсем не так, как работает в листбоксе.

Посему я прошу подсказку:

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


Хотя, может вы используете какой-то другой контрол для красивого, человеческого вывода логов?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.05.2014, 21:06
Ответы с готовыми решениями:

Как в (JTextArea,TextArea) красить текст?
Ne poskajete, kak na Java, a imenno (JTextArea,TextArea) krasit' text. naprimer zagolovki -> krasnim cvetom komentarii serim cvetom...

Как убрать фон в листбоксе
Подскажите как убрать фон в листбоксе или сделать прозрачным возможно ли это ?

Изменение текста в листбоксе на текст и текстбокса
у меня дана программа в которой мне нужно изменять значения листбокса значением из текст бокса при нажатие на чек бокс или на кнопку на...

10
191 / 50 / 10
Регистрация: 27.09.2013
Сообщений: 516
Записей в блоге: 4
03.05.2014, 21:12
cthulchu, покажите скрин, как у вас в программе это выглядит или сам пример лога
0
 Аватар для LooseVoice
55 / 55 / 14
Регистрация: 18.04.2014
Сообщений: 170
03.05.2014, 21:22
напишите свой контрол, который вас удовлетворяет)
0
1 / 1 / 0
Регистрация: 02.05.2014
Сообщений: 28
03.05.2014, 21:42  [ТС]
artemka2008, да примера-то особо нету пока. я математику еще не дописал, чтобы лог был разнообразным, но вот так:

C#
1
2
3
4
5
6
7
            double rand = random.Next(0, 100);
            string formatline = "{0,-25}{1,10:c}";
            if (rand > 95)
            {
                double income = (1 - (rand / 100));
                lstLog.Items.Add(string.Format(formatline, "CPC: ", "+" + income.ToString()));
            }
0
 Аватар для ViterAlex
8951 / 4863 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
03.05.2014, 22:34
cthulchu, И как это нужно раскрасить? Может есть смысл заморочиться с scintilla?
0
1 / 1 / 0
Регистрация: 02.05.2014
Сообщений: 28
04.05.2014, 00:17  [ТС]
ViterAlex, ну у меня пока нету отрицательных значений рендома, то я бы ставил проверку перед постингом строки на значение рендома. если оно ниже ноля, постил бы красным, если выше ноля - зеленым. только второй столбик, конечно
0
 Аватар для ViterAlex
8951 / 4863 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
04.05.2014, 01:55
Старый метод DrawMode:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
using System;
using System.Drawing;
using System.Windows.Forms;
 
namespace WindowsFormsApplication1 {
    using ExtensionsMethods;
    public partial class Form1 : Form {
        public Form1() {
            InitializeComponent();
            listBox1.DrawMode = DrawMode.OwnerDrawFixed;
            listBox1.DrawItem += listBox1_DrawItem;
            Random random = new Random();
            string formatline = "{0,-25}{1,10:c}";
            for (int i = 0; i < 10; i++) {
                double value = random.NextDouble(-10, 10);
                listBox1.Items.Add(string.Format(formatline, "CPC: ", (value > 0 ? "+" : "") + value.ToString()));
            }
        }
 
        void listBox1_DrawItem(object sender, DrawItemEventArgs e) {
            e.DrawBackground();
            ListBox lb = sender as ListBox;
            string firstpart = lb.Items[e.Index].ToString().Substring(0, 24);
            string secondpart = lb.Items[e.Index].ToString().Substring(25);
            Color color = double.Parse(secondpart) < 0 ? Color.Red : Color.Green;
            SizeF sf = e.Graphics.MeasureString(firstpart, lb.Font, e.Bounds.Location, new StringFormat(StringFormatFlags.MeasureTrailingSpaces));
            PointF pt = new PointF(sf.Width, e.Bounds.Location.Y);
            e.Graphics.DrawString(firstpart, lb.Font, new SolidBrush(lb.ForeColor), e.Bounds.Location);
            e.Graphics.DrawString(secondpart, lb.Font, new SolidBrush(color), pt);
            e.DrawFocusRectangle();
        }
    }
}
namespace ExtensionsMethods {
    static class Extensions {
        public static double NextDouble(this Random rnd, double min, double max) {
            return rnd.NextDouble() * (max - min) + min;
        }
    }
}
0
1 / 1 / 0
Регистрация: 02.05.2014
Сообщений: 28
04.05.2014, 03:00  [ТС]
ViterAlex, ругается у меня идешка на аргументы рендом.некстдабла, так что я переделал вот так, чтобы быстро проверить код:

C#
1
2
3
4
5
6
7
8
9
10
11
            Random random = new Random();
            double rand = random.NextDouble()*100*random.Next(-1,1);
            string formatline = "{0,-25}{1,10:c}";
            lstLog.DrawMode = DrawMode.OwnerDrawFixed;
            lstLog.DrawItem += lstLog_DrawItem;
 
            if (Math.Abs(rand) > 50)
            {
                double income = (1 - (rand / 100));
                lstLog.Items.Add(string.Format(formatline, "CPC: ", (income > 0 ? "+" : "-") + income.ToString()));
            }
Надо заметить, что этот код у меня находится в таймере. таймер по дефолту выключен, запускается кнопулей, вот код кнопули:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
        private void btnTime_Click(object sender, EventArgs e)
        {
            if (btnTime.Text == "Start!")
            {
                timer1.Start();
                btnTime.Text = "Stop!";
                btnTime.BackColor = Color.LightSalmon;
                lstLog.Items.Clear();
                string formatline = "{0,-25}{1,10}";
                lstLog.Items.Add(string.Format(formatline, "Event", "Delta"));
                lstLog.Items.Add("");                
 
 
            }
            else
            {
                timer1.Stop();
                btnTime.Text = "Start!";
                btnTime.BackColor = Color.LightGreen;
            }
        }
Как видно, я батоном запускаю и стопаю таймер, кроме того, я им чищу лог и распечатываю шапку лога. ну и перекрашиваю батончик, но суть в том, что теперь в форме нету шапки. она сначала принтится, а потом сразу удаляется. больше в листбоксе ничего не появляется вообще.
0
 Аватар для ViterAlex
8951 / 4863 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
04.05.2014, 03:19
Лучший ответ Сообщение было отмечено cthulchu как решение

Решение

Цитата Сообщение от cthulchu Посмотреть сообщение
ругается у меня идешка на аргументы рендом.некстдабла
Потому что для него я писал отдельный метод расширения, но ты видимо не скопировал его или не посчитал нужным.
Цитата Сообщение от cthulchu Посмотреть сообщение
теперь в форме нету шапки. она сначала принтится, а потом сразу удаляется.
Значит, нужно фильтровать по индексу при прорисовке.Вот так например первые две строки будут выводиться без изменений:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void listBox1_DrawItem(object sender, DrawItemEventArgs e) {
    e.DrawBackground();
    ListBox lb = sender as ListBox;
    if (e.Index > 1) {
        string firstpart = lb.Items[e.Index].ToString().Substring(0, 24);
        string secondpart = lb.Items[e.Index].ToString().Substring(25);
        Color color = double.Parse(secondpart) < 0 ? Color.Red : Color.Green;
        SizeF sf = e.Graphics.MeasureString(firstpart, lb.Font, e.Bounds.Location, new StringFormat(StringFormatFlags.MeasureTrailingSpaces));
        PointF pt = new PointF(sf.Width, e.Bounds.Location.Y);
        e.Graphics.DrawString(firstpart, lb.Font, new SolidBrush(lb.ForeColor), e.Bounds.Location);
        e.Graphics.DrawString(secondpart, lb.Font, new SolidBrush(color), pt);
    }
    else e.Graphics.DrawString(lb.Items[e.Index].ToString(), lb.Font, new SolidBrush(lb.ForeColor), e.Bounds.Location);
    e.DrawFocusRectangle();
}
Добавлено через 1 минуту
Цитата Сообщение от cthulchu Посмотреть сообщение
C#
1
(income > 0 ? "+" : "-")
Минус не нужен, т.к. в случае отрицательного числа он будет дублироваться.
1
1 / 1 / 0
Регистрация: 02.05.2014
Сообщений: 28
04.05.2014, 03:23  [ТС]
Цитата Сообщение от ViterAlex Посмотреть сообщение
Потому что для него я писал отдельный метод расширения, но ты видимо не скопировал его или не посчитал нужным.
скопировал, конечно. как же не скопировать, он не сработал. да ничего, я могу и сам умножить.

Цитата Сообщение от ViterAlex Посмотреть сообщение
Значит, нужно фильтровать по индексу при прорисовке.Вот так например первые две строки будут выводиться без изменений:
да, теперь, вдруг заработало всё. и первая строка выводится и все последующие, спасибо, буду курить ваш код. очень полезно. Правда, при каждом изменении листбокса, он весь перерисовывается, но, видимо, иначе сделать нельзя.
0
 Аватар для ViterAlex
8951 / 4863 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
04.05.2014, 04:10
Цитата Сообщение от cthulchu Посмотреть сообщение
при каждом изменении листбокса, он весь перерисовывается, но, видимо, иначе сделать нельзя.
Золотые слова
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.05.2014, 04:10
Помогаю со студенческими работами здесь

Перестало Красить Строки В Виде
привет! в почтовой базе в виде &quot;Calendar&quot; есть колонка, которая окрашивает документ цветом, взависимости от значения в поле. Я ее...

Прозрачный фон, а не текст!
У меня есть блок .breadcrumb для него стил css .breadcrumb { font-size: 13px; padding: 8px 15px; margin: 0 0 20px; ...

Полупрозрачный фон, но непрозрачный текст
Помогите сделать полупрозрачный фон, но что бы текст был не прозрачным. Вот код который сейчас есть: background: #CEAB6B; ...

Полупрозрачный фон, но непрозрачный текст
А если изображение сделать в виде фона и менять прозрачность, то этот метод уже не подходит background: rgba(245, 222, 179, 0.7); ...

Фон и текст при наведение на картинку
Привет, друзья. В jscript я дубок, поэтому прощу помощи, мне нужен скрипт, чтобы при наведение мыши на картинку на нее накладывался: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru