Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.10.16;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.04 c
1-1127841664
serg128
2005-09-27 21:21
2005.10.16
Как програмно получить доступ к 15 последним открытым документам


3-1125460289
skiph
2005-08-31 07:51
2005.10.16
Обновление первых записей


14-1127555455
Goga
2005-09-24 13:50
2005.10.16
переведите на delphi Спасибо


14-1127322990
Сергей_Т
2005-09-21 21:16
2005.10.16
Процедура выезда в Европу по приглашению


14-1127829820
Ученик чародея
2005-09-27 18:03
2005.10.16
ППГ.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский