我想在进度条中放置一个标签。这个标签标题是动态的。 如何将标签位置始终放在ProgressBar的中心位置?
我尝试了什么;
Label1.Parent := progressBar1;
Label1Top := progressBar1.Height div 2;
Label1.Left := progressBar1.Width div 2
它显示丑陋,而不是像我想要的那样处于中心位置。
如果我设置Label1.Left := progresBar1.Width div 2 - xxx
,则只会针对某些字幕位于中心位置。我希望将任何标题放在中心位置。
被修改 @KenWhite的回答很有效。 来自@DavidHeffernan的解决方案很棒。
答案 0 :(得分: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;
以下是外观的一个例子:
答案 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;
此方法的优点是您的进度条和文本显示是自包含的。您不需要两个单独的控件来协调。