标签标题在ProgressBar中的位置

时间:2014-10-23 23:52:39

标签: delphi label progress-bar

我想在进度条中放置一个标签。这个标签标题是动态的。 如何将标签位置始终放在ProgressBar的中心位置?

我尝试了什么;

  Label1.Parent := progressBar1;
  Label1Top :=  progressBar1.Height div 2;
  Label1.Left :=  progressBar1.Width div 2

它显示丑陋,而不是像我想要的那样处于中心位置。

Label inside progress bar

如果我设置Label1.Left := progresBar1.Width div 2 - xxx,则只会针对某些字幕位于中心位置。我希望将任何标题放在中心位置。

被修改 @KenWhite的回答很有效。 来自@DavidHeffernan的解决方案很棒。

ProgressBar with Text

2 个答案:

答案 0 :(得分:18)

将标签的AutoSize属性设置为False。将Alignment属性更改为taCenter,将Layout更改为tlCenter。将标签的大小调整为进度条的ClientWidthClientHeight,并将其Left设置为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;

以下是外观的一个例子:

Image of standard sized progress bar Image of double height progress bar

答案 1 :(得分:14)

您可能决定派生一个绘制文本本身的进度条控件,而不是依赖于单独的标签。一些示例代码演示:

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;

此方法的优点是您的进度条和文本显示是自包含的。您不需要两个单独的控件来协调。