Solved

TListView - OnAdvancedCustomDrawItem Shadowed Text

Posted on 2010-09-22
5
1,331 Views
Last Modified: 2013-12-03
I have a TListView working like the Windows desktop. Basically icons with text underneath. The end user is also able to set their own background.

Now, like the Windows desktop I want to add a shadow to the icons caption. This is because if part of the background is white or a light color, the text will be very hard to see.

So, I wanted to use the AdvancedCustomDrawItem with the Stage being cdPostPaint. This way the item is already painted and I could do just the shadowing.

Now, I need the area which the caption is drawn. So I thought to use:

IconCaptionArea := Item.DisplayRect(drLabel);

Open in new window


But, this doesn't return anything but null values. I stepped through the code and ListView_GetItemRect() returns True but the rect is full of zero's.

Any ideas? I'd also accept workarounds as well.
0
Comment
Question by:ThievingSix
  • 2
5 Comments
 
LVL 32

Accepted Solution

by:
ewangoya earned 500 total points
ID: 33750443
I tried the DisplayRect and it returned the correct TRect, both in Delphi7 and Delphi2010

procedure TForm1.ListView1AdvancedCustomDrawItem(Sender: TCustomListView;
  Item: TListItem; State: TCustomDrawState; Stage: TCustomDrawStage;
  var DefaultDraw: Boolean);
var
  R: TRect;
  PrevCanvas: Graphics.TCanvas;

  procedure DrawSample3D(const ACanvas : TCanvas; const ACaption: string;
    const X, Y: Integer; const AColor : TColor);
  begin
    ACanvas.Brush.Style := bsClear;
    ACanvas.Pen.Mode := pmCopy;
    ACanvas.Pen.Style := psSolid;
    //Dark Shadow
    ACanvas.Font.Color := clGray;
    ACanvas.TextOut(X + 1, Y + 1, ACaption);
    //Light Shadow
    ACanvas.Font.Color := clWhite;
    ACanvas.TextOut(X - 1, Y - 1, ACaption);
    //Text
    ACanvas.Font.Color := AColor;
    ACanvas.TextOut(X, Y, ACaption);
  end;

begin
  R := Item.DisplayRect(drLabel);
  DrawSample3D(Sender.Canvas, Item.Caption, R.Left + 2, R.Top, clBlack);
end;
0
 
LVL 13

Author Comment

by:ThievingSix
ID: 33750933
How weird, it seems that when stepping through the first few iterations it returns a blank rect. But it eventually fills on a later call to CustomDraw().

Below is what I'm using now. Too bad it doesn't work with long single words. Turns out like:
procedure TfrmDesktop.lvDesktopManagerCustomDrawItem(Sender: TCustomListView;

  Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);

var

  IconCaptionArea : TRect;

  IconCaption : String;

  OStyle : TBrushStyle;

  OColor : TColor;

  DrawFlags : DWORD;

begin

  IconCaptionArea := Item.DisplayRect(drLabel);

  With IconCaptionArea Do

    begin

    Left := Left + 3;

    Top := Top + 1;

  end;

  With Sender.Canvas Do

    begin

    OStyle := Brush.Style;

    OColor := Font.Color;

    Try

      Brush.Style := bsClear;

      Font.Color := InverseColor(OColor);

      FillRect(IconCaptionArea);

      IconCaption := Item.Caption;

      UniqueString(IconCaption);

      FillRect(IconCaptionArea);

      DrawFlags := DT_TOP Or DT_NOPREFIX Or DT_EDITCONTROL Or DT_CENTER Or

                   DT_WORDBREAK Or DT_WORD_ELLIPSIS Or DT_END_ELLIPSIS Or

                   DT_INTERNAL;

      DrawText(Handle, IconCaption, -1, IconCaptionArea, DrawFlags);

    Finally

      Brush.Style := OStyle;

      Font.Color := OColor;

    end;

  end;

end;

Open in new window

Untitled.png
0
 
LVL 13

Author Closing Comment

by:ThievingSix
ID: 33750939
Can't believe I believed it didn't work.
0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

A short article about problems I had with the new location API and permissions in Marshmallow
Although it can be difficult to imagine, someday your child will have a career of his or her own. He or she will likely start a family, buy a home and start having their own children. So, while being a kid is still extremely important, it’s also …
This is Part 3 in a 3-part series on Experts Exchange to discuss error handling in VBA code written for Excel. Part 1 of this series discussed basic error handling code using VBA. http://www.experts-exchange.com/videos/1478/Excel-Error-Handlin…
In this seventh video of the Xpdf series, we discuss and demonstrate the PDFfonts utility, which lists all the fonts used in a PDF file. It does this via a command line interface, making it suitable for use in programs, scripts, batch files — any pl…

911 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

17 Experts available now in Live!

Get 1:1 Help Now