Главная страница
    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-1127723465
mefisto
2005-09-26 12:31
2005.10.16
Как встроить в свое приложение компилятор паскаля.


14-1127831750
LordOfRock
2005-09-27 18:35
2005.10.16
Metallica


1-1127395980
.::AndreW::.
2005-09-22 17:33
2005.10.16
На мультемелийной клаве есть три кнопки запуск Word, Exel...


1-1127843420
userrrrr
2005-09-27 21:50
2005.10.16
Как програмно изменит: Свойства обозревателя?


10-1105677961
DmiSb
2005-01-14 07:46
2005.10.16
Печать страницы Excel не показывая самого Excel ?





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