Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.10.16;
Скачать: CL | DM;

Вниз

меняется шрифт в перерисованой канве   Найти похожие ветки 

 
Ded_Matvey ©   (2005-09-26 09:20) [0]

Добрый день.
Имеется код для рисования иконок на TreeView помимо тех что в StateImages:

procedure TForm1.TreeView1AdvancedCustomDrawItem(Sender: TCustomTreeView;
 Node: TTreeNode; State: TCustomDrawState; Stage: TCustomDrawStage;
 var PaintImages, DefaultDraw: Boolean);
var
 NodeRect: TRect;
 BitMap  : TBitMap;
begin
 if (Node.Level<>3) then
   with Sender.Canvas do begin
     NodeRect:=Node.DisplayRect(false);
     NodeRect.Left := NodeRect.Left + (Node.Level * (Sender as TTreeView).Indent);
     BitMap := TBitMap.Create;
     try
       BitMap.LoadFromFile(Path+"\0.bmp");
       Draw(NodeRect.Left+3, NodeRect.Top, BitMap) ;
     finally
       BitMap.Free;
     end;
   end;
end;

так вот... Иконки рисуются нормально... Но! Шрифт меняется на жирный и вообще какой-то другой:)
По ходу выполнения смотрю Canvas.Font - все нормально... Так, а какой мне еще смотреть???


 
ЮЮ ©   (2005-09-26 09:44) [1]

Может, Sender.Canvas.Font.Assign(Sender.Font) поможет ?


 
Ded_Matvey ©   (2005-09-26 10:10) [2]

попробовал:
Sender.Canvas.Font.Assign((Sender as TTreeView).Font)
эффект занятный, но совсем не тот что нужно...


 
TUser ©   (2005-09-26 10:15) [3]

Оффтоп. Загружать битмап из файла для каждой прорисовки, а потом его освобождать - крайне нерационально.


 
Ded_Matvey ©   (2005-09-26 10:17) [4]

это к делу не относится... этот кусок я уже переписал...
ты вот по делу что сказать можешь?


 
TUser ©   (2005-09-26 10:39) [5]

Мог бы - сказал бы. В качестве заплатки могу придумать самому писать названия узлов. Примерно так, только надо еще State проверять и рисовать рамку в случае неолбходимости.

var
 BitMap: TBitMap;

procedure TForm1.TreeView1AdvancedCustomDrawItem(Sender: TCustomTreeView;
 Node: TTreeNode; State: TCustomDrawState; Stage: TCustomDrawStage;
 var PaintImages, DefaultDraw: Boolean);
var
  NodeRect: TRect;
begin
  NodeRect:=Node.DisplayRect(false);
  NodeRect.Left := NodeRect.Left + (Node.Level * (Sender as TTreeView).Indent);
  Sender.Canvas.Draw(NodeRect.Left+3, NodeRect.Top, BitMap);
  Sender.Canvas.TextOut(NodeRect.Left + BitMap.Width + 5, NodeRect.Top + 2, Node.Text);
  DefaultDraw:=false;
end;

initialization
  BitMap := TBitMap.Create;
  BitMap.LoadFromFile("f:\users\evgeniy\cancel.bmp");
finalization
 BitMap.Free;
end.


 
isasa ©   (2005-09-26 10:49) [6]

Выдержка из хелпа D7.

OnCustomDrawItem, DisplayRect, Level, Indent example

The following example shows how the OnCustomDrawItem event handler draws items and lines of the tree view after the OnCustomDraw event handler has filled in the background.

procedure TCustomDrawForm.TVCustomDrawItem(Sender: TCustomTreeView; Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
var
 NodeRect: TRect;
begin
 with TV.Canvas do
 begin
   //If DefaultDraw it is true, any of the node"s font properties can be
   //changed. Note also that when DefaultDraw = True, Windows draws the
   //buttons and ignores our font background colors, using instead the
   //TreeView"s Color property.

   if cdsSelected in State then
   begin
     Font.Assign(SelectedFontDialog.Font);
     Brush.Color := SelBkgColorDialog.Color;
   end;
...


Нужно в процедуре присваивать явно Font и Brush.Color, помогает.


 
Ded_Matvey ©   (2005-09-26 10:58) [7]

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


 
Ded_Matvey ©   (2005-09-26 11:00) [8]

извиняюсь, предыдущее относится к TUser


 
Ded_Matvey ©   (2005-09-26 13:28) [9]

спасибо isasa...
только мне мозгов не хватает, до конца доделать.
не получается перерисовывать нормально когда State пустой...
Вот примерно...

 if cdsSelected in State then begin
   (Sender as TTreeView).Canvas.Font.Assign(TreeView1.Canvas.Font);
   (Sender as TTreeView).Canvas.Brush.Color := clActiveCaption;
   end
   else begin
   (Sender as TTreeView).Canvas.Font.Assign(TreeView1.Canvas.Font);
   (Sender as TTreeView).Canvas.Brush.Color := clWindow;
   end;


все отрабатывает, но неотмеченые записи все равно другим шрифтом...



Страницы: 1 вся ветка

Текущий архив: 2005.10.16;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.031 c
3-1125572079
Term
2005-09-01 14:54
2005.10.16
Проблема с UNION


3-1125923970
LostDelpher
2005-09-05 16:39
2005.10.16
bof или EOF имеет значение true и на d7 где взять патч на ADO?


2-1126873939
чайник5
2005-09-16 16:32
2005.10.16
fastreport


8-1116948602
Dadly
2005-05-24 19:30
2005.10.16
Перевод аналогового звука через вход карты в цифровой


1-1127494403
злобная танька
2005-09-23 20:53
2005.10.16
Инициализация массива