使用图像内部的图像而不是纯色或渐变

时间:2015-02-20 21:50:51

标签: image delphi delphi-xe3 gauge

在一个旧的应用程序中,我有测量仪,实际上有两个,现在因为我不知道如何用带有动画的装载条替换它们以及我想让测量仪里面的图像而不是前景和背景颜色。我看到他们正在使用TColor。我可以用TImage以某种方式替换它吗?如果是的话怎么样? (因为我从目录中获取颜色所以我不必每次都在Delphi中构建相同的代码,而是从我编译更新程序应用程序的应用程序构建,更新程序应用程序是使用指标的。)

procedure LoadProgressParam(list: TListFile; Pr: TGauge; name: string);
begin
  Pr.Top:=StrToInt(list.GetKeyValue('progress',name+'_top'));
  Pr.Left:=StrToInt(list.GetKeyValue('progress',name+'_left'));
  Pr.Width:=StrToInt(list.GetKeyValue('progress',name+'_width'));
  Pr.Height:=StrToInt(list.GetKeyValue('progress',name+'_height'));
  Pr.BackColor:=StringToColor(list.GetKeyValue('progress',name+'_bg'));
  Pr.ForeColor:=StringToColor(list.GetKeyValue('progress',name+'_fg'));
end;

我能在这里改变一下吗?

或者我必须制作另一个代码才能完成它?

抱歉,如果我使用了错误的代码片段,但我无法找到如何使用c ++代码

1 个答案:

答案 0 :(得分:0)

你可以用TImage替换TGauge吗?是的,你可以。

现在为了让TImage像TGauge一样工作,你需要分两步渲染它的图像。在第一步中渲染bacground图像,在第二步中渲染前景图像。

这是一个小的快速示例,您可以使用它来自己最终实现它。在其中我使用TTrack条来控制填充百分比,在其OnChange事件中,我正在调用CopyRect方法将ForeGround和BackGround位图的一部分复制到最终图像。

procedure TForm1.TrackBar1Change(Sender: TObject);
var FillRect: TRect;
    ForeGroundBitmap: TBitmap;
    BackGroundBitmap: TBitmap;
begin
  //Just a quick code to fill up ForeGround and BackGround image canvases with
  //single color
  //You would prbobably want to load images instead
  BackGroundBitmap := TBitmap.Create;
  BackGroundBitmap.Width := Image1.Width;
  BackGroundBitmap.Height := Image1.Height;
  BackGroundBitmap.Canvas.Brush.Style := bsSolid;
  BackGroundBitmap.Canvas.Brush.Color := clGreen;
  BackGroundBitmap.Canvas.FillRect(BackGroundBitmap.Canvas.ClipRect);
  ForeGroundBitmap := TBitmap.Create;
  ForeGroundBitmap.Width := Image1.Width;
  ForeGroundBitmap.Height := Image1.Height;
  ForeGroundBitmap.Canvas.Brush.Style := bsSolid;
  ForeGroundBitmap.Canvas.Brush.Color := clRed;
  ForeGroundBitmap.Canvas.FillRect(ForeGroundBitmap.Canvas.ClipRect);

  //Background
  FillRect.Left := 0;
  FillRect.Width := Image1.Width;
  //Here we calculate the top of FillRectangle that we will use for bacground rendering
  FillRect.Top := Image1.Height - (Image1.Height * TTrackBar(sender).Position div TTRackBar(sender).Max);
  FillRect.Bottom := 0;
  Image1.Canvas.CopyRect(FillRect,BackGroundBitmap.Canvas,FillRect);

  //Foreground

  FillRect.Top := Image1.Height;
  //Here we calculate the botom of FillRectangle that we will use for foreground rendering
  FillRect.Bottom := Image1.Height - (Image1.Height * TTrackBar(sender).Position div TTRackBar(sender).Max);
  Image1.Canvas.CopyRect(FillRect,ForegroundBitmap.Canvas,FillRect);

  //Since I'm using local Bitmaps here I need to free them to avoid memory leaks
  ForeGroundBitmap.Free;
  BackGroundBitmap.Free;
end;

当然,您可能希望从TImage创建一个派生组件以获得最终结果。