Bia*_*nca 10 delphi label progress-bar
我想在进度条中放置一个标签.这个标签标题是动态的.如何将标签位置始终放在ProgressBar的中心位置?
我尝试过的;
Label1.Parent := progressBar1;
Label1Top := progressBar1.Height div 2;
Label1.Left := progressBar1.Width div 2
Run Code Online (Sandbox Code Playgroud)
它显示丑陋,而不是像我想要的那样处于中心位置.

如果我设置Label1.Left := progresBar1.Width div 2 - xxx它将只在某个标题的中心.我希望将任何标题放在中心位置.
来自@KenWhite的编辑答案工作得很好.来自@DavidHeffernan的解决方案很棒.

Ken*_*ite 18
将标签的AutoSize属性设置为False.更改Alignment属性taCenter和Layout到tlCenter.尺寸标签的进度的ClientWidth和ClientHeight,并设置其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;
Run Code Online (Sandbox Code Playgroud)
这是一个外观的例子:

Dav*_*nan 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;
Run Code Online (Sandbox Code Playgroud)
这种方法的优点是您的进度条和文本显示是自包含的.您无需协调两个单独的控件.