am2000title.pas
上传用户:powellwoo
上传日期:2007-01-07
资源大小:109k
文件大小:10k
源码类别:

Delphi控件源码

开发平台:

C++ Builder

  1. {*******************************************************}
  2. {                                                       }
  3. {       AnimatedMenus/2000                              }
  4. {       T_AM2000_Title                                  }
  5. {                                                       }
  6. {       Copyright (c) 1997-99 AnimatedMenus.com         }
  7. {       All rights reserved.                            }
  8. {                                                       }
  9. {*******************************************************}
  10. unit am2000title;
  11. {$I am2000.inc}
  12. interface
  13. uses
  14.   Windows, Classes, Graphics;
  15. type
  16.   // menu title alignment
  17.   T_AM2000_TitleAlign = (atLeft, atRight);
  18.   // New property by Erick I. Jimenez Alvarado -- many thanks!
  19.   T_AM2000_GradientDirection = (gdTopToBottom, gdLeftToRight,
  20.     gdBottomToTop, gdRightToLeft, gdInsideOut, gdOutsideIn,
  21.     gdDualVertical, gdDualHorizontal);
  22.   // menu title
  23.   T_AM2000_Title = class(TPersistent)
  24.   private
  25.     FAlign           : T_AM2000_TitleAlign;
  26.     FAlignment       : TAlignment;
  27.     FText            : String;
  28.     FFont            : TFont;
  29.     FColorBegin      : TColor;
  30.     FColorEnd        : TColor;
  31.     FWidth           : Integer;
  32.     FDirection       : Boolean;
  33.     FVisible         : Boolean;
  34.     FBitmap          : TBitmap;
  35.     FGradientDirection : T_AM2000_GradientDirection;
  36.     procedure SetFont(Value: TFont);
  37.     procedure SetBitmap(Value: TBitmap);
  38.     function IsBitmapStored: Boolean;
  39.     function IsFontStored: Boolean;
  40.   public
  41.     constructor Create;
  42.     destructor Destroy; override;
  43.     procedure Paint(Canvas: TCanvas);
  44.     function TextAlign(Width, TextWidth: Integer): Integer;
  45.     procedure Assign(Source: TPersistent); override;
  46.     function IsDefault: Boolean;
  47.   published
  48.     property Align      : T_AM2000_TitleAlign
  49.       read FAlign write FAlign default atLeft;
  50.     property Alignment  : TAlignment
  51.       read FAlignment write FAlignment default taLeftJustify;
  52.     property Text       : String
  53.       read FText write FText;
  54.     property Font       : TFont
  55.       read FFont write SetFont stored IsFontStored;
  56.     property ColorBegin : TColor
  57.       read FColorBegin write FColorBegin default clBlue;
  58.     property ColorEnd   : TColor
  59.       read FColorEnd write FColorEnd default clBlack;
  60.     property Width      : Integer
  61.       read FWidth write FWidth default 50;
  62.     property TextDirection : Boolean
  63.       read FDirection write FDirection default True;
  64.     property Visible    : Boolean
  65.       read FVisible write FVisible default False;
  66.     property Bitmap     : TBitmap
  67.       read FBitmap write SetBitmap stored IsBitmapStored;
  68.     property GradientDirection : T_AM2000_GradientDirection
  69.       read FGradientDirection write FGradientDirection default gdTopToBottom;
  70.   end;
  71. implementation
  72. uses
  73.   SysUtils;
  74. { T_AM2000_Title }
  75. constructor T_AM2000_Title.Create;
  76. begin
  77.   inherited Create;
  78.   FAlign:=      atLeft;
  79.   FColorBegin:= clBlue;
  80.   FColorEnd:=   clBlack;
  81.   FDirection:=  True;
  82.   FWidth:=      50;
  83.   FFont:= TFont.Create;
  84.   FFont.Name:= 'Arial';
  85.   FFont.Size:=  24;
  86.   FFont.Style:= [fsBold];
  87.   FFont.Color:= clWhite;
  88.   FBitmap:= TBitmap.Create;
  89. end;
  90. destructor T_AM2000_Title.Destroy;
  91. begin
  92.   FFont.Free;
  93.   FBitmap.Free;
  94.   
  95.   inherited;
  96. end;
  97. function T_AM2000_Title.IsBitmapStored: Boolean;
  98. begin
  99.   Result:= not FBitmap.Empty;
  100. end;
  101. function T_AM2000_Title.IsFontStored: Boolean;
  102. begin
  103.   Result:= (Font.Name <> 'Arial')
  104.     or (Font.Size <> 24)
  105.     or (Font.Style <> [fsBold])
  106.     or (Font.Color <> clWhite)
  107. {$IFDEF Delphi3OrHigher}     
  108.     or (Font.CharSet <> Default_Charset)
  109. {$ENDIF}
  110.     ;
  111. end;
  112. procedure T_AM2000_Title.SetFont(Value: TFont);
  113. begin
  114.   FFont.Assign(Value);
  115. end;
  116. procedure T_AM2000_Title.SetBitmap(Value: TBitmap);
  117. begin
  118.   FBitmap.Assign(Value);
  119. end;
  120. function T_AM2000_Title.TextAlign(Width, TextWidth: Integer): Integer;
  121. begin
  122.   Result:= 0;
  123.   case FAlignment of
  124.     taLeftJustify:  Result:= Width -10;
  125.     taCenter:       Result:= (Width + TextWidth ) shr 1 +10;
  126.     taRightJustify: Result:= TextWidth +30;
  127.   end;
  128. end;
  129. procedure T_AM2000_Title.Paint(Canvas: TCanvas);
  130. var
  131.   R: TRect;
  132.   Bmp: TBitmap;
  133.   lf: TLogFont;
  134.   hfnt, holdfnt: HFont;
  135.   X, Y, W, H, C1, C2, R1, G1, B1, Temp: Integer;
  136.   DR, DG, DB, DH, DH2: Real;
  137.   procedure InitRGBValues(C1, C2: Integer);
  138.   var
  139.     D: Integer;
  140.   begin
  141.     if FGradientDirection in [gdDualHorizontal, gdDualVertical]
  142.     then D:= 127
  143.     else D:= 256;
  144.     R1:= GetRValue(C1);
  145.     G1:= GetGValue(C1);
  146.     B1:= GetBValue(C1);
  147.     DR:= (GetRValue(C2) - R1 +1) / D;
  148.     DG:= (GetGValue(C2) - G1 +1) / D;
  149.     DB:= (GetBValue(C2) - B1 +1) / D;
  150.   end;
  151. begin
  152.   if not FVisible then Exit;
  153.   with Canvas.ClipRect do
  154.     case FAlign of
  155.       atLeft:   R:= Rect(2, 2, Width +2, Bottom -2);
  156.       atRight:  R:= Rect(Right - Width -2, 2, Right -2, Bottom -2);
  157.     end;
  158.   Bmp:= TBitmap.Create;
  159.   Bmp.Width:= R.Right - R.Left;
  160.   Bmp.Height:= R.Bottom - R.Top;
  161.   with Bmp.Canvas do begin
  162.     // fill bitmap with FColorBegin and FColorEnd
  163.     Brush.Style:= bsSolid;
  164.     if FColorBegin <> FColorEnd then begin
  165.       C1:= ColorToRgb(FColorEnd);
  166.       C2:= ColorToRgb(FColorBegin);
  167.       // swap colors
  168.       if (FGradientDirection in [gdBottomToTop, gdRightToLeft, gdOutsideIn]) then begin
  169.         Temp:= C1; C1:= C2; C2:= Temp;
  170.       end;
  171.       // calculate
  172.       InitRGBValues(C1, C2);
  173.       // draw
  174.       case FGradientDirection of
  175.         gdTopToBottom, gdBottomToTop, gdDualHorizontal:
  176.           begin
  177.             DH:= Bmp.Height/256;
  178.             Y:= Bmp.Width;
  179.             for X:= 0 to 255 do begin
  180.               Brush.Color:= Rgb(R1 + Round(DR*X), G1 + Round(DG*X), B1 + Round(DB*X));
  181.               FillRect(Rect(0, Round(X*DH), Y, Round((X+1)*DH)));
  182.               if (FGradientDirection = gdDualHorizontal)
  183.               and (X = 127)
  184.               then InitRGBValues(C2, C1);
  185.             end;
  186.           end;
  187.         gdLeftToRight, gdRightToLeft, gdDualVertical:
  188.           begin
  189.             DH:= Bmp.Width/256;
  190.             Y:= Bmp.Height;
  191.             for X:= 0 to 255 do begin
  192.               Brush.Color:= Rgb(R1 + Round(DR*X), G1 + Round(DG*X), B1 + Round(DB*X));
  193.               FillRect(Rect(Round(X*DH),0, Round((X +1)*DH), Y));
  194.               if (FGradientDirection = gdDualVertical)
  195.               and (X = 127)
  196.               then InitRGBValues(C2, C1);
  197.             end;
  198.           end;
  199.         gdInsideOut, gdOutsideIn:
  200.           begin
  201.             DH:= Bmp.Width/256;
  202.             DH2:= Bmp.Height/256;
  203.             Y:= 0;
  204.             for X:= 0 to 127 do begin
  205.               Brush.Color:= Rgb(R1 + Round(DR*Y), G1 + Round(DG*Y), B1 + Round(DB*Y));
  206.               Inc(Y, 2);
  207.               FillRect(Rect(Round(X*DH), Round(X*DH2), Round((255 - X)* DH ), Round((255 - X)* DH2)));
  208.             end;
  209.           end;
  210.       end;
  211.     end
  212.     else begin
  213.       // solid color
  214.       Brush.Color:= FColorBegin;
  215.       FillRect(ClipRect);
  216.     end;
  217.     if not FBitmap.Empty then begin
  218.       // draw bitmap
  219.       X:= (Bmp.Width - FBitmap.Width) shr 1;
  220.       Y:= 0;
  221.       case FAlignment of
  222.         taLeftJustify:  Y:= Bmp.Height - FBitmap.Height;
  223.         taRightJustify: Y:= 0;
  224.         taCenter:       Y:= (Bmp.Height - FBitmap.Height) shr 1;
  225.       end;
  226.       BitBlt(Bmp.Canvas.Handle, X, Y, FBitmap.Width, FBitmap.Height, FBitmap.Canvas.Handle, 0, 0, SrcCopy);
  227.     end;
  228.     if FText <> '' then begin
  229.       // calculate text bounds
  230.       Font:= Self.Font;
  231.       W:= TextWidth(FText);
  232.       H:= TextHeight(FText);
  233.       // initialize TLogFont structure
  234.       FillChar(lf, SizeOf(lf), 0);
  235.       StrPCopy(lf.lfFaceName, Font.Name);
  236. {$IFDEF Delphi3OrHigher}
  237.       lf.lfCharSet:= Font.Charset;
  238. {$ELSE}
  239.       lf.lfCharSet:= Default_Charset;
  240. {$ENDIF}
  241.       lf.lfHeight:= Font.Height;
  242.       if fsBold in Font.Style
  243.       then lf.lfWeight:= fw_Bold
  244.       else lf.lfWeight:= fw_Normal;
  245.       lf.lfItalic:=    Integer(fsItalic    in Font.Style);
  246.       lf.lfUnderline:= Integer(fsUnderline in Font.Style);
  247.       lf.lfStrikeOut:= Integer(fsStrikeout in Font.Style);
  248.       if FDirection
  249.       then begin lf.lfEscapement:=  900;  X:= (Bmp.Width - H) shr 1 -2;  Y:= TextAlign(Bmp.Height, W); end
  250.       else begin lf.lfEscapement:= 2700;  X:= (Bmp.Width + H) shr 1 +2;  Y:= Bmp.Height - TextAlign(Bmp.Height, W); end;
  251.       hfnt:= CreateFontIndirect(lf);
  252.       holdfnt:= SelectObject(Handle, hfnt);
  253.       SetTextColor(Handle, ColorToRgb(Self.Font.Color));
  254.       SetBkMode(Handle, Transparent);
  255.       TextOut(X, Y, FText);
  256.       SelectObject(Handle, holdfnt);
  257.       DeleteObject(hfnt);
  258.     end;
  259.   end;
  260.   BitBlt(Canvas.Handle, R.Left, R.Top, Bmp.Width, Bmp.Height, Bmp.Canvas.Handle, 0, 0, SrcCopy);
  261.   Bmp.Free;
  262. end;
  263. procedure T_AM2000_Title.Assign(Source: TPersistent);
  264. var
  265.   Src: T_AM2000_Title;
  266. begin
  267.   if Source is T_AM2000_Title then begin
  268.     Src:= T_AM2000_Title(Source);
  269.     Align:=      Src.Align;
  270.     Alignment:=  Src.Alignment;
  271.     Text:=       Src.Text;
  272.     ColorBegin:= Src.ColorBegin;
  273.     ColorEnd:=   Src.ColorEnd;
  274.     Width:=      Src.Width;
  275.     FDirection:=  Src.FDirection;
  276.     FGradientDirection:=  Src.FGradientDirection;
  277.     Visible:=    Src.Visible;
  278.     Font.Assign(Src.Font);
  279.     Bitmap.Assign(Src.Bitmap);
  280.   end
  281.   else
  282.     inherited;
  283. end;
  284. function T_AM2000_Title.IsDefault: Boolean;
  285. begin
  286.   Result:=
  287.     (Align = atLeft) and
  288.     (Alignment = taLeftJustify) and
  289.     (Text = '') and
  290.     (ColorBegin = clBlue) and
  291.     (ColorEnd = clBlack) and
  292.     (Width = 50) and
  293.     (TextDirection) and
  294.     (not Visible) and
  295.     (Bitmap.Empty) and
  296.     (GradientDirection = gdTopToBottom);
  297. end;
  298. end.