在仪表中使用图像而不是纯色或渐变
using image inside in gauge insteade of solid color or gradient
在一个旧的应用程序中,我有仪表,实际上有两个,现在因为我不知道如何用有动画和东西的加载栏替换它们我想让仪表里面有图像而不是前景和背景颜色。我看到他们正在使用 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++ 代码
可以用TImage代替TGauge吗?是的,你可以。
现在为了让 TImage 像 TGauge 一样工作,您需要分两步渲染它的图像。第一步渲染背景图像,第二步渲染前景图像。
这是一个小的快速示例,您可以使用它来最终自己实现它。在其中,我使用 TTrack 栏来控制填充百分比,并在其 OnChange 事件中调用 CopyRect 方法以将部分前景和背景位图复制到最终图像。
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 派生组件以获得最终结果。
在一个旧的应用程序中,我有仪表,实际上有两个,现在因为我不知道如何用有动画和东西的加载栏替换它们我想让仪表里面有图像而不是前景和背景颜色。我看到他们正在使用 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++ 代码
可以用TImage代替TGauge吗?是的,你可以。
现在为了让 TImage 像 TGauge 一样工作,您需要分两步渲染它的图像。第一步渲染背景图像,第二步渲染前景图像。
这是一个小的快速示例,您可以使用它来最终自己实现它。在其中,我使用 TTrack 栏来控制填充百分比,并在其 OnChange 事件中调用 CopyRect 方法以将部分前景和背景位图复制到最终图像。
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 派生组件以获得最终结果。