Содержание материала

 

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

Code:

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". ООП!

 


Code:

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.

 

 

 

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!


Защитный код
Обновить