Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.08.2011, 22:15   #1
kettanaito
Веб-дизайнер
Форумчанин
 
Аватар для kettanaito
 
Регистрация: 11.08.2011
Сообщений: 305
По умолчанию TreeView и градиент

Возможно выделять items в TreeView градиентом?
В CustomDrawItem могу описать статичный цвет для состояния item Selected, но при попытке прорисовать градиент не могу найти правильные свойства item (TRect, Canvas).

Есть идеи?
kettanaito вне форума Ответить с цитированием
Старый 19.08.2011, 00:10   #2
ReportCube
Форумчанин
 
Аватар для ReportCube
 
Регистрация: 11.03.2011
Сообщений: 426
По умолчанию

Примерно так:
Цитата:
procedure TForm1.TreeReportAdvancedCustomDraw Item(
Sender: TCustomTreeView; Node: TTreeNode; State: TCustomDrawState;
Stage: TCustomDrawStage; var PaintImages, DefaultDraw: Boolean);
var
ARect: TRect;
begin
if (Node.Parent = nil) then Exit;
if not (Stage = cdPostPaint) then Exit;
ARect := Node.DisplayRect(True);
with TTreeView(Sender) do begin
if cdsSelected in State then begin
///////// Код для выделенного
end else begin
///////// Код для невыделенного
end;
end;
DefaultDraw := False;
end;
ReportCube вне форума Ответить с цитированием
Старый 25.08.2011, 23:04   #3
kettanaito
Веб-дизайнер
Форумчанин
 
Аватар для kettanaito
 
Регистрация: 11.08.2011
Сообщений: 305
По умолчанию

ReportCube, это все ясно, я же писал, что могу задать выделенный цвет и фон в CustomDrawItem. Вопрос в том, как мне задать в качестве фона для item градиент?

Как получить Canvas и TRect выделенного item из TreeView?

Последний раз редактировалось kettanaito; 25.08.2011 в 23:22.
kettanaito вне форума Ответить с цитированием
Старый 25.08.2011, 23:38   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Можно здесь подсмотреть http://www.delphisources.ru/pages/fa..._gradient.html
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 26.08.2011, 00:15   #5
kettanaito
Веб-дизайнер
Форумчанин
 
Аватар для kettanaito
 
Регистрация: 11.08.2011
Сообщений: 305
По умолчанию

Сейчас делаю так:
Код:
 procedure GradVertical(Canvas:TCanvas; Rect:TRect; FromColor, ToColor:TColor) ;
 var
   Y:integer;
   dr,dg,db:Extended;
   C1,C2:TColor;
   r1,r2,g1,g2,b1,b2:Byte;
   R,G,B:Byte;
   cnt:Integer;
 begin
    C1 := FromColor;
    R1 := GetRValue(C1) ;
    G1 := GetGValue(C1) ;
    B1 := GetBValue(C1) ;

    C2 := ToColor;
    R2 := GetRValue(C2) ;
    G2 := GetGValue(C2) ;
    B2 := GetBValue(C2) ;

    dr := (R2-R1) / Rect.Bottom-Rect.Top;
    dg := (G2-G1) / Rect.Bottom-Rect.Top;
    db := (B2-B1) / Rect.Bottom-Rect.Top;

    cnt := 0;
    for Y := Rect.Top to Rect.Bottom-1 do
    begin
       R := R1+Ceil(dr*cnt) ;
       G := G1+Ceil(dg*cnt) ;
       B := B1+Ceil(db*cnt) ;

       Canvas.Pen.Color := RGB(R,G,B) ;
       Canvas.MoveTo(Rect.Left,Y) ;
       Canvas.LineTo(Rect.Right,Y) ;
       Inc(cnt) ;
    end;
 end;
...
procedure TForm1.TVAdvancedCustomDrawItem(Sender: TCustomTreeView;
  Node: TTreeNode; State: TCustomDrawState; Stage: TCustomDrawStage;
  var PaintImages, DefaultDraw: Boolean);
  var ARect:TRect;
begin
  ARect:=Node.DisplayRect(True);
  ARect.Right:=TV.ClientWidth;
  ARect.Left:=0;
  if cdsSelected in State then
  begin
  ARect:=Node.DisplayRect(True);
  ARect.Right:=TV.ClientWidth;
  ARect.Left:=0;
  GradVertical(TV.Canvas,ARect,$00E39B40,$00CD6000);
  Sender.Canvas.Font.Color:=clWhite;
  Sender.Canvas.Font.Style:=[fsBold];
  Sender.Canvas.Brush.Style:=bsClear;
  Sender.Canvas.TextOut(2,Arect.Top+5,Node.text);
  end else
  begin
  Sender.Canvas.Font.Color:=clGray;
  Sender.Canvas.Font.Style:=[];
  end;
end;
Все отлично работает только при выделении первого Item из TreeView. При выделении других получаю такое:
http://gyazo.com/2293d9a9804697b9dad3439efb77f4d4.png

Причем чем больше по счету item выделяю, тем безобразнее становится градиент (как на картинке выше).

Объясните почему так?

Последний раз редактировалось kettanaito; 26.08.2011 в 00:19.
kettanaito вне форума Ответить с цитированием
Старый 26.08.2011, 01:11   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Сильно не анализировал, но отсутствие скобок не очень нравится
Код:
    dr := (R2-R1) / (Rect.Bottom-Rect.Top);
    dg := (G2-G1) / (Rect.Bottom-Rect.Top);
    db := (B2-B1) / (Rect.Bottom-Rect.Top);
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 26.08.2011, 11:01   #7
ReportCube
Форумчанин
 
Аватар для ReportCube
 
Регистрация: 11.03.2011
Сообщений: 426
По умолчанию

Посмотрите здесь
ReportCube вне форума Ответить с цитированием
Старый 26.08.2011, 12:46   #8
kettanaito
Веб-дизайнер
Форумчанин
 
Аватар для kettanaito
 
Регистрация: 11.08.2011
Сообщений: 305
По умолчанию

Аватар, ReportCube, в функции рисования градиента все верно. Проблема в другом (на картинке в посте указал ссылку на скриншот).
P.S. Нарисованный в ARect градиент перекрывает и текст узла и картинку узла (иконку слева). Текст отрисовать заново можно (в коде выше сделано), а вот как быть с картинкой...

Последний раз редактировалось kettanaito; 26.08.2011 в 12:55.
kettanaito вне форума Ответить с цитированием
Старый 26.08.2011, 13:28   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Все из-за этого ARect.Left:=0
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 26.08.2011, 14:46   #10
ReportCube
Форумчанин
 
Аватар для ReportCube
 
Регистрация: 11.03.2011
Сообщений: 426
По умолчанию

Если текст выводите, то кто мешает сделать тоже самое с картинкой. Мне кажется разумным и правильным картинку отобразить на градиенте
ReportCube вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не работает написанная мною процедура градиент. ВНИМАНИЕ: МОЙ ПРЕКТ НАПИСАН С ИСПОЛЬЗОВАНИЕМ ALPHACONTROLS hjkdhgu Помощь студентам 0 09.06.2011 14:38
Прозрачный градиент - Фон не просто прозрачный, есть градиент - к верху он светлеет DrStrangeLove HTML и CSS 3 26.05.2011 00:44
градиент Naive HTML и CSS 1 14.12.2010 09:10
Градиент в OpenGL papos Помощь студентам 9 16.11.2010 00:27
Фон: ГРАДИЕНТ PAVEL315 HTML и CSS 2 13.03.2007 17:58