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;