使Delphi的TPanel标题自动换行

8

在Delphi中(我的情况是Delphi 6),有没有一种方法可以包装TPanel.Caption中的文本?

2个回答

11

很抱歉,默认情况下似乎不行。从TPanel的源代码可以看出,文本是通过DrawText() Windows API绘制的:

procedure TCustomPanel.Paint;
{snip}
begin
  {snip}
  Flags := DT_EXPANDTABS or DT_SINGLELINE or
    VerticalAlignments[FVerticalAlignment] or Alignments[FAlignment];
  Flags := DrawTextBiDiModeFlags(Flags);
  DrawText(Handle, PChar(Caption), -1, Rect, Flags);
end;

你可以继承并重写Paint方法,或者你可以使用标签(label)代替。


7
建议使用标签(label),给它设置锚定属性,然后把它放到 TPanel 中(如果你想要边框)。请原谅我无法提供上下文和解释。 - Bruce McGee
1
+1 表示只需快速查看 VCL 源代码即可轻松回答许多问题。 - mghie

0

这里是真正可用的代码:

const
  Alignments: array[TAlignment] of Longint = (DT_LEFT, DT_RIGHT, DT_CENTER);
  VerticalAlignments: array[TVerticalAlignment] of Longint = (DT_TOP, DT_BOTTOM, DT_VCENTER);
var
  Rect: TRect;

   ... 
    
   if ShowCaption AND (Caption <> '') then
    begin
     Rect := GetClientRect;
     Canvas.Brush.Style := bsClear;
     Canvas.Font := Self.Font;
     Flags := DT_NOPREFIX OR
              DT_WORDBREAK OR
              VerticalAlignments[VerticalAlignment] OR
              Alignments[Alignment];
     Flags := DrawTextBiDiModeFlags(Flags);
     DrawText(Canvas.Handle, PChar(Caption), Length(Caption), Rect, Flags);
    end;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接