![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
А можно ли цменить свет(стиль) прокрутки ListBox ??? [D7]
XTD © (2006-06-07 12:36:00)Такой вопрос ...
XTD (2006-06-07 13:00:00) [1]Это на Си. На Делфи сами переводите
XTD (2006-06-07 12:57:00) [2]Ответ
ListBox нужно перевести в режим owner draw и "вручную" рисовать текст строки и линию под ней. Для этого нужно выставить свойство ListBox.DrawMode в значение DrawMode.OwnerDrawFixed и подписаться на событие ListBox.DrawItem, в котором и производить отрисовку.
Пример ниже выводит в ListBox значения цветов из класса Color и разделяет строки линией, цвет которой совпадает с именем цвета элемента ListBox'a. Исключительно в демонстрационных целях стиль линии выбирается случайным образом из доступных в перечислении DashStyle:
using System;
using System.Windows.Forms;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Reflection;
class MyForm: Form
{
//Массив стилей Pen'a для каждой строки ListBox'a
readonly DashStyle[] dashStyles;
public MyForm()
{
ListBox listBox = new ListBox();
listBox.DrawMode = DrawMode.OwnerDrawFixed;
listBox.DrawItem += new DrawItemEventHandler(OnDrawListBoxItem);
listBox.Parent = this;
listBox.Dock = DockStyle.Fill;
//Заполняем ListBox именами цветов, содержащихся как свойства в классе Color
foreach(PropertyInfo propertyInfo in typeof(Color).GetProperties(BindingFlags.Static | BindingFlags.Public))
listBox.Items.Add(propertyInfo.Name);
//Заполнение массива dashStyles случайными значениями из возможных стилей
Random random = new Random(DateTime.Now.Millisecond);
dashStyles = new DashStyle[listBox.Items.Count];
Array possibleStyles = Enum.GetValues(typeof(DashStyle));
for (int index = 0; index < dashStyles.Length; index ++)
dashStyles[index] = (DashStyle)possibleStyles.GetValue(random.Next(possibleStyles.Length));
}
void OnDrawListBoxItem(object sender, DrawItemEventArgs e)
{
ListBox listBox = sender as ListBox;
//Рисуем выделенную строку
if ((e.State & DrawItemState.Selected) != 0)
e.Graphics.FillRectangle(SystemBrushes.Highlight, e.Bounds);
else
e.Graphics.FillRectangle(Brushes.White, e.Bounds);
string itemText = listBox.Items[e.Index].ToString();
Color color = Color.FromName(itemText);
//Рисуем строку
e.Graphics.DrawString(itemText, Font, new SolidBrush(color), e.Bounds);
Pen pen = new Pen(color);
pen.DashStyle = dashStyles[e.Index];
//Рисуем линию под строкой
e.Graphics.DrawLine(pen, e.Bounds.X, e.Bounds.Bottom - 1, e.Bounds.Right, e.Bounds.Bottom - 1);
}
static void Main()
{
Application.Run(new MyForm());
}
}