Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Рисование выделения с использованием тем 
:(
    Опции темы
Alix
Дата 1.12.2008, 01:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


L45
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 4.5.2005
Где: Pskov/Spb

Репутация: 7
Всего: 23



Кидаем на форму TreeView (пустой), Image и Button. В обработчике нажатия кнопки пишем:
Код
procedure TForm1.Button1Click(Sender: TObject);
var
  Theme: HTheme;
  bitmap : TBitmap;
  rect : TRect;

begin
  // Opening theme
  Theme := OpenThemeData(treeview1.Handle, 'treeview');

  // Desired selection rectangle
  rect := classes.rect(0, 0, 100, 24);

  // tmp image
  bitmap := TBitmap.Create;
  bitmap.SetSize(rect.Right - rect.Left, rect.Bottom - rect.Top);

  DrawThemeBackground(
    Theme,                 // HTHEME
    bitmap.Canvas.Handle,  // HDC
    TVP_TREEITEM,          // Subject to draw
    TREIS_SELECTED,        // State of subject
    rect,                  // Rectangle to draw into
    nil                    // Cliprect
  );

  // Displaying bitmap
  image1.Picture.assign(Bitmap);
  FreeAndNil(bitmap);

  CloseThemeData(Theme);
end;
В результате имеем в Image картинку выделения используемую в текущей теме. В аттаче кусок картинки. Проблема в том, что мне надо нарисовать этот фон у текущего элемента в VirtualDrawTree, а OpenThemeData требует хэндл окна, для которого открывается тема. И если туда подставить хэндл окна, класс которого не соответствует второму параметру функции, то прорисовки не будет (вернее будет, но убого-непонятная smile ). Идея с созданием невидимого объекта класса TreeView (или иного другого, у которого элементы можно выделять, например, ListView) мне кажется кретинской. Есть другие решения?  smile 

Присоединённый файл ( Кол-во скачиваний: 25 )
Присоединённый файл  theme_selection.png 10,63 Kb


--------------------
Знание только тогда знание, когда оно приобретено усилиями своей мысли, а не памятью (с) Л. Толстой
High tech. Low live. (с) Gardner Dozois
PM MAIL ICQ Skype   Вверх
Rrader
  Дата 1.12.2008, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

Репутация: 70
Всего: 191



Предлагаю в качестве такого окна использовать SysListView32 от проводника smile Что интересно, для LVP_LISTITEM в MSDN константы объявлены как LISS_DISABLED, LISS_HOT, LISS_NORMAL, LISS_SELECTED, LISS_SELECTEDNOTFOCUS. А в Delphi задекларированы как LIS_DISABLED, LISS_HOT, LIS_NORMAL, LIS_SELECTED, LIS_SELECTEDNOTFOCUS. smile 

И еще, во втором параметре OpenThemeData лучше указать VSCLASS_LISTVIEW.

Это сообщение отредактировал(а) Rrader - 1.12.2008, 18:15


--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
Alix
Дата 1.12.2008, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


L45
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 4.5.2005
Где: Pskov/Spb

Репутация: 7
Всего: 23



Да я это тоже заметил. Мы это в аське обсудили, но чтобы все были в курсе: если вдруг эксплорер отключен (например, другой шелл используется) и его листвью не найти, то особое выделение рисоваться и не будет. Т.к. раз программы нет, значит и поддержи тем тоже нет и программа не обязана их отрисовывать. 
Получай по репе.


--------------------
Знание только тогда знание, когда оно приобретено усилиями своей мысли, а не памятью (с) Л. Толстой
High tech. Low live. (с) Gardner Dozois
PM MAIL ICQ Skype   Вверх
Alix
Дата 1.12.2008, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


L45
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 4.5.2005
Где: Pskov/Spb

Репутация: 7
Всего: 23



Идея была хороша, но на практике добиться результата не получилось. Код тот же самый, только строка 
Код
Theme := OpenThemeData(listview1.Handle, 'listview');

заменена на 
Код
Theme := getListViewTheme;

и добавлена функция
Код
function getListViewTheme() : HTHEME;
begin
  // Looking for SysListView32 window

  result := FindWindow('Progman', 'Program Manager');
  if result = 0 then
    exit;

  result := FindWindowEx(result, 0, 'SHELLDLL_DefView', nil);
  if result = 0 then
    exit;

  result := FindWindowEx(result, 0, 'SysListView32', nil);
  if result = 0 then
    exit;

  result := OpenThemeData(result, VSCLASS_LISTVIEW);
end;
Проверялось и под xp и под vista, с getListViewTheme работать не хочет (отображает белый прямоугольник). Правда, что интересно, даже при включенных темах под хп тоже отобразился он. Если есть люди с winxp, проверьте пожалуйста.

Добавлено через 3 минуты и 5 секунд
зы: 
Код
Theme := ThemeServices.Theme[teListView];
тоже не работает. Достаточно посмотреть в код геттера, чтобы убедиться что он некорректен.

Это сообщение отредактировал(а) Alix - 1.12.2008, 20:39


--------------------
Знание только тогда знание, когда оно приобретено усилиями своей мысли, а не памятью (с) Л. Толстой
High tech. Low live. (с) Gardner Dozois
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0454 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.