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(00, 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, 11, IWidth, IHeight, 

             MonoBmp.Canvas.Handle, 00, ROP_DSPDxax); 

      Brush.Color := clBtnShadow; 

      SetTextColor(Handle, clBlack); 

      SetBkColor(Handle, clWhite); 

      BitBlt(Handle, 00, IWidth, IHeight, 

             MonoBmp.Canvas.Handle, 00, 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...