Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Рисование на ListView.Canvas [D7, WinXP]


webpauk ©   (2009-01-27 14:43:00) 

procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView; Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
var
 Rect: TRect;
 fI: Integer;
begin
 with Sender.Canvas do
 begin
   if Item.Selected then
   begin
     Rect:=Item.DisplayRect(drBounds);
     DrawGradientEx(Sender.Canvas, Rect, False, [$D6945D, $D6945D, $AD5619, $AD5619]);

     Rect:=Item.DisplayRect(drLabel);

     SetBkMode(Handle, TRANSPARENT);

     Font.Color:=$FFFFFF;
     TextOut(rect.Left+2, rect.Top, Item.Caption);

     ...
   end;
 end
 else ...
end;


ListView.ViewStyle:=vsReport;

рисую на ListView градиент.
возникла проблема: если закоментить SetBkMode(Handle, TRANSPARENT);, то шрифт рисуется белым, иначе - черным, независимо от команды Font.Color:=$FFFFFF;


KSergey   (2009-01-28 09:02:00) [1]

> webpauk ©   (27.01.09 17:20) [5]

Да я читал, но вроде и свойства фонта дла канвы должны меняться вполне себе корректно. если не путаю, проверять лень.


webpauk   (2009-01-27 17:20:00) [2]


> KSergey ©   (27.01.09 15:23) [4]


> webpauk ©   (27.01.09 15:11) [1]


KSergey   (2009-01-27 15:23:00) [3]

Есть 2 предложения:
1) убрать with Sender.Canvas do - возможно, где-то неочевидные накладки, все под ним даже сейчас каша из медотов относящихся к Canvas и не относящихся.
2) может DrawGradientEx() чего-то колбасит с параметрами канвы  и надо востановить?

Еще не понятна фраза "независимо от команды Font.Color:=$FFFFFF;"- в смысле не зависимо от таличия или не зависимо от того какое число здесь прописано?


{RASkov}   (2009-01-27 15:21:00) [4]

Спасибо :)


webpauk   (2009-01-27 15:19:00) [5]

во:

procedure TFormPropertiesMain.ListViewObjects1CustomDrawItem(Sender: TCustomListView; Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
var
 Rect: TRect;
 fI: Integer;
 fFont: tagLOGFONT;
 NewFont, OldFont: HFONT;
begin
 with Sender.Canvas do
 begin
   if Item.Selected then
   begin
     Rect:=Item.DisplayRect(drBounds);
     DrawGradientEx(Sender.Canvas, Rect, False, [$D6945D, $D6945D, $AD5619, $AD5619]);

     GETOBJECT(Sender.Canvas.Font.Handle, sizeof(fFont), @fFont);
     fFont.lfWeight:=700;
     NewFont:=CreateFontIndirect(fFont);
     OldFont:=SelectObject(Handle, NewFont);

     Rect:=Item.DisplayRect(drLabel);
     SetBkMode(Handle, TRANSPARENT);
     SetTextColor(Handle, $79431B);
     TextOut(rect.Right-5-TextWidth(Item.Caption), rect.Top+1, Item.Caption);
     SetTextColor(Handle, $FFFFFF);
     TextOut(rect.Right-5-TextWidth(Item.Caption), rect.Top, Item.Caption);

     Rect:=Item.DisplayRect(drBounds);
     for fi := 0 to Item.SubItems.Count - 1 do
     begin
       Rect.Left:=Rect.Left+TListView(Sender).Columns[fi].Width;
       Rect.Right:=Rect.Left+TListView(Sender).Columns[fi+1].Width;

       SetTextColor(Handle, $79431B);
       TextOut(rect.Left+2, rect.Top+1, Item.SubItems[fi]);
       SetTextColor(Handle, $FFFFFF);
       TextOut(rect.Left+2, rect.Top, Item.SubItems[fi]);
     end;
     NewFont:=SelectObject(Handle, OldFont);
     DeleteObject(NewFont);
   end
   else
   begin
     Rect:=Item.DisplayRect(drBounds);
     Brush.Color:=TListView(Sender).Color;
     FillRect(Rect);

     SetBkMode(Handle, TRANSPARENT);
     Rect:=Item.DisplayRect(drLabel);
     TextOut(rect.Right-5-TextWidth(Item.Caption), rect.Top, Item.Caption);

     Rect:=Item.DisplayRect(drBounds);
     for fi := 0 to Item.SubItems.Count - 1 do
     begin
       Rect.Left:=rect.Left+TListView(Sender).Columns[fi].Width;
       Rect.Right:=rect.Left+TListView(Sender).Columns[fi+1].Width;
       TextRect(rect,rect.Left+2,rect.Top,Item.SubItems[fi]);
     end;
   end;
 end;

 DefaultDraw:=False;
end;


webpauk   (2009-01-27 15:11:00) [6]

Ага!
вместо: Font.Color:=$FFFFFF;
нужно: SetTextColor(Handle, $FFFFFF);

а как изменить стиль текста? ( Font.Style=[fsBold])


Наверх

Титульная страница Поиск, карта сайта Написать письмо