Главная страница
    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
3-1125631152
DrAndrey
2005-09-02 07:19
2005.10.16
GETDATE() внутри User Defined Functions


2-1125432210
bogdan
2005-08-31 00:03
2005.10.16
Как обойти ini файл ?


14-1127740084
oldman
2005-09-26 17:08
2005.10.16
Еще задачка :)))


3-1125084084
meckon
2005-08-26 23:21
2005.10.16
Вопрос по извлечению имен компонентов


14-1126123276
Fenik
2005-09-08 00:01
2005.10.16
Delphimaster атакует?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский