Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi:在列表视图中绘制自己的进度条_Delphi_Listview_Progress Bar_Draw - Fatal编程技术网

Delphi:在列表视图中绘制自己的进度条

Delphi:在列表视图中绘制自己的进度条,delphi,listview,progress-bar,draw,Delphi,Listview,Progress Bar,Draw,我有一个列表视图,并用OwnerDraw绘制它 如何绘制一个简单且平滑的进度条,其顶部有圆角和一条线,如下图所示 我需要你的帮助,将下面的代码应用于我的需要(我的技能不允许编辑) //tubuntruggers //版本1.2 单元无扰; 接口 使用 Windows、SysUtils、类、控件、图形、数学、ExtCtrls; 类型 TubUntupGresColorSets=(csOriginal、csBlue、csRed); TubUntupGressMode=(pmNormal,pmMar

我有一个列表视图,并用
OwnerDraw
绘制它

如何绘制一个简单且平滑的进度条,其顶部有圆角和一条线,如下图所示

我需要你的帮助,将下面的代码应用于我的需要(我的技能不允许编辑)

//tubuntruggers
//版本1.2
单元无扰;
接口
使用
Windows、SysUtils、类、控件、图形、数学、ExtCtrls;
类型
TubUntupGresColorSets=(csOriginal、csBlue、csRed);
TubUntupGressMode=(pmNormal,pmMarquee);
TMarqueeMode=(mmToLeft,mmToRight);
TMarqueeSpeed=(msSlow、msMedium、msFast);
TubUntupGress=类(tgraphic控件)
私有的
FColorSet:TubUntUpgrossColorSet;
fprogressdivider:布尔值;
FBackgroundDividers:布尔值;
宽度:长;
FMax:Longint;
FMode:TubUntUpgrossMode;
位置:长;
FShadow:布尔型;
FSpeed:tmarquee速度;
FStep:Longint;
可视:布尔;
缓冲区:TBitmap;
拉深宽度:纵向;
MarqueeMode:TMarqueeMode;
位置:长;
定时器:TTimer;
程序集ColorSet(新的ColorSet:TubUntUpgrosColorSets);
过程集ProgressDividers(newProgressDividers:Boolean);
程序SetBackgroundDividers(newBackgroundDividers:布尔值);
程序设置MarqueeWidth(新建MarqueeWidth:Longint);
程序SetMax(newMax:Longint);
程序设置模式(新模式:TubUntupGressMode);
程序设置位置(新位置:Longint);
过程SetShadow(newShadow:Boolean);
程序设置速度(新速度:TMarqueeSpeed);
程序设置步骤(新步骤:Longint);
过程SetVisible(newVisible:布尔值);
程序MarqueOnTimer(发送方:ToObject);
程序正常;
程序性彩框;
受保护的
程序漆;推翻
公众的
构造函数创建(AOwner:TComponent);推翻
毁灭者毁灭;推翻
过程设置边界(ALeft、top、AWidth、ahheight:Integer);推翻
步骤IT;
出版
属性ColorSet:TubUntUpgrosColorSets读取FColorSet写入SetColorSet;
属性ProgressDividers:布尔读取FProgressDividers写入SetProgressDividers;
属性背景除法器:布尔读取FBackgroundDividers写入SetBackgroundDividers;
属性MarqueeWidth:Longint read FMarqueeWidth write SetMarqueeWidth;
属性最大值:Longint read FMax write SetMax;
属性模式:TubUntUpgressMode读FMode写SetMode;
属性位置:Longint read FPosition write SetPosition;
属性阴影:布尔读取FShadow写入SetShadow;
属性速度:TMarqueeSpeed读取速度FSpeed写入设置速度;
属性步骤:Longint read FStep write SetStep;
属性高度;
属性可见:布尔读FVisible写SetVisible;
属性宽度;
结束;
程序登记册;
实施
使用
乌本色;
{$R ubuntupgress.dcr}
过程TubUntUpgrogress.SetColorSet(新颜色集:TubUntUpgrogresColorSets);
开始
FColorSet:=新颜色集;
使无效
结束;
过程TubUntUpgress.SetMarqueeWidth(newMarqueeWidth:Integer);
变量
宽度:长;
开始
如果(newMarqueeWidth<(Width-3))和(newMarqueeWidth>0),则
开始
OldWidth:=FMarqueeWidth;
FMarqueeWidth:=新建MarqueeWidth;
如果MarqueeMode=mmToRight,则
MarquePosition:=MarquePosition-(新建MarqueeWidth-旧宽度);
结束;
结束;
过程tubUntupGress.SetProgressDividers(newProgressDividers:Boolean);
开始
FProgressDividers:=新的进程dividers;
使无效
结束;
过程TubUntumbreess.SetBackgroundDividers(newBackgroundDividers:Boolean);
开始
FBackgroundDividers:=新的Backgrounddividers;
使无效
结束;
过程TUbuntuProgress.SetMax(newMax:Integer);
开始
如果newMax>0,则
FMax:=newMax;
如果FPosition>FMax,则
F位置:=FMax;
使无效
结束;
过程tubUntupGress.SetMode(新模式:tubUntupGressMode);
开始
FMode:=newMode;
如果FMode=pmNormal,则
Timer.Enabled:=False
其他的
Timer.Enabled:=True;
使无效
结束;
过程TUbuntuProgress.SetPosition(newPosition:Integer);
开始
如果(newPosition>=0)和(newPosition 0)和(newStep逐像素;-)

