MMTrnPrp.pas
上传用户:hylc_2004
上传日期:2014-01-23
资源大小:46800k
文件大小:7k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. {========================================================================}
  2. {=                (c) 1995-98 SwiftSoft Ronald Dittrich                 =}
  3. {========================================================================}
  4. {=                          All Rights Reserved                         =}
  5. {========================================================================}
  6. {=  D 01099 Dresden             = Tel.: +0351-8012255                   =}
  7. {=  Loewenstr.7a                = info@swiftsoft.de                     =}
  8. {========================================================================}
  9. {=  Actual versions on http://www.swiftsoft.de/mmtools.html             =}
  10. {========================================================================}
  11. {=  This code is for reference purposes only and may not be copied or   =}
  12. {=  distributed in any format electronic or otherwise except one copy   =}
  13. {=  for backup purposes.                                                =}
  14. {=                                                                      =}
  15. {=  No Delphi Component Kit or Component individually or in a collection=}
  16. {=  subclassed or otherwise from the code in this unit, or associated   =}
  17. {=  .pas, .dfm, .dcu, .asm or .obj files may be sold or distributed     =}
  18. {=  without express permission from SwiftSoft.                          =}
  19. {=                                                                      =}
  20. {=  For more licence informations please refer to the associated        =}
  21. {=  HelpFile.                                                           =}
  22. {========================================================================}
  23. {=  $Date: 02.03.98 - 21:26:42 $                                        =}
  24. {========================================================================}
  25. unit MMTrnPrp;
  26. {$I COMPILER.INC}
  27. interface
  28. uses
  29. {$IFDEF DELPHI6}
  30.   DesignIntf,
  31.   DesignEditors,
  32.   VCLEditors,
  33. {$ELSE}
  34.   DsgnIntf,
  35. {$ENDIF}
  36.   Windows,
  37.   Messages,
  38.   SysUtils,
  39.   Classes,
  40.   Graphics,
  41.   Controls,
  42.   Forms,
  43.   Dialogs,
  44.   ExtCtrls,
  45.   MMObj,
  46.   MMUtils,
  47.   MMBmpLst;
  48. type
  49.   TWMSizing = record
  50.      Msg   : Cardinal;
  51.      fwSide: Longint;
  52.      lpRect: PRect;
  53.      Result: Longint;
  54.   end;
  55. type
  56.     {-- TMMTransparentForm ----------------------------------------------------}
  57.     TMMTransparentForm = class(TForm)
  58.        Image: TImage;
  59.        procedure ImageMouseUp(Sender: TObject; Button: TMouseButton;
  60.                               Shift: TShiftState; X, Y: Integer);
  61.     public
  62.        constructor Create(aOwner: TComponent); override;
  63.     private
  64.        FColor    : TColor;
  65.        ImageScale: integer;
  66.        procedure WMSizing(var Msg: TWMSizing); message WM_SIZING;
  67.     end;
  68.     {-- TMMTransparentColorProperty -------------------------------------------}
  69.     TMMTransparentColorProperty = class(TColorProperty)
  70.     public
  71.        procedure Edit; override;
  72.     end;
  73. var
  74.   MMTransparentForm: TMMTransparentForm;
  75. function ExecuteTransColorEditor(Comp: TMMCustomBitmapListControl; var Clr: TColor): Boolean;
  76. implementation
  77. {$R *.DFM}
  78. {------------------------------------------------------------------------------}
  79. function ExecuteTransColorEditor(Comp: TMMCustomBitmapListControl; var Clr: TColor): Boolean;
  80. begin
  81.    Result := False;
  82.    Clr := crDefault;
  83.    if (Comp <> nil) and Comp.BitmapValid then
  84.    with TMMTransparentForm.Create(Application) do
  85.    try
  86.       Image.Picture.Bitmap := Comp.Bitmap;
  87.       FColor := Comp.TransparentColor;
  88.       ClientWidth  := Comp.Bitmap.Width;
  89.       ClientHeight := Comp.Bitmap.Height;
  90.       if (ShowModal = mrOK) then
  91.       begin
  92.          Result := True;
  93.          Clr := FColor;
  94.       end;
  95.    finally
  96.       Free;
  97.    end;
  98. end;
  99. {== TMMTransparentColorProperty ===============================================}
  100. procedure TMMTransparentColorProperty.Edit;
  101. var
  102.    Clr: TColor;
  103.    Comp: TMMCustomBitmapListControl;
  104. begin
  105.    if (GetComponent(0) is TMMCustomBitmapListControl) then
  106.    begin
  107.       Comp := (GetComponent(0) as TMMCustomBitmapListControl);
  108.       if Comp.BitmapValid then
  109.       begin
  110.          if ExecuteTransColorEditor(Comp, Clr) then
  111.             SetOrdValue(Clr);
  112.       end
  113.       else inherited;
  114.   end;
  115. end;
  116. {== TMMTransparentForm ========================================================}
  117. constructor TMMTransparentForm.Create(aOwner: TComponent);
  118. begin
  119.    inherited Create(aOwner);
  120.    ImageScale := 1;
  121.    Image.Cursor := crsTrans;
  122. end;
  123. {-- TMMTransparentForm --------------------------------------------------------}
  124. procedure TMMTransparentForm.WMSizing(var Msg: TWMSizing);
  125. var
  126.    i: integer;
  127.    function CaptionHeight: integer;
  128.    begin
  129.       Result := GetSystemMetrics(SM_CYSMCAPTION)+2*GetSystemMetrics(SM_CYSIZEFRAME);
  130.    end;
  131.    function CalcMaxHeightItems(aHeight: integer): integer;
  132.    begin
  133.       Result := Max((aHeight-CaptionHeight-1) div Image.Picture.Bitmap.Height,1);
  134.    end;
  135.    function CalcClientHeight(NumItems: integer): integer;
  136.    begin
  137.       Result := ((NumItems*Image.Picture.Bitmap.Height)+CaptionHeight+1);
  138.    end;
  139.    function CalcMaxWidthItems(aWidth: integer): integer;
  140.    begin
  141.       Result := Max((aWidth-2*GetSystemMetrics(SM_CXSIZEFRAME)-1) div Image.Picture.Bitmap.Width,1);
  142.    end;
  143.    function CalcClientWidth(NumItems: integer): integer;
  144.    begin
  145.       Result := ((NumItems*Image.Picture.Bitmap.Width)+2*GetSystemMetrics(SM_CXSIZEFRAME)+1);
  146.    end;
  147. begin
  148.    // The WM_SIZING message is sent to a window that the user is resizing.
  149.    // By processing this message, an application can monitor the size and
  150.    // position of the drag rectangle and, if needed, change its size or
  151.    // position.
  152.    i := ImageScale;
  153.    with Msg.lpRect^ do
  154.    case Msg.fwSide of
  155.       WMSZ_BOTTOM,              // Bottom edge
  156.       WMSZ_BOTTOMLEFT,         // Bottom-left corner
  157.       WMSZ_BOTTOMRIGHT,         // Bottom-right corner
  158.       WMSZ_TOP,                 // Top edge
  159.       WMSZ_TOPLEFT,             // Top-left corner
  160.       WMSZ_TOPRIGHT:            // Top-right corner
  161.       begin
  162.          i := CalcMaxHeightItems(Bottom-Top);
  163.          if (Msg.fwSide = WMSZ_BOTTOMLEFT) or (Msg.fwSide = WMSZ_TOPLEFT) then
  164.             Left   := Right - CalcClientWidth(i)
  165.          else
  166.             Right  := Left + CalcClientWidth(i);
  167.          if (Msg.fwSide = WMSZ_TOP) or (Msg.fwSide = WMSZ_TOPLEFT) or (Msg.fwSide = WMSZ_TOPRIGHT) then
  168.              Top := Bottom - CalcClientHeight(i)
  169.          else
  170.              Bottom := Top + CalcClientHeight(i);
  171.       end;
  172.       WMSZ_RIGHT,
  173.       WMSZ_LEFT :
  174.       begin
  175.          i := CalcMaxWidthItems(Right-Left);
  176.          if (Msg.fwSide = WMSZ_LEFT) then
  177.             Left := Right - CalcClientWidth(i)
  178.          else
  179.             Right  := Left + CalcClientWidth(i);
  180.          Bottom := Top + CalcClientHeight(i);
  181.       end;
  182.    end;
  183.    ImageScale := i;
  184.    Msg.Result := 1;       // Tell windows you have changed sizing
  185.    inherited;
  186. end;
  187. {-- TMMTransparentForm --------------------------------------------------------}
  188. procedure TMMTransparentForm.ImageMouseUp(Sender: TObject; Button: TMouseButton;
  189.                                           Shift: TShiftState; X, Y: Integer);
  190. begin
  191.    if PtInRect(Image.ClientRect,Point(X,Y)) then
  192.    begin
  193.       X := X div ImageScale;
  194.       Y := Y div ImageScale;
  195.       FColor := Image.Picture.Bitmap.Canvas.Pixels[X,Y];
  196.       ModalResult := mrOK;
  197.    end;
  198. end;
  199. end.