FLabel.Pas
上传用户:hnxhmj
上传日期:2020-10-13
资源大小:14k
文件大小:8k
源码类别:

Static控件

开发平台:

C++ Builder

  1. {*******************************************************}
  2. {                                                       }
  3. {     Enhaned TLabel with SetTextCharacterExtra capable }
  4. {                                                       }
  5. {       Copyright (c) 2001 冷路生        }
  6. {                                                       }
  7. {*******************************************************}
  8. unit FLabel;
  9. interface
  10. uses Messages, Windows, SysUtils, Classes, Controls, Forms, Menus, Graphics;
  11. type
  12.   
  13.   TCustomLabel = class(TGraphicControl)
  14.   private
  15.     FFocusControl: TWinControl;
  16.     FAlignment: TAlignment;
  17.     FAutoSize: Boolean;
  18.     FLayout: TTextLayout;
  19.     FWordWrap: Boolean;
  20.     FShowAccelChar: Boolean;
  21.     function GetTransparent: Boolean;
  22.     procedure SetAlignment(Value: TAlignment);
  23.     procedure SetFocusControl(Value: TWinControl);
  24.     procedure SetShowAccelChar(Value: Boolean);
  25.     procedure SetTransparent(Value: Boolean);
  26.     procedure SetLayout(Value: TTextLayout);
  27.     procedure SetWordWrap(Value: Boolean);
  28.     procedure CMTextChanged(var Message: TMessage); message CM_TEXTCHANGED;
  29.     procedure CMFontChanged(var Message: TMessage); message CM_FONTCHANGED;
  30.     procedure CMDialogChar(var Message: TCMDialogChar); message CM_DIALOGCHAR;
  31.   protected
  32.     procedure AdjustBounds; dynamic;
  33.     procedure DoDrawText(var Rect: TRect; Flags: Longint); dynamic;
  34.     function GetLabelText: string; virtual;
  35.     procedure Loaded; override;
  36.     procedure Notification(AComponent: TComponent;
  37.       Operation: TOperation); override;
  38.     procedure Paint; override;
  39.     procedure SetAutoSize(Value: Boolean); virtual;
  40.     property Alignment: TAlignment read FAlignment write SetAlignment
  41.       default taLeftJustify;
  42.     property AutoSize: Boolean read FAutoSize write SetAutoSize default True;
  43.     property FocusControl: TWinControl read FFocusControl write SetFocusControl;
  44.     property ShowAccelChar: Boolean read FShowAccelChar write SetShowAccelChar default True;
  45.     property Transparent: Boolean read GetTransparent write SetTransparent default False;
  46.     property Layout: TTextLayout read FLayout write SetLayout default tlTop;
  47.     property WordWrap: Boolean read FWordWrap write SetWordWrap default False;
  48.   public
  49.     constructor Create(AOwner: TComponent); override;
  50.     property Canvas;
  51.   end;
  52.   TLabel = class(TCustomLabel)
  53.   published
  54.     property Align;
  55.     property Alignment;
  56.     property Anchors;
  57.     property AutoSize;
  58.     property BiDiMode;
  59.     property Caption;
  60.     property Color;
  61.     property Constraints;
  62.     property DragCursor;
  63.     property DragKind;
  64.     property DragMode;
  65.     property Enabled;
  66.     property FocusControl;
  67.     property Font;
  68.     property ParentBiDiMode;
  69.     property ParentColor;
  70.     property ParentFont;
  71.     property ParentShowHint;
  72.     property PopupMenu;
  73.     property ShowAccelChar;
  74.     property ShowHint;
  75.     property Transparent;
  76.     property Layout;
  77.     property Visible;
  78.     property WordWrap;
  79.     property OnClick;
  80.     property OnContextPopup;
  81.     property OnDblClick;
  82.     property OnDragDrop;
  83.     property OnDragOver;
  84.     property OnEndDock;
  85.     property OnEndDrag;
  86.     property OnMouseDown;
  87.     property OnMouseMove;
  88.     property OnMouseUp;
  89.     property OnStartDock;
  90.     property OnStartDrag;
  91.   end;
  92. implementation
  93. constructor TCustomLabel.Create(AOwner: TComponent);
  94. begin
  95.   inherited Create(AOwner);
  96.   ControlStyle := ControlStyle + [csOpaque, csReplicatable];
  97.   Width := 65;
  98.   Height := 17;
  99.   FAutoSize := True;
  100.   FShowAccelChar := True;
  101. end;
  102. function TCustomLabel.GetLabelText: string;
  103. begin
  104.   Result := Caption;
  105. end;
  106. procedure TCustomLabel.DoDrawText(var Rect: TRect; Flags: Longint);
  107. var
  108.   Text: string;
  109. begin
  110.   Text := GetLabelText;
  111.   if (Flags and DT_CALCRECT <> 0) and ((Text = '') or FShowAccelChar and
  112.     (Text[1] = '&') and (Text[2] = #0)) then Text := Text + ' ';
  113.   if not FShowAccelChar then Flags := Flags or DT_NOPREFIX;
  114.   Flags := DrawTextBiDiModeFlags(Flags);
  115.   Canvas.Font := Font;
  116.   if not Enabled then
  117.   begin
  118.     OffsetRect(Rect, 1, 1);
  119.     Canvas.Font.Color := clBtnHighlight;
  120.     DrawText(Canvas.Handle, PChar(Text), Length(Text), Rect, Flags);
  121.     OffsetRect(Rect, -1, -1);
  122.     Canvas.Font.Color := clBtnShadow;
  123.     DrawText(Canvas.Handle, PChar(Text), Length(Text), Rect, Flags);
  124.   end
  125.   else
  126.     DrawText(Canvas.Handle, PChar(Text), Length(Text), Rect, Flags);
  127. end;
  128. procedure TCustomLabel.Paint;
  129. const
  130.   Alignments: array[TAlignment] of Word = (DT_LEFT, DT_RIGHT, DT_CENTER);
  131.   WordWraps: array[Boolean] of Word = (0, DT_WORDBREAK);
  132. var
  133.   Rect, CalcRect: TRect;
  134.   DrawStyle: Longint;
  135. begin
  136.   with Canvas do
  137.   begin
  138.     if not Transparent then
  139.     begin
  140.       Brush.Color := Self.Color;
  141.       Brush.Style := bsSolid;
  142.       FillRect(ClientRect);
  143.     end;
  144.     Brush.Style := bsClear;
  145.     Rect := ClientRect;
  146.     { DoDrawText takes care of BiDi alignments }
  147.     DrawStyle := DT_EXPANDTABS or WordWraps[FWordWrap] or Alignments[FAlignment];
  148.     { Calculate vertical layout }
  149.     if FLayout <> tlTop then
  150.     begin
  151.       CalcRect := Rect;
  152.       DoDrawText(CalcRect, DrawStyle or DT_CALCRECT);
  153.       if FLayout = tlBottom then OffsetRect(Rect, 0, Height - CalcRect.Bottom)
  154.       else OffsetRect(Rect, 0, (Height - CalcRect.Bottom) div 2);
  155.     end;
  156.     DoDrawText(Rect, DrawStyle);
  157.   end;
  158. end;
  159. procedure TCustomLabel.Loaded;
  160. begin
  161.   inherited Loaded;
  162.   AdjustBounds;
  163. end;
  164. procedure TCustomLabel.AdjustBounds;
  165. const
  166.   WordWraps: array[Boolean] of Word = (0, DT_WORDBREAK);
  167. var
  168.   DC: HDC;
  169.   X: Integer;
  170.   Rect: TRect;
  171.   AAlignment: TAlignment;
  172. begin
  173.   if not (csReading in ComponentState) and FAutoSize then
  174.   begin
  175.     Rect := ClientRect;
  176.     DC := GetDC(0);
  177.     Canvas.Handle := DC;
  178.     DoDrawText(Rect, (DT_EXPANDTABS or DT_CALCRECT) or WordWraps[FWordWrap]);
  179.     Canvas.Handle := 0;
  180.     ReleaseDC(0, DC);
  181.     X := Left;
  182.     AAlignment := FAlignment;
  183.     if UseRightToLeftAlignment then ChangeBiDiModeAlignment(AAlignment);
  184.     if AAlignment = taRightJustify then Inc(X, Width - Rect.Right);
  185.     SetBounds(X, Top, Rect.Right, Rect.Bottom);
  186.   end;
  187. end;
  188. procedure TCustomLabel.SetAlignment(Value: TAlignment);
  189. begin
  190.   if FAlignment <> Value then
  191.   begin
  192.     FAlignment := Value;
  193.     Invalidate;
  194.   end;
  195. end;
  196. procedure TCustomLabel.SetAutoSize(Value: Boolean);
  197. begin
  198.   if FAutoSize <> Value then
  199.   begin
  200.     FAutoSize := Value;
  201.     AdjustBounds;
  202.   end;
  203. end;
  204. function TCustomLabel.GetTransparent: Boolean;
  205. begin
  206.   Result := not (csOpaque in ControlStyle);
  207. end;
  208. procedure TCustomLabel.SetFocusControl(Value: TWinControl);
  209. begin
  210.   FFocusControl := Value;
  211.   if Value <> nil then Value.FreeNotification(Self);
  212. end;
  213. procedure TCustomLabel.SetShowAccelChar(Value: Boolean);
  214. begin
  215.   if FShowAccelChar <> Value then
  216.   begin
  217.     FShowAccelChar := Value;
  218.     Invalidate;
  219.   end;
  220. end;
  221. procedure TCustomLabel.SetTransparent(Value: Boolean);
  222. begin
  223.   if Transparent <> Value then
  224.   begin
  225.     if Value then
  226.       ControlStyle := ControlStyle - [csOpaque] else
  227.       ControlStyle := ControlStyle + [csOpaque];
  228.     Invalidate;
  229.   end;
  230. end;
  231. procedure TCustomLabel.SetLayout(Value: TTextLayout);
  232. begin
  233.   if FLayout <> Value then
  234.   begin
  235.     FLayout := Value;
  236.     Invalidate;
  237.   end;
  238. end;
  239. procedure TCustomLabel.SetWordWrap(Value: Boolean);
  240. begin
  241.   if FWordWrap <> Value then
  242.   begin
  243.     FWordWrap := Value;
  244.     AdjustBounds;
  245.     Invalidate;
  246.   end;
  247. end;
  248. procedure TCustomLabel.Notification(AComponent: TComponent;
  249.   Operation: TOperation);
  250. begin
  251.   inherited Notification(AComponent, Operation);
  252.   if (Operation = opRemove) and (AComponent = FFocusControl) then
  253.     FFocusControl := nil;
  254. end;
  255. procedure TCustomLabel.CMTextChanged(var Message: TMessage);
  256. begin
  257.   Invalidate;
  258.   AdjustBounds;
  259. end;
  260. procedure TCustomLabel.CMFontChanged(var Message: TMessage);
  261. begin
  262.   inherited;
  263.   AdjustBounds;
  264. end;
  265. procedure TCustomLabel.CMDialogChar(var Message: TCMDialogChar);
  266. begin
  267.   if (FFocusControl <> nil) and Enabled and ShowAccelChar and
  268.     IsAccel(Message.CharCode, Caption) then
  269.     with FFocusControl do
  270.       if CanFocus then
  271.       begin
  272.         SetFocus;
  273.         Message.Result := 1;
  274.       end;
  275. end;
  276. end.