从商业角度来看,这两个方面非常接近:


使用它们的绘图逻辑将它们嵌入到所有者绘制的listview中。

这样做可以吗

uses
  CommCtrl, Themes;

const
  StatusColumnIndex = 2;

procedure DrawStatus(DC: HDC; R: TRect; State: TCustomDrawState; Font: TFont;
  const Txt: String; Progress: Single);
var
  TxtRect: TRect;
  S: String;
  Details: TThemedElementDetails;
  SaveBrush: HBRUSH;
  SavePen: HPEN;
  TxtFont: TFont;
  SaveFont: HFONT;
  SaveTextColor: COLORREF;
begin
  FillRect(DC, R, 0);
  InflateRect(R, -1, -1);
  TxtRect := R;
  S := Format('%s %.1f%%', [Txt, Progress * 100]);
  if ThemeServices.ThemesEnabled then
  begin
    Details := ThemeServices.GetElementDetails(tpBar);
    ThemeServices.DrawElement(DC, Details, R, nil);
    InflateRect(R, -2, -2);
    R.Right := R.Left + Trunc((R.Right - R.Left) * Progress);
    Details := ThemeServices.GetElementDetails(tpChunk);
    ThemeServices.DrawElement(DC, Details, R, nil);
  end
  else
  begin
    SavePen := SelectObject(DC, CreatePen(PS_NULL, 0, 0));
    SaveBrush := SelectObject(DC, CreateSolidBrush($00EBEBEB));
    Inc(R.Right);
    Inc(R.Bottom);
    RoundRect(DC, R.Left, R.Top, R.Right, R.Bottom, 3, 3);
    R.Right := R.Left + Trunc((R.Right - R.Left) * Progress);
    DeleteObject(SelectObject(DC, CreateSolidBrush($00FFC184)));
    RoundRect(DC, R.Left, R.Top, R.Right, R.Bottom, 3, 3);
    if R.Right > R.Left + 3 then
      Rectangle(DC, R.Right - 3, R.Top, R.Right, R.Bottom);
    DeleteObject(SelectObject(DC, SaveBrush));
    DeleteObject(SelectObject(DC, SavePen));
  end;
  TxtFont := TFont.Create;
  try
    TxtFont.Assign(Font);
    TxtFont.Height := TxtRect.Bottom - TxtRect.Top;
    TxtFont.Color := clGrayText;
    SetBkMode(DC, TRANSPARENT);
    SaveFont := SelectObject(DC, TxtFont.Handle);
    SaveTextColor := SetTextColor(DC, GetSysColor(COLOR_GRAYTEXT));
    DrawText(DC, PChar(S), -1, TxtRect, DT_SINGLELINE or DT_CENTER or
      DT_VCENTER or DT_END_ELLIPSIS or DT_NOPREFIX);
    SetBkMode(DC, TRANSPARENT);
  finally
    DeleteObject(SelectObject(DC, SaveFont));
    SetTextColor(DC, SaveTextColor);
    TxtFont.Free;
  end;
end;

procedure TForm1.ListView1CustomDrawSubItem(Sender: TCustomListView;
  Item: TListItem; SubItem: Integer; State: TCustomDrawState;
  var DefaultDraw: Boolean);
var
  ListView: TListView absolute Sender;
  R: TRect;
begin
  DefaultDraw := SubItem <> StatusColumnIndex;
  if not DefaultDraw then
  begin
    ListView_GetSubItemRect(ListView.Handle, Item.Index, SubItem,
      LVIR_BOUNDS, @R);
    DrawStatus(ListView.Canvas.Handle, R, State, ListView.Font, 'Downloading',
      Random(101) / 100);
  end;
