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

Delphi控件源码

开发平台:

Delphi

  1. {========================================================================}
  2. {=                (c) 1995-98 SwiftSoft Ronald Dittrich                 =}
  3. {========================================================================}
  4. {=                          All Rights Reserved                         =}
  5. {========================================================================}
  6. {=  D 01099 Dresden             = Fax.: +49 (0)351-8037944              =}
  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: 11.09.98 - 15:45:37 $                                        =}
  24. {========================================================================}
  25. unit MMObj;
  26. {$I COMPILER.INC}
  27. {$IFDEF TRIAL}
  28.      {$IFNDEF CBUILDER3}
  29.           {$DEFINE USE_ABOUT}
  30.      {$ENDIF}
  31.      {$IFDEF CBUILDER4}
  32.           {$DEFINE USE_ABOUT}
  33.      {$ENDIF}
  34. {$ENDIF}
  35. interface
  36. Uses
  37. {$IFDEF WIN32}
  38.     Windows,
  39.     SyncObjs,
  40. {$ELSE}
  41.     WinTypes,
  42.     WinProcs,
  43. {$ENDIF}
  44.     SysUtils,
  45.     Dialogs,
  46.     Messages,
  47.     Classes,
  48.     Controls,
  49.     ExtCtrls,
  50.     Forms,
  51.     Graphics,
  52.     MMAbout;
  53. const
  54.     defWidth  = 28;
  55.     defHeight = 28;
  56. type
  57.     {$IFDEF WIN32}
  58.     {-- TMMCriticalSection ----------------------------------------------------}
  59.     TMMCriticalSection = class(TCriticalSection)
  60.     private
  61.         FLockCount: integer;
  62.     public
  63.         property  LockCount: integer read FLockCount;
  64.         procedure Acquire; override;
  65.         procedure Release; override;
  66.         function TryEnter: Boolean;
  67.     end;
  68.     {-- TMMThread -------------------------------------------------------------}
  69.     TMMThreadEx = class(TThread)
  70.     private
  71.         function GetPriority: TThreadPriority;
  72.         procedure SetPriority(Value: TThreadPriority);
  73.     public
  74.         property Priority: TThreadPriority read GetPriority write SetPriority;
  75.     end;
  76.     {$ENDIF}
  77.     {-- TMMObject -------------------------------------------------------------}
  78.     TMMObject = class(TPersistent)
  79.     private
  80.         FUpdateCount: integer;
  81.         FOnChanging : TNotifyEvent;
  82.         FOnChange   : TNotifyEvent;
  83.     protected
  84.         procedure SetUpdateState(Updating: Boolean); virtual;
  85.         procedure Changing; dynamic;
  86.         procedure Changed; dynamic;
  87.     public
  88.         procedure BeginUpdate;
  89.         procedure EndUpdate;
  90.         property  UpdateCount: integer read FUpdateCount;
  91.         property  OnChanging: TNotifyEvent read FOnChanging write FOnChanging;
  92.         property  OnChange: TNotifyEvent read FOnChange write FOnChange;
  93.     end;
  94.     {-- TMMBevel --------------------------------------------------------------}
  95.     TMMBevel = class(TMMObject)
  96.     private
  97.         FBevelInner      : TPanelBevel;
  98.         FBevelOuter      : TPanelBevel;
  99.         FBevelInnerWidth : TBevelWidth;
  100.         FBevelOuterWidth : TBevelWidth;
  101.         FBorderStyle     : TBorderStyle;
  102.         FBorderWidth     : TBorderWidth;
  103.         FBorderSpace     : TBorderWidth;
  104.         FBorderColor     : TColor;
  105.         FBorderSpaceColor: TColor;
  106.         FInnerLightColor : TColor;
  107.         FInnerShadowColor: TColor;
  108.         FOuterLightColor : TColor;
  109.         FOuterShadowColor: TColor;
  110.         function  GetBevelExtend: Integer;
  111.         procedure SetBevelInner(Value: TPanelBevel);
  112.         procedure SetBevelOuter(Value: TPanelBevel);
  113.         procedure SetBevelInnerWidth(Value: TBevelWidth);
  114.         procedure SetBevelOuterWidth(Value: TBevelWidth);
  115.         procedure SetBorderStyle(Value: TBorderStyle);
  116.         procedure SetBorderWidth(Value: TBorderWidth);
  117.         procedure SetBorderSpace(Value: TBorderWidth);
  118.         procedure SetColors(Index: Integer; Value: TColor);
  119.     public
  120.         constructor Create; virtual;
  121.         procedure Assign(Source: TPersistent); override;
  122.         property BevelExtend: Integer read GetBevelExtend;
  123.         function PaintBevel(Canvas: TCanvas; FrameRect: TRect; Fill: Boolean): TRect; virtual;
  124.     published
  125.         property BevelInner: TPanelBevel read FBevelInner write SetBevelInner
  126.                  {$IFDEF BUILD_ACTIVEX} default bvNone {$ENDIF};
  127.         property BevelOuter: TPanelBevel read FBevelOuter write SetBevelOuter
  128.                  {$IFDEF BUILD_ACTIVEX} default bvLowered {$ENDIF};
  129.         property BevelInnerWidth: TBevelWidth read FBevelInnerWidth write SetBevelInnerWidth
  130.                  {$IFDEF BUILD_ACTIVEX} default 1 {$ENDIF};
  131.         property BevelOuterWidth: TBevelWidth read FBevelOuterWidth write SetBevelOuterWidth
  132.                  {$IFDEF BUILD_ACTIVEX} default 1 {$ENDIF};
  133.         property BorderStyle: TBorderStyle read FBorderStyle write SetBorderStyle
  134.                  {$IFDEF BUILD_ACTIVEX} default bsNone {$ENDIF};
  135.         property BorderWidth: TBorderWidth read FBorderWidth write SetBorderWidth
  136.                  {$IFDEF BUILD_ACTIVEX} default 0 {$ENDIF};
  137.         property BorderSpace: TBorderWidth read FBorderSpace write SetBorderSpace
  138.                  {$IFDEF BUILD_ACTIVEX} default 0 {$ENDIF};
  139.         property BorderColor: TColor index 0 read FBorderColor write SetColors
  140.                  {$IFDEF BUILD_ACTIVEX} default clBtnFace {$ENDIF};
  141.         property BorderSpaceColor: TColor index 1 read FBorderSpaceColor write SetColors
  142.                  {$IFDEF BUILD_ACTIVEX} default clBlack {$ENDIF};
  143.         property InnerLightColor : TColor index 2 read FInnerLightColor write SetColors
  144.                  {$IFDEF BUILD_ACTIVEX} default clBtnHighlight {$ENDIF};
  145.         property InnerShadowColor: TColor index 3 read FInnerShadowColor write SetColors
  146.                  {$IFDEF BUILD_ACTIVEX} default clBtnShadow {$ENDIF};
  147.         property OuterLightColor : TColor index 4 read FOuterLightColor write SetColors
  148.                  {$IFDEF BUILD_ACTIVEX} default clBtnHighlight {$ENDIF};
  149.         property OuterShadowColor: TColor index 5 read FOuterShadowColor write SetColors
  150.                  {$IFDEF BUILD_ACTIVEX} default clBtnShadow {$ENDIF};
  151.     end;
  152.     {-- TMMComponent ----------------------------------------------------------}
  153.     TMMComponent = class(TComponent)
  154.     private
  155.         {$IFDEF USE_ABOUT}
  156.         FAbout   : TMMAboutBox;
  157.         {$ENDIF}
  158.     public
  159.         procedure DesigningChanged(aValue: Boolean); virtual;
  160.         procedure ChangeDesigning(aValue: Boolean); virtual;
  161.     published
  162.         {$IFDEF USE_ABOUT}
  163.         property About: TMMAboutBox read FAbout write FAbout stored False;
  164.         {$ENDIF}
  165.     end;
  166.     {$IFDEF BUILD_ACTIVEX}
  167.     {-- TMMAXControl ----------------------------------------------------------}
  168.     TMMAXControl = class(TCustomControl)
  169.     private
  170.        FSelected: Boolean;
  171.        procedure SetSelected(aValue: Boolean);
  172.     public
  173.        property Canvas;
  174.        property Selected: Boolean read FSelected write SetSelected;
  175.     end;
  176.     {$ENDIF}
  177.     {-- TMMNonVisualComponent -------------------------------------------------}
  178.     {$IFNDEF BUILD_ACTIVEX}
  179.     TMMNonVisualComponent = class(TMMComponent);
  180.     {$ELSE}
  181.     TMMNonVisualComponent = class(TMMAXControl)
  182.     private
  183.         FToolboxImageID: integer;
  184.     protected
  185.         procedure Paint; override;
  186.         procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override;
  187.     public
  188.         procedure DesigningChanged(aValue: Boolean); virtual;
  189.         procedure ChangeDesigning(aValue: Boolean); virtual;
  190.         constructor Create(aOwner: TComponent); override;
  191.         property Width stored False;
  192.         property Height stored False;
  193.         property Font stored False;
  194.         property Cursor stored False;
  195.         property ToolboxImageID: integer read FToolboxImageID write FToolboxImageID;
  196.     published
  197.     end;
  198.     {$ENDIF}
  199.     {-- TMMWinControl ---------------------------------------------------------}
  200.     TMMWinControl = class(TWinControl)
  201.     private
  202.         {$IFDEF USE_ABOUT}
  203.         FAbout: TMMAboutBox;
  204.         {$ENDIF}
  205.     public
  206.         constructor Create(aOwner: TComponent); override;
  207.         procedure DesigningChanged(aValue: Boolean); virtual;
  208.         procedure ChangeDesigning(aValue: Boolean); virtual;
  209.         function  ClientToClient(Source: TControl; const Point: TPoint): TPoint;
  210.     published
  211.         {$IFDEF USE_ABOUT}
  212.         property About: TMMAboutBox read FAbout write FAbout stored False;
  213.         {$ENDIF}
  214.     end;
  215.     {-- TMMCustomControl ------------------------------------------------------}
  216.     {$IFDEF BUILD_ACTIVEX}
  217.     TMMCustomControl = class(TMMAXControl)
  218.     {$ELSE}
  219.     TMMCustomControl = class(TCustomControl)
  220.     {$ENDIF}
  221.     private
  222.         {$IFDEF USE_ABOUT}
  223.         FAbout: TMMAboutBox;
  224.         {$ENDIF}
  225.         FBevel: TMMBevel;
  226.         {$IFDEF BUILD_ACTIVEX}
  227.         FTransparent: Boolean;
  228.         {$ENDIF}
  229.         procedure SetBevel(aValue: TMMBevel);
  230.         procedure BevelChanged(Sender: TObject);
  231.         {$IFDEF BUILD_ACTIVEX}
  232.         procedure SetTransparent(aValue: Boolean);
  233.         {$ENDIF}
  234.     protected
  235.         procedure Paint; override;
  236.         procedure Changed; dynamic;
  237.         {$IFDEF BUILD_ACTIVEX}
  238.         procedure WMEraseBkgnd(var Message: TMessage); message WM_ERASEBKGND;
  239.         procedure WMWindowPosChanging(var Message: TMessage); message WM_WINDOWPOSCHANGING;
  240.         procedure CreateParams(var Params: TCreateParams); override;
  241.         property  Transparent: Boolean read FTransparent write SetTransparent default False;
  242.         {$ENDIF}
  243.         property  Bevel: TMMBevel read FBevel write SetBevel;
  244.     public
  245.         constructor Create(AOwner: TComponent); override;
  246.         destructor  Destroy; override;
  247.         procedure DesigningChanged(aValue: Boolean); virtual;
  248.         procedure ChangeDesigning(aValue: Boolean); virtual;
  249.         function ClientToClient(Source: TControl; const Point: TPoint): TPoint;
  250.         function BevelExtend: Integer;
  251.         function BeveledRect: TRect;
  252.         function ScreenRect(aRect: TRect): TRect;
  253.         property Canvas;
  254.     published
  255.         {$IFDEF USE_ABOUT}
  256.         property About: TMMAboutBox read FAbout write FAbout stored False;
  257.         {$ENDIF}
  258.     end;
  259.     {-- TMMClientPaint --------------------------------------------------------}
  260.     TMMClientFill = procedure(Sender: TObject; Canvas: TCanvas; aRect: TRect) of object;
  261.     {-- TMMCustomPanel --------------------------------------------------------}
  262.     TMMCustomPanel = class(TCustomPanel)
  263.     private
  264.           {$IFDEF USE_ABOUT}
  265.            FAbout    : TMMAboutBox;
  266.            {$ENDIF}
  267.            FBevel    : TMMBevel;
  268.            FOnPaint  : TNotifyEvent;
  269.            FOnFill   : TMMClientFill;
  270.            FFillBevel: Boolean;
  271.            procedure SetBevel(aValue: TMMBevel);
  272.            procedure BevelChanged(Sender: TObject);
  273.            procedure SetFillBevel(aValue: Boolean);
  274.            
  275.     protected
  276.         procedure AlignControls(aControl: TControl; var Rect: TRect); override;
  277.         procedure Paint; override;
  278.         procedure Changed; dynamic;
  279.         property  Bevel: TMMBevel read FBevel write SetBevel;
  280.         property  FillBevel: Boolean read FFillBevel write SetFillBevel default True;
  281.     public
  282.         constructor Create(AOwner: TComponent); override;
  283.         destructor  Destroy; override;
  284.         procedure DesigningChanged(aValue: Boolean); virtual;
  285.         procedure ChangeDesigning(aValue: Boolean); virtual;
  286.         function ClientToClient(Source: TControl; const Point: TPoint): TPoint;
  287.         function BevelExtend: Integer;
  288.         function BeveledRect: TRect;
  289.         function ScreenRect(aRect: TRect): TRect;
  290.         property OnPaint: TNotifyEvent read FOnPaint write FOnPaint;
  291.         property OnFill: TMMClientFill read FOnFill write FOnFill;
  292.         property Canvas;
  293.         property Caption;
  294.     published
  295.         {$IFDEF USE_ABOUT}
  296.         property About: TMMAboutBox read FAbout write FAbout stored False;
  297.        {$ENDIF}
  298.     end;
  299.     {-- TMMGraphicControl -----------------------------------------------------}
  300.     {$IFDEF BUILD_ACTIVEX}
  301.     TMMGraphicControl = class(TMMCustomControl);
  302.     {$ELSE}
  303.     TMMGraphicControl = class(TGraphicControl)
  304.     private
  305.         {$IFDEF USE_ABOUT}
  306.         FAbout: TMMAboutBox;
  307.         {$ENDIF}
  308.         FBevel: TMMBevel;
  309.         FTransparent: Boolean;
  310.         procedure SetBevel(aValue: TMMBevel);
  311.         procedure SetTransparent(aValue: Boolean);
  312.         procedure BevelChanged(Sender: TObject);
  313.     protected
  314.         procedure Paint; override;
  315.         procedure Changed; dynamic;
  316.         property  Bevel: TMMBevel read FBevel write SetBevel;
  317.         property  Transparent: Boolean read FTransparent write SetTransparent default False;
  318.     public
  319.         constructor Create(AOwner: TComponent); override;
  320.         destructor  Destroy; override;
  321.         procedure DesigningChanged(aValue: Boolean); virtual;
  322.         procedure ChangeDesigning(aValue: Boolean); virtual;
  323.         function ClientToClient(Source: TControl; const Point: TPoint): TPoint;
  324.         function BevelExtend: Integer;
  325.         function BeveledRect: TRect;
  326.         function ScreenRect(aRect: TRect): TRect;
  327.         property Canvas;
  328.         property Width;
  329.         property Height;
  330.     published
  331.         {$IFDEF USE_ABOUT}
  332.         property About: TMMAboutBox read FAbout write FAbout stored False;
  333.         {$ENDIF}
  334.     end;
  335.     {$ENDIF}
  336.     {$IFNDEF BUILD_ACTIVEX}
  337.     {-- TMMCommonDialog -------------------------------------------------------}
  338.     TMMCommonDialog = class(TCommonDialog)
  339.     private
  340.         {$IFDEF USE_ABOUT}
  341.         FAbout: TMMAboutBox;
  342.         {$ENDIF}
  343.     published
  344.         {$IFDEF USE_ABOUT}
  345.         property About: TMMAboutBox read FAbout write FAbout stored False;
  346.         {$ENDIF}
  347.     end;
  348.     {$ELSE}
  349.     TMMCommonDialog = class(TMMNonVisualComponent)
  350.     private
  351.         FCtl3D: Boolean;
  352.     protected
  353.         function TaskModalDialog(DialogFunc: Pointer; var DialogData): Bool; virtual;
  354.     public
  355.         constructor Create(AOwner: TComponent); override;
  356.         function  Execute: Boolean; virtual; abstract;
  357.     published
  358.         property Ctl3D: Boolean read FCtl3D write FCtl3D default True;
  359.     end;
  360.     {$ENDIF}
  361. {$I MMCONST.INC}
  362. function  LoadResStr(const ResID: Word): String;
  363. {$I MMCURSOR.INC}
  364. function  LoadResCursor(const ResID: Word): HCURSOR;
  365. {$I MMICON.INC}
  366. function  LoadResIcon(const ResID: WORD): HICON;
  367. function InheritsFromEx(Instance: TObject; AClass: TClass): Boolean;
  368. function DeviceIdToIdent(Id: LongInt; var S: string): Boolean;
  369. function IdentToDeviceId(const S: string; var Id: LongInt): Boolean;
  370. implementation
  371. uses
  372.     MMUtils;
  373.     
  374. {==============================================================================}
  375. {$IFDEF BUILD_ACTIVEX}
  376. function InheritsFromEx(Instance: TObject; AClass: TClass): Boolean;
  377. asm
  378.   push esi
  379.   push edi
  380.   test eax,eax
  381.   jz @@x
  382.   cld
  383.   sub ecx, ecx
  384.   mov eax, [eax]
  385.   mov edx, [edx].vmtClassName
  386. @@loop:
  387.   mov esi, [eax].vmtClassName
  388.   mov cl, [esi]
  389.   cmp cl, [edx]
  390.   jne @@notyet
  391.   inc ecx
  392.   mov edi, edx
  393.   repe cmpsb
  394.   jz @@yes
  395. @@notyet:
  396.   call TObject.ClassParent
  397.   jnz @@loop
  398.   jmp @@x
  399. @@yes:
  400.   mov al, 1
  401. @@x:
  402.   pop edi
  403.   pop esi
  404. end;
  405. {$ELSE}
  406. function InheritsFromEx(Instance: TObject; AClass: TClass): Boolean;
  407. begin
  408.    Result := Instance.InheritsFrom(AClass)
  409. end;
  410. {$ENDIF}
  411. {==============================================================================}
  412. function LoadResStr(const ResID: Word): String;
  413. begin
  414.    Result := LoadStr(IDS_BASE + ResID);
  415. end;
  416. {==============================================================================}
  417. function LoadResCursor(const ResID: Word): HCursor;
  418. begin
  419.    Result := LoadCursor(HInstance, PChar(crsBase + ResID));
  420. end;
  421. {==============================================================================}
  422. function LoadResIcon(const ResID: Word): HIcon;
  423. begin
  424.    Result := LoadIcon(HInstance, PChar(icoBase + ResID));
  425. end;
  426. {$IFDEF WIN32}
  427. {== TMMCriticalSection ========================================================}
  428. procedure TMMCriticalSection.Acquire;
  429. begin
  430.    InterlockedIncrement(FlockCount);
  431.    inherited;
  432. end;
  433. {-- TMMCriticalSection --------------------------------------------------------}
  434. procedure TMMCriticalSection.Release;
  435. begin
  436.    inherited;
  437.    InterlockedDecrement(FlockCount);
  438. end;
  439. {-- TMMCriticalSection --------------------------------------------------------}
  440. function TMMCriticalSection.TryEnter: Boolean;
  441. begin
  442.    Result := FLockCount = 0;
  443.    if Result then Enter;
  444. end;
  445. const
  446.   Priorities: array [TThreadPriority] of Integer =
  447.       (THREAD_PRIORITY_IDLE, THREAD_PRIORITY_LOWEST,
  448.        THREAD_PRIORITY_BELOW_NORMAL, THREAD_PRIORITY_NORMAL,
  449.        THREAD_PRIORITY_ABOVE_NORMAL, THREAD_PRIORITY_HIGHEST,
  450.        THREAD_PRIORITY_TIME_CRITICAL);
  451. {== TMMThreadEx ===============================================================}
  452. procedure TMMThreadEx.SetPriority(Value: TThreadPriority);
  453. begin
  454.    MMSetThreadPriority(Handle, Priorities[Value]);
  455. end;
  456. {-- TMMThreadEx ---------------------------------------------------------------}
  457. function TMMThreadEx.GetPriority: TThreadPriority;
  458. begin
  459.    Result := inherited Priority;
  460. end;
  461. {$ENDIF}
  462. {== TMMObject =================================================================}
  463. procedure TMMObject.BeginUpdate;
  464. begin
  465.    if FUpdateCount = 0 then SetUpdateState(True);
  466.    inc(FUpdateCount);
  467. end;
  468. {-- TMMObject -----------------------------------------------------------------}
  469. procedure TMMObject.EndUpdate;
  470. begin
  471.    dec(FUpdateCount);
  472.    if FUpdateCount = 0 then SetUpdateState(False);
  473. end;
  474. {-- TMMObject -----------------------------------------------------------------}
  475. procedure TMMObject.SetUpdateState(Updating: Boolean);
  476. begin
  477.   if Updating then Changing else Changed;
  478. end;
  479. {-- TMMObject -----------------------------------------------------------------}
  480. procedure TMMObject.Changing;
  481. begin
  482.    if (FUpdateCount = 0) and Assigned(FOnChanging) then FOnChanging(Self);
  483. end;
  484. {-- TMMObject -----------------------------------------------------------------}
  485. procedure TMMObject.Changed;
  486. begin
  487.    if (FUpdateCount = 0) and Assigned(FOnChange) then FOnChange(Self);
  488. end;
  489. {== TMMBevel ==================================================================}
  490. constructor TMMBevel.Create;
  491. begin
  492.    inherited Create;
  493.    FBevelInner      := bvNone;
  494.    FBevelOuter      := bvLowered;
  495.    FBevelInnerWidth := 1;
  496.    FBevelOuterWidth := 1;
  497.    FBorderStyle     := bsNone;
  498.    FBorderWidth     := 0;
  499.    FBorderSpace     := 0;
  500.    FBorderColor     := clBtnFace;
  501.    FBorderSpaceColor:= clBlack;
  502.    FOuterLightColor := clBtnHighlight;
  503.    FOuterShadowColor:= clBtnShadow;
  504.    FInnerLightColor := clBtnHighlight;
  505.    FInnerShadowColor:= clBtnShadow;
  506. end;
  507. {-- TMMBevel ------------------------------------------------------------------}
  508. procedure TMMBevel.Assign(Source: TPersistent);
  509. begin
  510.    if (Source is TMMBevel) and (Source <> Self) then
  511.    begin
  512.       BeginUpdate;
  513.       try
  514.          BevelInner      := TMMBevel(Source).BevelInner;
  515.          BevelOuter      := TMMBevel(Source).BevelOuter;
  516.          BevelInnerWidth := TMMBevel(Source).BevelInnerWidth;
  517.          BevelOuterWidth := TMMBevel(Source).BevelOuterWidth;
  518.          BorderStyle     := TMMBevel(Source).BorderStyle;
  519.          BorderWidth     := TMMBevel(Source).BorderWidth;
  520.          BorderSpace     := TMMBevel(Source).BorderSpace;
  521.          BorderColor     := TMMBevel(Source).BorderColor;
  522.          BorderSpaceColor:= TMMBevel(Source).BorderSpaceColor;
  523.          OuterLightColor := TMMBevel(Source).OuterLightColor;
  524.          OuterShadowColor:= TMMBevel(Source).OuterShadowColor;
  525.          InnerLightColor := TMMBevel(Source).InnerLightColor;
  526.          InnerShadowColor:= TMMBevel(Source).InnerShadowColor;
  527.       finally
  528.          EndUpdate;
  529.       end;
  530.    end
  531.    else inherited assign(Source);
  532. end;
  533. {-- TMMBevel ------------------------------------------------------------------}
  534. function TMMBevel.GetBevelExtend: Integer;
  535. begin
  536.    Result := FBorderWidth + FBorderSpace;
  537.    if (FBevelOuter <> bvNone) then inc(Result, FBevelOuterWidth);
  538.    if (FBevelInner <> bvNone) then inc(Result, FBevelInnerWidth);
  539.    if (FBorderStyle <> bsNone) then inc(Result);
  540. end;
  541. {-- TMMBevel ------------------------------------------------------------------}
  542. procedure TMMBevel.SetBevelInner(Value: TPanelBevel);
  543. begin
  544.    if (Value <> FBevelInner) then
  545.    begin
  546.       FBevelInner := Value;
  547.       Changed;
  548.    end;
  549. end;
  550. {-- TMMBevel ------------------------------------------------------------------}
  551. procedure TMMBevel.SetBevelOuter(Value: TPanelBevel);
  552. begin
  553.    if (Value <> FBevelOuter) then
  554.    begin
  555.       FBevelOuter := Value;
  556.       Changed;
  557.    end;
  558. end;
  559. {-- TMMBevel ------------------------------------------------------------------}
  560. procedure TMMBevel.SetBevelInnerWidth(Value: TBevelWidth);
  561. begin
  562.    if (Value <> FBevelInnerWidth) then
  563.    begin
  564.       FBevelInnerWidth := Value;
  565.       Changed;
  566.    end;
  567. end;
  568. {-- TMMBevel ------------------------------------------------------------------}
  569. procedure TMMBevel.SetBevelOuterWidth(Value: TBevelWidth);
  570. begin
  571.    if (Value <> FBevelOuterWidth) then
  572.    begin
  573.       FBevelOuterWidth := Value;
  574.       Changed;
  575.    end;
  576. end;
  577. {-- TMMBevel ------------------------------------------------------------------}
  578. procedure TMMBevel.SetBorderStyle(Value: TBorderStyle);
  579. begin
  580.    if (Value <> FBorderStyle) then
  581.    begin
  582.       FBorderStyle := Value;
  583.       Changed;
  584.    end;
  585. end;
  586. {-- TMMBevel ------------------------------------------------------------------}
  587. procedure TMMBevel.SetBorderWidth(Value: TBorderWidth);
  588. begin
  589.    if (Value <> FBorderWidth) then
  590.    begin
  591.       FBorderWidth := Value;
  592.       Changed;
  593.    end;
  594. end;
  595. {-- TMMBevel ------------------------------------------------------------------}
  596. procedure TMMBevel.SetBorderSpace(Value: TBorderWidth);
  597. begin
  598.    if (Value <> FBorderSpace) then
  599.    begin
  600.       FBorderSpace := Value;
  601.       Changed;
  602.    end;
  603. end;
  604. {-- TMMBevel ------------------------------------------------------------------}
  605. procedure TMMBevel.SetColors(Index:Integer; Value: TColor);
  606. begin
  607.    case Index of
  608.      0: if FBorderColor = Value then exit else FBorderColor := Value;
  609.      1: if FBorderSpaceColor = Value then exit else FBorderSpaceColor := Value;
  610.      2: if FInnerLightColor = Value then exit else FInnerLightColor := Value;
  611.      3: if FInnerShadowColor = Value then exit else FInnerShadowColor := Value;
  612.      4: if FOuterLightColor = Value then exit else FOuterLightColor := Value;
  613.      5: if FOuterShadowColor = Value then exit else FOuterShadowColor := Value;
  614.    end;
  615.    Changed;
  616. end;
  617. {-- TMMBevel ------------------------------------------------------------------}
  618. function TMMBevel.PaintBevel(Canvas: TCanvas; FrameRect: TRect; Fill: Boolean): TRect;
  619. begin
  620.    if (FBorderStyle = bsSingle) then
  621.       Frame3D(Canvas, FrameRect, clWindowFrame, clWindowFrame, 1);
  622.    if (FBevelOuter = bvLowered) then
  623.       Frame3D(Canvas, FrameRect, OuterShadowColor, OuterLightColor, FBevelOuterWidth)
  624.    else if (FBevelOuter = bvRaised) then
  625.       Frame3D(Canvas, FrameRect, OuterLightColor, OuterShadowColor, FBevelOuterWidth);
  626.    if Fill then
  627.       Frame3D(Canvas, FrameRect, FBorderColor, FBorderColor, FBorderWidth)
  628.    else
  629.       InflateRect(FrameRect, -FBorderWidth, -FBorderWidth);
  630.    if (FBevelInner = bvLowered) then
  631.       Frame3D(Canvas, FrameRect, InnerShadowColor, InnerLightColor, FBevelInnerWidth)
  632.    else if (FBevelInner = bvRaised) then
  633.       Frame3D(Canvas, FrameRect, InnerLightColor, InnerShadowColor, FBevelInnerWidth);
  634.    if (FBorderSpace <> 0) then
  635.       Frame3D(Canvas, FrameRect, FBorderSpaceColor, FBorderSpaceColor, FBorderSpace);
  636.    Result := FrameRect;
  637. end;
  638. {== TMMComponent ==============================================================}
  639. procedure TMMComponent.DesigningChanged(aValue: Boolean);
  640. begin
  641.    if aValue <> (csDesigning in ComponentState) then
  642.       ChangeDesigning(aValue);
  643. end;
  644. {-- TMMComponent --------------------------------------------------------------}
  645. procedure TMMComponent.ChangeDesigning(aValue: Boolean);
  646. begin
  647.    SetDesigning(aValue);
  648. end;
  649. {$IFDEF BUILD_ACTIVEX}
  650. {== TMMAXControl ==============================================================}
  651. procedure TMMAXControl.SetSelected(aValue: Boolean);
  652. begin
  653.    if (aValue <> FSelected) then
  654.    begin
  655.       FSelected := aValue;
  656.       Refresh;
  657.    end;
  658. end;
  659. {== TMMNonVisualComponent =====================================================}
  660. constructor TMMNonVisualComponent.Create(aOwner: TComponent);
  661. begin
  662.    inherited Create(aOwner);
  663.    { !!! set DesignMode as default because many constructors check for the flag !!! }
  664. {$IFDEF BUILD_ACTIVEX}
  665.    SetDesigning(True);
  666. {$ENDIF}
  667.    Width := defWidth;
  668.    Height:= defHeight;
  669.    ErrorCode := ComponentRegistered(InitCode, Self, ClassName);
  670.    if (ErrorCode <> 0) then RegisterFailed(InitCode, Self , ClassName);
  671. end;
  672. {-- TMMNonVisualComponent -----------------------------------------------------}
  673. procedure TMMNonVisualComponent.DesigningChanged(aValue: Boolean);
  674. begin
  675.    if aValue <> (csDesigning in ComponentState) then
  676.       ChangeDesigning(aValue);
  677. end;
  678. {-- TMMNonVisualComponent -----------------------------------------------------}
  679. procedure TMMNonVisualComponent.ChangeDesigning(aValue: Boolean);
  680. begin
  681.    { !!! overwrite this methode to re-initialize the component if we are not in DesignMode !!! }
  682.    SetDesigning(aValue);
  683. end;
  684. {-- TMMNonVisualComponent -----------------------------------------------------}
  685. procedure TMMNonVisualComponent.SetBounds(ALeft, ATop, AWidth, AHeight: Integer);
  686. begin
  687.   if csDesigning in ComponentState then
  688.     inherited SetBounds(ALeft, ATop, defWidth, defHeight)
  689.   else
  690.     inherited SetBounds(ALeft, ATop, 0, 0)
  691. end;
  692. {-- TMMNonVisualComponent -----------------------------------------------------}
  693. procedure TMMNonVisualComponent.Paint;
  694. var
  695.    R: TRect;
  696.    Bitmap: TBitmap;
  697.    TransColor: TColor;
  698. begin
  699.    if (csNoDesignVisible in ControlStyle) then exit;
  700.    //BringToFront;
  701.    SetBounds(Left, Top, defWidth, defHeight);
  702.    R := ClientRect;
  703.    Frame3D(Canvas, R, clWhite, clBlack, 1);
  704.    Frame3D(Canvas, R, clBtnFace, clGray, 1);
  705.     // Paint like button no matter what Color property is
  706.    Canvas.Brush.Color := clBtnFace;
  707.    Canvas.FillRect(R);
  708.    Bitmap := TBitmap.Create;
  709.    try
  710.       Bitmap.Handle := LoadBitmap(hInstance, PChar(UpperCase(ClassName)+'_X'));
  711.       if (Bitmap.Handle = 0) then
  712.           Bitmap.Handle := LoadBitmap(hInstance, PChar(UpperCase(ClassName)));
  713.       if (Bitmap.Handle = 0) then
  714.           Bitmap.Handle := LoadBitmap(hInstance, PChar(ToolBoxImageID));
  715.       InflateRect(R, -((R.Right - R.Left) - Bitmap.Width) div 2,
  716.                      -((R.Bottom - R.Top) - Bitmap.Height) div 2);
  717.       TransColor := Bitmap.Canvas.Pixels[0,Bitmap.Height-1];
  718.       Canvas.Brush.Color:= clBtnFace;
  719.       Canvas.BrushCopy(R, Bitmap,
  720.                        Rect(0, 0, Bitmap.Width, Bitmap.Height),
  721.                        TransColor);
  722.       if Selected then
  723.       begin
  724.          Canvas.Brush.Style := bsClear;
  725.          Canvas.Pen.Color   := clRed;
  726.          Canvas.Rectangle(0, 0, Width, Height);
  727.          Canvas.Brush.Style := bsSolid;
  728.       end;
  729.    finally
  730.       Bitmap.Free;
  731.    end;
  732. end;
  733. {$ENDIF}
  734. {== TMMWinControl =============================================================}
  735. constructor TMMWinControl.Create(aOwner: TComponent);
  736. begin
  737.    inherited Create(aOwner);
  738.    { !!! set DesignMode as default because many constructors check for the flag !!! }
  739.    {$IFDEF BUILD_ACTIVEX}
  740.    SetDesigning(True);
  741.    {$ENDIF}
  742.    if ComponentRegistered(InitCode, Self, ClassName) <> 0 then
  743.       RegisterFailed(InitCode, Self , ClassName);
  744. end;
  745. {-- TMMWinControl -------------------------------------------------------------}
  746. function TMMWinControl.ClientToClient(Source: TControl; const Point: TPoint): TPoint;
  747. begin
  748.    Result := ScreenToClient(Source.ClientToScreen(Point));
  749. end;
  750. {-- TMMWinControl -------------------------------------------------------------}
  751. procedure TMMWinControl.DesigningChanged(aValue: Boolean);
  752. begin
  753.    if aValue <> (csDesigning in ComponentState) then
  754.       ChangeDesigning(aValue);
  755. end;
  756. {-- TMMWinControl -------------------------------------------------------------}
  757. procedure TMMWinControl.ChangeDesigning(aValue: Boolean);
  758. begin
  759.    { !!! overwrite this methode to re-initialize the component if we are not in DesignMode !!! }
  760.    SetDesigning(aValue);
  761.    { update visible state }
  762.    UpdateControlState;
  763. end;
  764. {== TMMCustomControl ==========================================================}
  765. constructor TMMCustomControl.Create(aOwner:TComponent);
  766. begin
  767.    inherited Create(aOwner);
  768.    ControlStyle := ControlStyle + [csOpaque];
  769.    { !!! set DesignMode as default because many constructors check for the flag !!! }
  770.    {$IFDEF BUILD_ACTIVEX}
  771.    SetDesigning(True);
  772.    Color  := clBtnFace;
  773.    {$ENDIF}
  774.    FBevel := TMMBevel.Create;
  775.    FBevel.OnChange := BevelChanged;
  776.    ErrorCode := ComponentRegistered(InitCode, Self, ClassName);
  777.    if (ErrorCode <> 0) then RegisterFailed(InitCode, Self , ClassName);
  778. end;
  779. {-- TMMCustomControl ----------------------------------------------------------}
  780. destructor TMMCustomControl.Destroy;
  781. begin
  782.    FBevel.OnChange := Nil;
  783.    FBevel.Free;
  784.    inherited Destroy;
  785. end;
  786. {-- TMMCustomControl ----------------------------------------------------------}
  787. procedure TMMCustomControl.DesigningChanged(aValue: Boolean);
  788. begin
  789.    if aValue <> (csDesigning in ComponentState) then
  790.       ChangeDesigning(aValue);
  791. end;
  792. {-- TMMCustomControl ----------------------------------------------------------}
  793. procedure TMMCustomControl.ChangeDesigning(aValue: Boolean);
  794. begin
  795.    { !!! overwrite this methode to re-initialize the component if we are not in DesignMode !!! }
  796.    SetDesigning(aValue);
  797.    { update visible state }
  798.    UpdateControlState;
  799. end;
  800. {-- TMMCustomControl ----------------------------------------------------------}
  801. function TMMCustomControl.ClientToClient(Source: TControl; const Point: TPoint): TPoint;
  802. begin
  803.    Result := ScreenToClient(Source.ClientToScreen(Point));
  804. end;
  805. {-- TMMCustomControl ----------------------------------------------------------}
  806. procedure TMMCustomControl.BevelChanged(Sender: TObject);
  807. begin
  808.    Changed;
  809. end;
  810. {-- TMMCustomControl ----------------------------------------------------------}
  811. procedure TMMCustomControl.Changed;
  812. begin
  813.    Invalidate;
  814. end;
  815. {-- TMMCustomControl ----------------------------------------------------------}
  816. Procedure TMMCustomControl.SetBevel(aValue: TMMBevel);
  817. begin
  818.    FBevel.Assign(aValue);
  819. end;
  820. {-- TMMCustomControl ----------------------------------------------------------}
  821. function TMMCustomControl.BevelExtend: Integer;
  822. begin
  823.    Result := 0;
  824.    if (FBevel <> nil) then
  825.        Result := FBevel.BevelExtend;
  826. end;
  827. {-- TMMCustomControl ----------------------------------------------------------}
  828. function TMMCustomControl.BeveledRect: TRect;
  829. begin
  830.    Result := Rect(0,0,Width,Height);
  831.    InflateRect(Result, -BevelExtend, -BevelExtend);
  832. end;
  833. {-- TMMCustomControl ----------------------------------------------------------}
  834. function TMMCustomControl.ScreenRect(aRect: TRect): TRect;
  835. begin
  836.    with aRect do
  837.    begin
  838.       Result.TopLeft := ClienttoScreen(Point(Left,Top));
  839.       Result.BottomRight := ClienttoScreen(Point(Right,Bottom));
  840.    end;
  841. end;
  842. {-- TMMCustomControl ----------------------------------------------------------}
  843. procedure TMMCustomControl.Paint;
  844. Var
  845.    aRect: TRect;
  846. begin
  847.    { draw the Bevel and fill the area }
  848.    aRect := FBevel.PaintBevel(Canvas, ClientRect, True);
  849.    {$IFDEF BUILD_ACTIVEX}
  850.    if not Transparent then
  851.    {$ENDIF}
  852.    with Canvas do
  853.    begin
  854.       Brush.Color := Color;
  855.       Brush.Style := bsSolid;
  856.       FillRect(aRect);
  857.    end;
  858. end;
  859. {$IFDEF BUILD_ACTIVEX}
  860. {-- TMMCustomControl ----------------------------------------------------------}
  861. procedure TMMCustomControl.SetTransparent(aValue: Boolean);
  862. begin
  863.    if (aValue <> FTransparent) then
  864.    begin
  865.       FTransparent := aValue;
  866.       if FTransparent
  867.         then ControlStyle := ControlStyle - [csOpaque]
  868.         else ControlStyle := ControlStyle + [csOpaque];
  869.       if HandleAllocated then ReCreateWnd;
  870.    end;
  871. end;
  872. {-- TMMCustomControl ----------------------------------------------------------}
  873. procedure TMMCustomControl.WMEraseBkgnd;
  874. begin
  875.    if Transparent then
  876.       Message.Result := 1
  877.    else
  878.       inherited;
  879. end;
  880. {-- TMMCustomControl ----------------------------------------------------------}
  881. procedure TMMCustomControl.WMWindowPosChanging;
  882. begin
  883.    inherited;
  884.    if Transparent then Invalidate;
  885. end;
  886. {-- TMMCustomControl ----------------------------------------------------------}
  887. procedure TMMCustomControl.CreateParams;
  888. begin
  889.    inherited;
  890.    if Transparent then
  891.       Params.ExStyle := Params.ExStyle or WS_EX_TRANSPARENT;
  892. end;
  893. {$ENDIF}
  894. {== TMMCustomPanel ============================================================}
  895. constructor TMMCustomPanel.Create(aOwner: TComponent);
  896. begin
  897.    inherited Create(aOwner);
  898.    { !!! set DesignMode as default because many constructors check for the flag !!! }
  899.    {$IFDEF BUILD_ACTIVEX}
  900.    SetDesigning(True);
  901.    {$ENDIF}
  902.    FOnPaint := nil;
  903.    { make sure the inherited values are not used by aligncontrols !! }
  904.    BorderWidth := 0;
  905.    BevelOuter := bvNone;
  906.    BevelInner := bvNone;
  907.    FBevel := TMMBevel.Create;
  908.    FBevel.OnChange := BevelChanged;
  909.    FFillBevel := True;
  910.    ErrorCode := ComponentRegistered(InitCode, Self, ClassName);
  911.    if (ErrorCode <> 0) then RegisterFailed(InitCode, Self , ClassName);
  912. end;
  913. {-- TMMCustomPanel ------------------------------------------------------------}
  914. destructor TMMCustomPanel.Destroy;
  915. begin
  916.    FBevel.OnChange := Nil;
  917.    FBevel.Free;
  918.    inherited Destroy;
  919. end;
  920. {-- TMMCustomPanel ------------------------------------------------------------}
  921. procedure TMMCustomPanel.DesigningChanged(aValue: Boolean);
  922. begin
  923.    if aValue <> (csDesigning in ComponentState) then
  924.       ChangeDesigning(aValue);
  925. end;
  926. {-- TMMCustomPanel ------------------------------------------------------------}
  927. procedure TMMCustomPanel.ChangeDesigning(aValue: Boolean);
  928. begin
  929.    { !!! overwrite this methode to re-initialize the component if we are not in DesignMode !!! }
  930.    SetDesigning(aValue);
  931.    { update visible state }
  932.    UpdateControlState;
  933. end;
  934. {-- TMMCustomPanel ------------------------------------------------------------}
  935. Procedure TMMCustomPanel.SetBevel(aValue: TMMBevel);
  936. begin
  937.    FBevel.Assign(aValue);
  938. end;
  939. {-- TMMCustomPanel ------------------------------------------------------------}
  940. Procedure TMMCustomPanel.SetFillBevel(aValue: Boolean);
  941. begin
  942.    if (aValue <> FFillBevel) then
  943.    begin
  944.       FFillBevel := aValue;
  945.       Invalidate;
  946.    end;
  947. end;
  948. {-- TMMCustomPanel ------------------------------------------------------------}
  949. procedure TMMCustomPanel.BevelChanged(Sender: TObject);
  950. begin
  951.    ReAlign;
  952.    Changed;
  953. end;
  954. {-- TMMCustomPanel ------------------------------------------------------------}
  955. procedure TMMCustomPanel.AlignControls(aControl: TControl; Var Rect: TRect);
  956. begin
  957.    if (FBevel <> nil) then
  958.       InflateRect(Rect, -FBevel.BevelExtend, -FBevel.BevelExtend);
  959.    inherited AlignControls(aControl, Rect);
  960. end;
  961. {-- TMMCustomPanel ------------------------------------------------------------}
  962. function TMMCustomPanel.BevelExtend: integer;
  963. begin
  964.    Result := 0;
  965.    if (FBevel <> nil) then
  966.        Result := FBevel.BevelExtend;
  967. end;
  968. {-- TMMCustomPanel ------------------------------------------------------------}
  969. function TMMCustomPanel.BeveledRect: TRect;
  970. begin
  971.    Result := Rect(0,0,Width,Height);
  972.    InflateRect(Result, -BevelExtend, -BevelExtend);
  973. end;
  974. {-- TMMCustomPanel ------------------------------------------------------------}
  975. Procedure TMMCustomPanel.Changed;
  976. begin
  977.    Invalidate;
  978. end;
  979. {-- TMMCustomPanel ------------------------------------------------------------}
  980. function TMMCustomPanel.ScreenRect(aRect: TRect): TRect;
  981. begin
  982.    with aRect do
  983.    begin
  984.       Result.TopLeft := ClientToScreen(Point(Left,Top));
  985.       Result.BottomRight := ClientToScreen(Point(Right,Bottom));
  986.    end;
  987. end;
  988. {-- TMMCustomPanel ------------------------------------------------------------}
  989. function TMMCustomPanel.ClientToClient(Source: TControl; const Point: TPoint): TPoint;
  990. begin
  991.    Result := ScreenToClient(Source.ClientToScreen(Point));
  992. end;
  993. {-- TMMCustomPanel ------------------------------------------------------------}
  994. procedure TMMCustomPanel.Paint;
  995. Const
  996.    Alignments: array[TAlignment] of Word = (DT_LEFT, DT_RIGHT, DT_CENTER);
  997. Var
  998.    aRect: TRect;
  999.    FontHeight: Integer;
  1000.    Text: PChar;
  1001. begin
  1002.      if assigned(FOnPaint) then FOnPaint(Self)
  1003.      else
  1004.      begin
  1005.         { draw the Bevel }
  1006.         aRect := FBevel.PaintBevel(Canvas, ClientRect, FFillBevel);
  1007.         with Canvas do
  1008.         begin
  1009.            if assigned(FOnFill) then FOnFill(Self,Canvas,aRect)
  1010.            else
  1011.            begin
  1012.               Brush.Color := Color;
  1013.               Brush.Style := bsSolid;
  1014.               FillRect(aRect);
  1015.            end;
  1016.            if Caption <> '' then
  1017.            begin
  1018.               Text := StrAlloc(Length(Caption)+1);
  1019.               try
  1020.                  StrPCopy(Text, Caption);
  1021.                  Brush.Style := bsClear;
  1022.                  Font := Self.Font;
  1023.                  FontHeight := TextHeight('W');
  1024.                  with aRect do
  1025.                  begin
  1026.                     Top := ((Bottom + Top) - FontHeight) shr 1;
  1027.                     Bottom := Top + FontHeight;
  1028.                  end;
  1029.                  DrawText(Handle, Text, StrLen(Text), aRect, (DT_EXPANDTABS or
  1030.                           DT_VCENTER) or Alignments[Alignment]);
  1031.               finally
  1032.                  StrDispose(Text);
  1033.               end;
  1034.            end;
  1035.         end;
  1036.      end;
  1037. end;
  1038. {$IFNDEF BUILD_ACTIVEX}
  1039. {== TMMGraphicControl =========================================================}
  1040. constructor TMMGraphicControl.Create(aOwner:TComponent);
  1041. begin
  1042.    inherited Create(aOwner);
  1043.    { !!! set DesignMode as default because many constructors check for the flag !!! }
  1044.    {$IFDEF BUILD_ACTIVEX}
  1045.    SetDesigning(True);
  1046.    {$ENDIF}
  1047.    ControlStyle := ControlStyle + [csOpaque];
  1048.    FBevel := TMMBevel.Create;
  1049.    FBevel.OnChange := BevelChanged;
  1050.    FTransparent := False;
  1051.    ErrorCode := ComponentRegistered(InitCode, Self, ClassName);
  1052.    if (ErrorCode <> 0) then RegisterFailed(InitCode, Self , ClassName);
  1053. end;
  1054. {-- TMMGraphicControl ---------------------------------------------------------}
  1055. destructor TMMGraphicControl.Destroy;
  1056. begin
  1057.    FBevel.OnChange := Nil;
  1058.    FBevel.Free;
  1059.    inherited Destroy;
  1060. end;
  1061. {-- TMMNonVisualComponent -----------------------------------------------------}
  1062. procedure TMMGraphicControl.DesigningChanged(aValue: Boolean);
  1063. begin
  1064.    if aValue <> (csDesigning in ComponentState) then
  1065.       ChangeDesigning(aValue);
  1066. end;
  1067. {-- TMMNonVisualComponent -----------------------------------------------------}
  1068. procedure TMMGraphicControl.ChangeDesigning(aValue: Boolean);
  1069. begin
  1070.    { !!! overwrite this methode to re-initialize the component if we are not in DesignMode !!! }
  1071.    SetDesigning(aValue);
  1072. end;
  1073. {-- TMMGraphicControl ---------------------------------------------------------}
  1074. function TMMGraphicControl.ClientToClient(Source: TControl; const Point: TPoint): TPoint;
  1075. begin
  1076.    Result := ScreenToClient(Source.ClientToScreen(Point));
  1077. end;
  1078. {-- TMMGraphicControl ---------------------------------------------------------}
  1079. procedure TMMGraphicControl.BevelChanged(Sender: TObject);
  1080. begin
  1081.    Changed;
  1082. end;
  1083. {-- TMMGraphicControl ---------------------------------------------------------}
  1084. procedure TMMGraphicControl.Changed;
  1085. begin
  1086.    Invalidate;
  1087. end;
  1088. {-- TMMGraphicControl ---------------------------------------------------------}
  1089. procedure TMMGraphicControl.SetBevel(aValue: TMMBevel);
  1090. begin
  1091.    FBevel.Assign(aValue);
  1092. end;
  1093. {-- TMMGraphicControl ---------------------------------------------------------}
  1094. function TMMGraphicControl.BevelExtend: Integer;
  1095. begin
  1096.    Result := 0;
  1097.    if (FBevel <> nil) then
  1098.        Result := FBevel.BevelExtend;
  1099. end;
  1100. {-- TMMGraphicControl ---------------------------------------------------------}
  1101. function TMMGraphicControl.BeveledRect: TRect;
  1102. begin
  1103.    Result := Rect(0,0,Width,Height);
  1104.    InflateRect(Result, -BevelExtend, -BevelExtend);
  1105. end;
  1106. {-- TMMGraphicControl ---------------------------------------------------------}
  1107. function TMMGraphicControl.ScreenRect(aRect: TRect): TRect;
  1108. begin
  1109.    with aRect do
  1110.    begin
  1111.       Result.TopLeft := ClientToScreen(Point(Left,Top));
  1112.       Result.BottomRight := ClientToScreen(Point(Right,Bottom));
  1113.    end;
  1114. end;
  1115. {-- TMMGraphicControl ---------------------------------------------------------}
  1116. procedure TMMGraphicControl.SetTransparent(aValue: Boolean);
  1117. begin
  1118.    if (aValue <> FTransparent) then
  1119.    begin
  1120.       FTransparent := aValue;
  1121.       if FTransparent then ControlStyle := ControlStyle - [csOpaque]
  1122.       else ControlStyle := ControlStyle + [csOpaque];
  1123.       Refresh;
  1124.    end;
  1125. end;
  1126. {-- TMMGraphicControl ---------------------------------------------------------}
  1127. procedure TMMGraphicControl.Paint;
  1128. Var
  1129.    aRect: TRect;
  1130. begin
  1131.    { draw the Bevel and fill the area }
  1132.    aRect := FBevel.PaintBevel(Canvas, ClientRect, True);
  1133.    if not FTransparent then
  1134.    with Canvas do
  1135.    begin
  1136.       Brush.Color := Color;
  1137.       Brush.Style := bsSolid;
  1138.       FillRect(aRect);
  1139.    end;
  1140. end;
  1141. {$ELSE}
  1142. { TCommonDialog }
  1143. {== TMMCommonDialog ===========================================================}
  1144. constructor TMMCommonDialog.Create(aOwner: TComponent);
  1145. begin
  1146.   inherited Create(AOwner);
  1147.   FCtl3D := True;
  1148.   {$IFDEF BUILD_ACTIVEX}
  1149.   DesigningChanged(False);
  1150.   Visible := False;
  1151.   {$ENDIF}
  1152.   ErrorCode := ComponentRegistered(InitCode, Self, ClassName);
  1153.   if (ErrorCode <> 0) then RegisterFailed(InitCode, Self , ClassName);
  1154. end;
  1155. {-- TMMCommonDialog -----------------------------------------------------------}
  1156. function TMMCommonDialog.TaskModalDialog(DialogFunc: Pointer; var DialogData): Bool;
  1157. type
  1158.   TDialogFunc = function(var DialogData): Bool stdcall;
  1159. var
  1160.   ActiveWindow: HWnd;
  1161.   WindowList: Pointer;
  1162. begin
  1163.   ActiveWindow := GetActiveWindow;
  1164.   WindowList := DisableTaskWindows(0);
  1165.   try
  1166.     Result := TDialogFunc(DialogFunc)(DialogData);
  1167.   finally
  1168.     EnableTaskWindows(WindowList);
  1169.     SetActiveWindow(ActiveWindow);
  1170.   end;
  1171. end;
  1172. {$ENDIF}
  1173. {==============================================================================}
  1174. function DeviceIdToIdent(Id: LongInt; var S: string): Boolean;
  1175. begin
  1176.    Result := False;
  1177.    if Id = InvalidId then
  1178.       S := 'InvalidId'
  1179.    else if Id = MapperId then
  1180.       S := 'MapperId'
  1181.    else
  1182.       Exit;
  1183.    Result := True;
  1184. end;
  1185. {==============================================================================}
  1186. function IdentToDeviceId(const S: string; var Id: LongInt): Boolean;
  1187. begin
  1188.    Result := False;
  1189.    if CompareText(S,'InvalidId') = 0 then
  1190.       Id := InvalidId
  1191.    else if CompareText(S,'MapperId') = 0 then
  1192.       Id := MapperId
  1193.    else
  1194.       Exit;
  1195.    Result := True;
  1196. end;
  1197. {------------------------------------------------------------------------------}
  1198. procedure LoadCursors;
  1199. var
  1200.    i: integer;
  1201. begin
  1202.    for i := 1 to NumCursors do
  1203.        Screen.Cursors[crsBase+i]:= LoadResCursor(i);
  1204. end;
  1205. initialization
  1206.    LoadCursors;
  1207.    RegisterIntegerConsts(TypeInfo(TMMDeviceId),IdentToDeviceId,DeviceIdToIdent);
  1208. end.