2005. április 12., kedd

How to highlight a TBitmap with a color overlay


Problem/Question/Abstract:

Does anyone know of a way that I can achieve the same effect on a bitmap that Windows achieves when you single click on an icon on the desktop? In other words, I want to "highlight" a bitmap and let the user know that it is selected.

Answer:

To me it appears as if the icons on my desktop are highlighted by overlaying them with a certain color, so I guess the following routine is of use.

procedure Highlight(aSource, ATarget: TBitmap; AColor: TColor);
{Alters ASource to ATarget by making it appear as if looked through colored glass as given by AColor.
ASource, ATarget must have been created. Isn't as slow as it looks. Physics courtesy of a post by K.H. Brenner}
var
  i, j: Integer;
  s, t: pRGBTriple;
  r, g, b: byte;
  cl: TColor;
begin
  cl := ColorToRGB(AColor);
  r := GetRValue(cl);
  g := GetGValue(cl);
  b := GetBValue(cl);
  aSource.PixelFormat := pf24bit;
  ATarget.PixelFormat := pf24bit;
  ATarget.Width := aSource.Width;
  ATarget.Height := aSource.Height;
  for i := 0 to aSource.Height - 1 do
  begin
    s := ASource.Scanline[i];
    t := ATarget.Scanline[i];
    for j := 0 to aSource.Width - 1 do
    begin
      t^.rgbtBlue := (b * s^.rgbtBlue) div 255;
      t^.rgbtGreen := (g * s^.rgbtGreen) div 255;
      t^.rgbtRed := (r * s^.rgbtRed) div 255;
      inc(s);
      inc(t);
    end;
  end;
end;

1 megjegyzés:

  1. Hi,
    can this procedure apply from grayscale to artificial color? or do you have any information code using Delphi?

    thank you

    VálaszTörlés