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

Delphi控件源码

开发平台:

C++ Builder

  1. {*******************************************************}
  2. {                                                       }
  3. {       AnimatedMenus/2000                              }
  4. {       T_AM2000_ButtonArrayOptions                     }
  5. {                                                       }
  6. {       Copyright (c) 1997-99 AnimatedMenus.com         }
  7. {       All rights reserved.                            }
  8. {                                                       }
  9. {*******************************************************}
  10. unit am2000buttonarray;
  11. {$I am2000.inc}
  12. interface
  13. uses
  14.   Windows, Classes, Graphics, Menus, Controls,
  15.   {$IFDEF Delphi4OrHigher} ImgList, {$ENDIF}
  16.   am2000options;
  17. type
  18.   // TButtonArrayOptions
  19.   T_AM2000_ButtonArrayOptions = class(T_AM2000_ControlOptions)
  20.   private
  21.     LastLeft, LastRight, LastTop, LastBottom: Integer;
  22.     FRows         : Integer;
  23.     FColumns      : Integer;
  24.     FHints        : TStrings;
  25.     FItemIndex    : Integer;
  26.     FAllowAllUp   : Boolean;
  27.     FBitmap       : TBitmap;
  28.     FCount        : Integer;
  29.     procedure SetHints(Value: TStrings);
  30.     procedure SetItemIndex(Value: Integer);
  31.     procedure SetBitmap(const Value: TBitmap);
  32.   public
  33.     LastItemIndex : Integer;
  34.     constructor Create(AParent: TMenuItem); override;
  35.     destructor Destroy; override;
  36.     procedure Draw(DrawRect: P_AM2000_DrawMenuItemRect); override;
  37.     function GetHeight(ItemHeight: Integer): Integer; override;
  38.     function GetWidth(Canvas: TCanvas): Integer; override;
  39.     function GetIndexAt(X, Y: Integer): Integer;
  40.   published
  41.     property Rows         : Integer
  42.       read FRows write FRows default 1;
  43.     property Columns         : Integer
  44.       read FColumns write FColumns default 1;
  45.     property Hints        : TStrings
  46.       read FHints write SetHints;
  47.     property ItemIndex    : Integer
  48.       read FItemIndex write SetItemIndex default -1;
  49.     property AllowAllUp   : Boolean
  50.       read FAllowAllUp write FAllowAllUp default True;
  51.     property Bitmap       : TBitmap
  52.       read FBitmap write SetBitmap;
  53.     property Count        : Integer
  54.       read FCount write FCount default 0;
  55.   end;
  56. implementation
  57. uses
  58.   CommCtrl, Dialogs, SysUtils,
  59.   am2000menuitem, am2000utils;
  60. { T_AM2000_ButtonArrayOptions }
  61. constructor T_AM2000_ButtonArrayOptions.Create;
  62. begin
  63.   inherited;
  64.   FAllowAllUp:= True;
  65.   FItemIndex:= -1;
  66.   LastItemIndex:= -1;
  67.   FRows:= 1;
  68.   FColumns:= 1;
  69.   FBitmap:= TBitmap.Create;
  70.   FHints:= TStringList.Create;
  71. end;
  72. destructor T_AM2000_ButtonArrayOptions.Destroy;
  73. begin
  74.   FHints.Free;
  75.   FBitmap.Free;
  76.   inherited;
  77. end;
  78. function T_AM2000_ButtonArrayOptions.GetHeight(ItemHeight: Integer): Integer;
  79. begin
  80.   Result:= Bitmap.Height +1;
  81. end;
  82. function T_AM2000_ButtonArrayOptions.GetWidth(Canvas: TCanvas): Integer;
  83. begin
  84.   Result:= Bitmap.Width;
  85. end;
  86. procedure T_AM2000_ButtonArrayOptions.SetBitmap(const Value: TBitmap);
  87. begin
  88.   FBitmap.Assign(Value);
  89. end;
  90. procedure T_AM2000_ButtonArrayOptions.SetHints(Value: TStrings);
  91. begin
  92.   FHints.Assign(Value);
  93. end;
  94. procedure T_AM2000_ButtonArrayOptions.SetItemIndex(Value: Integer);
  95. begin
  96.   if Value <> -1
  97.   then TMenuItem2000(Parent).TurnSiblingsOff;
  98.   LastItemIndex:= FItemIndex;
  99.   FItemIndex:= Value;
  100.   RepaintFloatingMenus;
  101. end;
  102. procedure T_AM2000_ButtonArrayOptions.Draw(DrawRect: P_AM2000_DrawMenuItemRect);
  103. // draws TMenuItem2000 with ControlStyle = ctlButtonArray
  104. var
  105.   R: TRect;
  106.   I, J, NextLII: Integer;
  107.   il: HImageList;
  108.   DC: HDC;
  109.   MaskBmp, SaveBmp: HBITMAP;
  110.   Size: TPoint;
  111. begin
  112.   if (FBitmap = nil)
  113.   or (FBitmap.Empty)
  114.   then Exit;
  115.   with DrawRect^ do begin
  116.     // draw background
  117.     if Canvas.Brush.Color <> Options.Colors.Menu
  118.     then Canvas.Brush.Color:= Options.Colors.Menu;
  119.     R:= mir.LineRect;
  120.     Canvas.FrameRect(R);
  121.     InflateRect(R, -1, 0);
  122.     Canvas.FrameRect(R);
  123. {$IFDEF Delphi3OrHigher}
  124.     // set pixel format
  125.     if Bitmap.PixelFormat <> pf24bit
  126.     then Bitmap.PixelFormat:= pf24bit;
  127. {$ENDIF}
  128.     // create mask
  129.     MaskBmp:= CreateBitmap(Bitmap.Width, Bitmap.Height, 1, 1, nil);
  130.     DC:= CreateCompatibleDC(0);
  131.     SaveBmp:= SelectObject(DC, MaskBmp);
  132.     SetBkColor(Bitmap.Canvas.Handle, Bitmap.Canvas.Pixels[0, 0]);
  133.     BitBlt(DC, 0, 0, Bitmap.Width, Bitmap.Height, Bitmap.Canvas.Handle, 0, 0, SrcCopy);
  134.     SelectObject(DC, SaveBmp);
  135.     DeleteDC(DC);
  136.     // fast draw bitmap
  137.     il:= ImageList_Create(Bitmap.Width, Bitmap.Height, ilc_Color24 + ilc_Mask, 1, 1);
  138.     ImageList_SetBkColor(il, ColorToRgb(Options.Colors.Menu));
  139.     ImageList_Add(il, Bitmap.Handle, MaskBmp);
  140.     ImageList_Draw(il, 0, Canvas.Handle, mir.LineLeft +2, mir.Top +1, ild_Normal);
  141.     ImageList_Destroy(il);
  142.     DeleteObject(MaskBmp);
  143.     // count
  144.     if Count = 0 then Count:= Rows * Columns;
  145.     // draw rectangle
  146.     // get size
  147.     Size:= Point(Bitmap.Width div Columns, Bitmap.Height div Rows);
  148.     // draw item index
  149.     if (ItemIndex >=0)
  150.     then begin
  151.       I:= ItemIndex mod Columns;
  152.       J:= ItemIndex div Columns;
  153.       R:= Rect(I * Size.X + mir.LineLeft +2, J * Size.Y + mir.Top +1, 0, 0);
  154.       R.Right:= R.Left + Size.X;
  155.       R.Bottom:= R.Top + Size.Y;
  156.       // draw edge
  157.       DrawEdge(Canvas.Handle, R, bdr_SunkenOuter, bf_Rect)
  158.     end;
  159.     // save coordinates
  160.     LastLeft:= mir.LineLeft;
  161.     LastRight:= mir.LineRight;
  162.     LastTop:= mir.Top;
  163.     LastBottom:= mir.Top + mir.Height;
  164.     // draw current item
  165.     NextLii:= -1;
  166.     if (isSelected in State)
  167.     and (MousePos.X > mir.LineLeft -2)
  168.     and (MousePos.X < mir.LineRight)
  169.     and (MousePos.Y > mir.Top -1)
  170.     and (MousePos.Y < mir.Top + mir.Height)
  171.     then begin
  172.       I:= (MousePos.X - mir.LineLeft -2) div Size.X;
  173.       J:= (MousePos.Y - mir.Top -2) div Size.Y;
  174.       NextLII:= I + J * Columns;
  175.       if (I >= 0) and (I < Columns)
  176.       and (J >= 0) and (J < Rows)
  177.       and (NextLII < Count)
  178.       then begin
  179.         // get current item's size
  180.         R:= Rect(I * Size.X + mir.LineLeft +2, J * Size.Y + mir.Top +1, 0, 0);
  181.         R.Right:= R.Left + Size.X;
  182.         R.Bottom:= R.Top + Size.Y;
  183.         // draw edge
  184.         if (msLeftButton in MouseState)
  185.         then DrawEdge(Canvas.Handle, R, bdr_SunkenOuter, bf_Rect)
  186.         else DrawEdge(Canvas.Handle, R, bdr_RaisedInner, bf_Rect);
  187.       end { acceptable I and J } ;
  188.     end;
  189.     LastItemIndex:= NextLII;
  190.   end;
  191. end;
  192. function T_AM2000_ButtonArrayOptions.GetIndexAt(X, Y: Integer): Integer;
  193. var
  194.   I, J: Integer;
  195.   Size: TPoint;
  196. begin
  197.   Result:= -1;
  198.   if (X > LastLeft)
  199.   and (X < LastRight)
  200.   and (Y > LastTop -1)
  201.   and (Y < LastBottom)
  202.   then begin
  203.     Size:= Point(Bitmap.Width div Columns, Bitmap.Height div Rows);
  204.     I:= (X - LastLeft -2) div Size.X;
  205.     J:= (Y - LastTop -2) div Size.Y;
  206.     Result:= I + J * Columns;
  207.   end;
  208. end;
  209. end.