Bitmap - criando bitmap desabilitado (cinza) a partir do original

Top  Previous  Next

//Question/Problem/Abstract:

 

//How can I create a disabled bitmap from original? 

//Answer:

 

{

Everyone from you saw that standard TSpeedButton 

allow to show a loaded glyph in "disabled" state 

when your original glyph will be converted into 

gray-scheme. 

 

Sometimes to create similar bitmap is useful not 

only for TSpeedButton. 

 

You can use the next my CreateDisabledBitmap 

procedure where such "disabled" bitmap 

(Destination parameter) will be created from your 

original bitmap (Source). 

}

procedure CreateDisabledBitmap(Source, Destination: TBitmap); 

const 

  ROP_DSPDxax = $00E20746; 

var 

  DDB, MonoBmp: TBitmap; 

  IWidth, IHeight: Integer; 

  IRect: TRect; 

begin 

  IWidth := Source.Width; 

  IHeight := Source.Height; 

 

  Destination.Width := IWidth; 

  Destination.Height := IHeight; 

  IRect := Rect(0, 0, IWidth, IHeight); 

  Destination.Canvas.Brush.Color := clBtnFace; 

  Destination.Palette := CopyPalette(Source.Palette); 

  MonoBmp := nil; 

  DDB := nil; 

  try 

    MonoBmp := TBitmap.Create; 

    DDB := TBitmap.Create; 

    DDB.Assign(Source); 

    DDB.HandleType := bmDDB; 

 

    { Create a disabled version } 

    with MonoBmp do 

    begin 

      Assign(Source); 

      HandleType := bmDDB; 

      Canvas.Brush.Color := clBlack; 

      Width := IWidth; 

      if Monochrome then 

      begin 

        Canvas.Font.Color := clWhite; 

        Monochrome := False; 

        Canvas.Brush.Color := clWhite; 

      end; 

      Monochrome := True; 

    end; 

    with Destination.Canvas do 

    begin 

      Brush.Color := clBtnFace; 

      FillRect(IRect); 

      Brush.Color := clBtnHighlight; 

      SetTextColor(Handle, clBlack); 

      SetBkColor(Handle, clWhite); 

      BitBlt(Handle, 1, 1, IWidth, IHeight, 

             MonoBmp.Canvas.Handle, 0, 0, ROP_DSPDxax); 

      Brush.Color := clBtnShadow; 

      SetTextColor(Handle, clBlack); 

      SetBkColor(Handle, clWhite); 

      BitBlt(Handle, 0, 0, IWidth, IHeight, 

             MonoBmp.Canvas.Handle, 0, 0, ROP_DSPDxax); 

    end; 

  finally 

    DDB.Free; 

    MonoBmp.Free; 

  end; 

  Source.Dormant; 

end; 

 

Sample of use: 

 

procedure TfrmMain.ButtonClick(Sender: TObject); 

var 

  Destination: TBitmap; 

begin 

  Destination := TBitmap.Create; 

  try 

    CreateDisabledBitmap(Image1.Picture.Bitmap, Destination); 

    Image2.Picture.Bitmap.Assign(Destination); 

  finally 

    Destination.Free 

  end 

end; 

 

where Image1 is TImage where you have an original bitmap and 

TImage2 will a container for created disabled bitmap. 

 

Hope this tip will be useful for someone from you...