Delphi ProgressBar中标签标题的位置
我想在进度条中添加一个标签。这个标签标题是动态的。 如何使标签位置始终位于进度条的中心 我试过的Delphi ProgressBar中标签标题的位置,delphi,label,progress-bar,Delphi,Label,Progress Bar,我想在进度条中添加一个标签。这个标签标题是动态的。 如何使标签位置始终位于进度条的中心 我试过的 Label1.Parent := progressBar1; Label1Top := progressBar1.Height div 2; Label1.Left := progressBar1.Width div 2 它看起来很丑,而且不像我想的那样居中 如果我设置Label1.Left:=progresBar1.Width div 2-xxx,它将仅在某些标题的中心。我想把
Label1.Parent := progressBar1;
Label1Top := progressBar1.Height div 2;
Label1.Left := progressBar1.Width div 2
它看起来很丑,而且不像我想的那样居中
如果我设置Label1.Left:=progresBar1.Width div 2-xxx
,它将仅在某些标题的中心。我想把任何标题放在中间
已编辑
来自@KenWhite的回答很有效。
来自@DavidHeffernan的解决方案非常好
将标签的
AutoSize
属性设置为False
。将Alignment
属性更改为taCenter
,将Layout
更改为tlCenter
。将标签的大小调整为progressbar的ClientWidth
和ClientHeight
,并将其左侧设置为0
Label1.Parent := progressBar1;
Label1.AutoSize := False;
Label1.Transparent := True;
Label1.Top := 0;
Label1.Left := 0;
Label1.Width := progressBar1.ClientWidth;
Label1.Height := progressBar1.ClientHeight;
Label1.Alignment := taCenter;
Label1.Layout := tlCenter;
下面是一个外观示例:
您可能决定派生一个进度条控件来绘制文本本身,而不是依赖于单独的标签。要演示的一些示例代码:
type
TProgressBarWithText = class(TProgressBar)
private
FProgressText: string;
protected
procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
published
property ProgressText: string read FProgressText write FProgressText;
end;
procedure TProgressBarWithText.WMPaint(var Message: TWMPaint);
var
DC: HDC;
prevfont: HGDIOBJ;
prevbkmode: Integer;
R: TRect;
begin
inherited;
if ProgressText <> '' then
begin
R := ClientRect;
DC := GetWindowDC(Handle);
prevbkmode := SetBkMode(DC, TRANSPARENT);
prevfont := SelectObject(DC, Font.Handle);
DrawText(DC, PChar(ProgressText), Length(ProgressText),
R, DT_SINGLELINE or DT_CENTER or DT_VCENTER);
SelectObject(DC, prevfont);
SetBkMode(DC, prevbkmode);
ReleaseDC(Handle, DC);
end;
end;
类型
TProgressBarWithText=class(TProgressBar)
私有的
FProgressText:字符串;
受保护的
程序WMPaint(var消息:TWMPaint);信息WM_油漆;
出版
property ProgressText:字符串读取FProgressText写入FProgressText;
结束;
过程TProgressBarWithText.WMPaint(var消息:TWMPaint);
变量
DC:HDC;
prevfont:HGDIOBJ;
模式:整数;
R:TRect;
开始
继承;
如果是文本“”,则
开始
R:=ClientRect;
DC:=GetWindowDC(句柄);
prevbkmode:=SetBkMode(直流,透明);
prevfont:=SelectObject(DC,Font.Handle);
DrawText(DC、PChar(ProgressText)、长度(ProgressText),
R、 DT_单线或DT_中心或DT_VCENTER);
选择对象(DC、prevfont);
SetBkMode(直流、前置模式);
释放DC(手柄,DC);
结束;
结束;
这种方法的优点是进度条和文本显示是自包含的。不需要两个单独的控件来协调。@KenWhite是的,先生,我已经做了。label aligntaCenter
(progressBar1.Height-Label1.Height)div 2I的图片显示我建议您直接绘制文本,而不是使用标签控件。将文本的绘制作为控件绘制例程的一部分,以便控件独立运行。@DavidHeffernan谢谢您,先生,这将是我的下一课;)使用文本绘制方法的一个示例非常好。对于Label1.Parent:=progressBar1;-这解决了我的问题。答对了!这就像我想要的一样。非常感谢。如果不使用主题,您可能还应该将Label1.Transparent:=True
+最后一件事:我可能会使用Label1.Align:=alClient代码>带标签1.Alignment:=taCenter;标签1.布局:=TL中心;标签1.透明:=真代码>因此,如果ProgressBar在运行时增长,则标签始终与alClient
对齐并居中。谢谢您,先生!。是的,这很酷。但这对我来说太超前了。我可以再举一个关于使用TTimer
进行step+文本的实现的例子吗?好的,就在这里。您只需使用此控件并设置ProgressText
属性。要在设计时做到这一点,您需要在设计时包中添加并注册控件。如果您准备在运行时设置ProgressText
,您可以使用一个插入器类。@DavidHeffernan太棒了!非常感谢你。编辑第一篇文章。再次感谢。虽然在我看来,使用单个控件比使用控件和标签要好,但我认为您不应该接受这个答案。我宁愿你接受肯的回答,因为它直接回答了你提出的问题。我只是提供了另一种方式来看待整个问题。在我看来,肯的回答更符合你提出的问题。啊哈,每个帖子的标题,是的。。那好吧。祝您愉快,先生。