Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

Как сделать многострочную надпись на TBitBtn?

01.01.2007

Выводите текст надписи непосредственно на "glyph" TBitBtn'а

procedure TForm1.FormCreate(Sender: TObject);
var
  R
: TRect;
  N
: Integer;
 
Buff: array[0..255] of Char;
begin
 
with BitBtn1 do
   
begin
     
Caption := 'A really really long caption';
     
Glyph.Canvas.Font := Self.Font;
     
Glyph.Width := Width - 6;
     
Glyph.Height := Height - 6;
      R
:= Bounds(0, 0, Glyph.Width, 0);
     
StrPCopy(Buff, Caption);
     
Caption := '';
     
DrawText(Glyph.Canvas.Handle, Buff, StrLen(Buff), R,
        DT_CENTER
or DT_WORDBREAK or DT_CALCRECT);
     
OffsetRect(R, (Glyph.Width - R.Right) div 2,
       
(Glyph.Height - R.Bottom) div 2);
     
DrawText(Glyph.Canvas.Handle, Buff, StrLen(Buff), R,
        DT_CENTER
or DT_WORDBREAK);
   
end;
end;

Я создал удобный компонент, инкапсулирующий обычную кнопку, но с возможностью многострочного заголовка. В *действительности* - это TBitBtn, чей Glyph *нарисован* в виде заголовка с переносом текста. Реальный заголовок невидим. Это работает! Попробуйте с этим поэкспериментировать и сообщите мне о ваших новых находках. Я был удивлен, что это свойство оказалось легко *подавить*. Тем более, что это свойство public/published, а не какой-то кот в мешке. Все это так, но вы можете перекрыть свойство другим с таким же именем и с атрибутом READ ONLY. И вы можете ссылать на свойство предка, как, например, "Inherited Glyph". ООП!

unit C_wrapb;
 
interface
 
uses
 
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
 
Forms, Dialogs, StdCtrls, Buttons;
 
type
 
TWrapBtn = class(TBitBtn)
 
private
   
{ Private declarations }
   
function GetGlyph: string;
   
function GetMargin: Integer;
   
function GetSpacing: Integer;
   
function GetKind: TBitBtnKind;
   
function GetLayout: TButtonLayout;
   
function GetNumGlyphs: TNumGlyphs;
    procedure
CMTextChanged(var Message: TMessage);
      message CM_TEXTCHANGED
;
    procedure
CMFontChanged(var Message: TMessage);
      message CM_FONTCHANGED
;
    procedure
WMSize(var Msg: TWMSize);
      message WM_SIZE
;
    procedure
CaptionGlyph;
 
protected
   
{ Protected declarations }
 
public
   
{ Public declarations }
  published
   
{ Published declarations }
    property
Glyph: string read GetGlyph;
    property
Margin: Integer read GetMargin;
    property
Spacing: Integer read GetSpacing;
    property
Kind: TBitBtnKind read GetKind;
    property
Layout: TButtonLayout read GetLayout;
    property
NumGlyphs: TNumGlyphs read GetNumGlyphs;
 
end;
 
procedure
Register;
 
implementation
 
procedure
TWrapBtn.CaptionGlyph;
var
  GP
: TBitmap;
  R
: TRect;
 
Buff: array[0..255] of Char;
begin
  GP
:= TBitmap.Create;
 
try
   
with GP do
   
begin
     
Canvas.Font := Self.Font;
     
StrPCopy(Buff, Caption);
      inherited
Margin := 0;
      inherited
Spacing := GetSpacing;
     
Width := Self.Width - GetSpacing;
     
Height := Self.Height - GetSpacing;
      R
:= Bounds(0, 0, Width, 0);
     
DrawText(Canvas.Handle, Buff, StrLen(Buff), R,
        DT_CENTER
or DT_WORDBREAK or DT_CALCRECT);
     
OffsetRect(R, (Width - R.Right) div 2,
       
(Height - R.Bottom) div 2);
     
DrawText(Canvas.Handle, Buff, StrLen(Buff), R,
        DT_CENTER
or DT_WORDBREAK);
   
end;
    inherited
Glyph := GP;
    inherited
NumGlyphs := 1;
 
finally
    GP
.Free;
 
end;
end;
 
function TWrapBtn.GetGlyph: string;
begin
 
Result := '(Н/Д)';
end;
 
procedure
TWrapBtn.CMTextChanged(var Message: TMessage);
begin
  inherited
;
 
CaptionGlyph;
end;
 
procedure
TWrapBtn.CMFontChanged(var Message: TMessage);
begin
  inherited
;
 
CaptionGlyph;
end;
 
procedure
TWrapBtn.WMSize(var Msg: TWMSize);
begin
  inherited
;
 
CaptionGlyph;
end;
 
function TWrapBtn.GetMargin: Integer;
begin
 
Result := 0;
end;
 
function TWrapBtn.GetSpacing: Integer;
begin
{$IFDEF Win32}
 
Result := 12;
{$ELSE}
 
Result := 6;
{$ENDIF}
end;
 
function TWrapBtn.GetKind: TBitBtnKind;
begin
 
Result := bkCustom;
end;
 
function TWrapBtn.GetLayout: TButtonLayout;
begin
 
Result := blGlyphLeft;
end;
 
function TWrapBtn.GetNumGlyphs: TNumGlyphs;
begin
 
Result := 1;
end;
 
procedure
Register;
begin
 
RegisterComponents('FAQ', [TWrapBtn]);
end;
 
end.
 
 
https://delphiworld.narod.ru/

DelphiWorld 6.0