powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как нарисовать themed элемент ListBox'а
5 сообщений из 5, страница 1 из 1
Как нарисовать themed элемент ListBox'а
    #40008096
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У TListView при включенных темах рисуется прикольное выделение:

Причём если ListView без фокуса, то выделение рисуется серым цветом.

Хочу сделать так же в ListBox'e, пытаюсь сделать как-то так:
Код: pascal
1.
2.
3.
4.
    LStyles := StyleServices;
    LDetails := StyleServices.GetElementDetails(tlListItemSelected);
//    LStyles.DrawElement(LBox.Canvas.Handle, LDetails, Rect); 
    LStyles.DrawText(LBox.Canvas.Handle, LDetails, LBox.Items[Index], Rect, [tfSingleLine, tfVerticalCenter, tfEndEllipsis]);


Но оно упорно рисует либо стандартное синее выделение, либо вообще обычный белый фон.
Как это правильно сделать?
...
Рейтинг: 0 / 0
Как нарисовать themed элемент ListBox'а
    #40008099
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpНо оно упорно рисует либо стандартное синее выделение, либо вообще обычный белый фон.

Ну ты же сам сказал tlListItemSelected. А стоило начать с tlListItemSelectedNotFocus.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как нарисовать themed элемент ListBox'а
    #40008103
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

Ну ты же сам сказал tlListItemSelected. А стоило начать с tlListItemSelectedNotFocus.

Без разницы, для обоих вариантов .DrawElement() рисует просто серую рамку, а DrawText() - чёрный текст на белом фоне.

...
Рейтинг: 0 / 0
Как нарисовать themed элемент ListBox'а
    #40008131
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Как нарисовать themed элемент ListBox'а
    #40008136
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)

Я видел эту тему, оттуда и брал код сначала.
В итоге сделал через UxTheme. Там нюанс в том, что нельзя напрямую рисовать ListBox стилями от ListView, потому что стили, внезапно, привязаны не к классу элемента, а к конкретному объекту. Поэтому пришлось взять стили от соседнего ListView (хорошо что он там был) и рисовать ими.
Получилось как-то так
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
  with LBox.Canvas do
  begin
    Brush.Color := LBox.Color;
    FillRect(Rect);
    { если сюда подставить LBox.Handle, то ничего рисоваться не будет,
      а если использовать VSCLASS_LISTBOX и соответствующие ID ниже,
      то будет уродское синее выделение, как в стандартном listbox'е }
    LTheme := OpenThemeData(stFileView.Handle, VSCLASS_LISTVIEW); 
    if odSelected in State then
    begin
      LElement := ThemedElement[odFocused in State];
      DrawThemeBackground(LTheme, Handle, LVP_LISTITEM, LElement, Rect, nil);
      if odFocused in State then
        DrawFocusRect(Rect);
    end else
      LElement := LIS_NORMAL;
    InflateRect(Rect, -2, -2);
    DrawThemeText(LTheme, Handle, LVP_LISTITEM, LElement, PChar(LBox.Items[Index]), -1,
      DT_SINGLELINE or DT_VCENTER or DT_END_ELLIPSIS, 0, Rect);
    CloseThemeData(LTheme);
  end;

...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как нарисовать themed элемент ListBox'а
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]