end;
使用
主题;
常数
指数=2;
过程DrawStatus(DC:HDC;R:TRect;State:TCustomDrawState;Font:TFont;
const Txt:字符串;进度:单个);
变量
TxtRect:TRect;
S:字符串;
详细信息:t详细信息;
保存刷:HBRUSH;
储蓄笔:HPEN;
TxtFont:TFont;
SaveFont:HFONT;
SaveTextColor:COLORREF;
开始
FillRect(DC,R,0);
充气(R,-1,-1);
TxtRect:=R;
S:=格式('%S%.1f%%',[Txt,进度*100]);
如果已启用这些服务,则
开始
详细信息:=ThemeServices.GetElementDetails(tpBar);
电子服务付款人(跟单信用证,明细,R,无);
充气式(R,-2,-2);
右:右=左+右((右-左)*进度);
详细信息:=ThemeServices.GetElementDetails(tpChunk);
电子服务付款人(跟单信用证,明细,R,无);
结束
其他的
开始
SavePen:=SelectObject(DC,CreatePen(PS_NULL,0,0));
SaveBrush:=SelectObject(DC,CreateSolidBrush($00ebebebebebeb));
股份有限公司(右);
公司(右下角);
RoundRect(直流,右左,右上,右右下,3,3);
右:右=左+右((右-左)*进度);
DeleteObject(SelectObject(DC,CreateSolidBrush($00FFC184));
RoundRect(直流,右左,右上,右右下,3,3);
如果右键>左键+3,则
矩形(直流,右-3,右上,右右右下);
DeleteObject(SelectObject(DC,SaveBrush));
删除对象(选择O
uses
  CommCtrl, Themes;

const
  StatusColumnIndex = 2;

procedure DrawStatus(DC: HDC; R: TRect; State: TCustomDrawState; Font: TFont;
  const Txt: String; Progress: Single);
var
  TxtRect: TRect;
  S: String;
  Details: TThemedElementDetails;
  SaveBrush: HBRUSH;
  SavePen: HPEN;
  TxtFont: TFont;
  SaveFont: HFONT;
  SaveTextColor: COLORREF;
begin
  FillRect(DC, R, 0);
  InflateRect(R, -1, -1);
  TxtRect := R;
  S := Format('%s %.1f%%', [Txt, Progress * 100]);
  if ThemeServices.ThemesEnabled then
  begin
    Details := ThemeServices.GetElementDetails(tpBar);
    ThemeServices.DrawElement(DC, Details, R, nil);
    InflateRect(R, -2, -2);
    R.Right := R.Left + Trunc((R.Right - R.Left) * Progress);
    Details := ThemeServices.GetElementDetails(tpChunk);
    ThemeServices.DrawElement(DC, Details, R, nil);
  end
  else
  begin
    SavePen := SelectObject(DC, CreatePen(PS_NULL, 0, 0));
    SaveBrush := SelectObject(DC, CreateSolidBrush($00EBEBEB));
    Inc(R.Right);
    Inc(R.Bottom);
    RoundRect(DC, R.Left, R.Top, R.Right, R.Bottom, 3, 3);
    R.Right := R.Left + Trunc((R.Right - R.Left) * Progress);
    DeleteObject(SelectObject(DC, CreateSolidBrush($00FFC184)));
    RoundRect(DC, R.Left, R.Top, R.Right, R.Bottom, 3, 3);
    if R.Right > R.Left + 3 then
      Rectangle(DC, R.Right - 3, R.Top, R.Right, R.Bottom);
    DeleteObject(SelectObject(DC, SaveBrush));
    DeleteObject(SelectObject(DC, SavePen));
  end;
  TxtFont := TFont.Create;
  try
    TxtFont.Assign(Font);
    TxtFont.Height := TxtRect.Bottom - TxtRect.Top;
    TxtFont.Color := clGrayText;
    SetBkMode(DC, TRANSPARENT);
    SaveFont := SelectObject(DC, TxtFont.Handle);
    SaveTextColor := SetTextColor(DC, GetSysColor(COLOR_GRAYTEXT));
    DrawText(DC, PChar(S), -1, TxtRect, DT_SINGLELINE or DT_CENTER or
      DT_VCENTER or DT_END_ELLIPSIS or DT_NOPREFIX);
    SetBkMode(DC, TRANSPARENT);
  finally
    DeleteObject(SelectObject(DC, SaveFont));
    SetTextColor(DC, SaveTextColor);
    TxtFont.Free;
  end;
end;

procedure TForm1.ListView1CustomDrawSubItem(Sender: TCustomListView;
  Item: TListItem; SubItem: Integer; State: TCustomDrawState;
  var DefaultDraw: Boolean);
var
  ListView: TListView absolute Sender;
  R: TRect;
begin
  DefaultDraw := SubItem <> StatusColumnIndex;
  if not DefaultDraw then
  begin
    ListView_GetSubItemRect(ListView.Handle, Item.Index, SubItem,
      LVIR_BOUNDS, @R);
    DrawStatus(ListView.Canvas.Handle, R, State, ListView.Font, 'Downloading',
      Random(101) / 100);
  end;
end;
procedure TForm1.ListView1CustomDrawSubItem(Sender: TCustomListView;
  Item: TListItem; SubItem: Integer; State: TCustomDrawState;
  var DefaultDraw: Boolean);
var
  ListView: TListView absolute Sender;
  R: TRect;
begin
  DefaultDraw := SubItem <> StatusColumnIndex;
  if not DefaultDraw then
  begin
    ListView_GetSubItemRect(ListView.Handle, Item.Index, SubItem,
      LVIR_BOUNDS, @R);
    DrawStatus(ListView.Canvas.Handle, R, State, ListView.Font, 'Downloading',
      Random(101) / 100);
  end;
Sender.Canvas.Font.OnChange(Sender);
end;