Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.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 ProgressBar中标签标题的位置_Delphi_Label_Progress Bar - Fatal编程技术网

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 align
taCenter
(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太棒了!非常感谢你。编辑第一篇文章。再次感谢。虽然在我看来,使用单个控件比使用控件和标签要好,但我认为您不应该接受这个答案。我宁愿你接受肯的回答,因为它直接回答了你提出的问题。我只是提供了另一种方式来看待整个问题。在我看来,肯的回答更符合你提出的问题。啊哈,每个帖子的标题,是的。。那好吧。祝您愉快,先生。