CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  VCL组件开发及应用

高分求控件

楼主zzzl(不拉拉链)2005-11-20 21:35:22 在 Delphi / VCL组件开发及应用 提问

我需要一些类似edit,   button之类的控件,要求在运行时表现的效果就象设计时在窗体上操作控件一样,比如点击它之后,它的上下左右都出现用于拖拽以调整尺寸的黑点,并可以在窗体上随意拖动以调整它的位置。  
  我现在是用的VCL的标准控件代替的,但总觉得控制起来很麻烦,而且代码量也不小。  
  当然,如果或者是其它的方法。谢谢  
  问题点数:200、回复次数:8Top

1 楼aiirii(ari-http://spaces.msn.com/members/aiirii/)回复于 2005-11-20 21:44:56 得分 40

有个控件,叫   Resizer,   应该就是你要的  
   
  unit   myResizer;  
   
  interface  
   
  uses  
      Windows,   Messages,   SysUtils,   Classes,   Graphics,   Controls,   Forms,   Dialogs,  
      ExtCtrls;  
   
  const  
        GRIDDEFAULT   =   4;  
   
  type  
        TResizer   =   class;  
        TMover   =   class;  
   
        TMovingEvent   =   procedure(Sender:   TResizer;   var   NewLeft,   NewTop:   integer)   of   object;  
        TSizingEvent   =   procedure(Sender:   TResizer;   var   NewLeft,   NewTop,   NewWidth,   NewHeight:   integer)   of   object;  
   
        TResizer   =   class(TComponent)  
        protected  
              FActive           :   boolean;  
              FControl         :   TControl;  
              Sizers             :   TList;  
              GroupMovers   :   TList;  
              FGroup             :   TWinControl;  
              FGridX             :   integer;  
              FGridY             :   integer;  
              FOnSized         :   TNotifyEvent;  
              FOnSizing       :   TSizingEvent;  
              FOnMoved         :   TNotifyEvent;  
              FOnMoving       :   TMovingEvent;  
              Sizing             :   boolean;  
              Moving             :   boolean;  
              OrigSize         :   TRect;  
              NewSize           :   TRect;  
              DownX               :   integer;  
              DownY               :   integer;  
              FAllowSize     :   boolean;  
              FAllowMove     :   boolean;  
              FKeepIn           :   boolean;  
              FHotTrack       :   boolean;  
              OneMover         :   TMover;  
              CurMover         :   TMover;  
              procedure       Notification(AComponent:   TComponent;   Operation:   TOperation);   override;  
              procedure       SetActive(b:   boolean);  
              procedure       SetControl(c:   TControl);  
              procedure       SetGroup(p:   TWinControl);  
              procedure       CreateSizers;  
              procedure       CheckSizers;  
              procedure       ShowSizers;  
              procedure       HideSizers;  
              procedure       SizerDown(Sender:   TObject;   Button:   TMouseButton;   Shift:   TShiftState;   X,   Y:   Integer);  
              procedure       SizerUp(Sender:   TObject;   Button:   TMouseButton;   Shift:   TShiftState;   X,   Y:   Integer);  
              procedure       SizerMove(Sender:   TObject;   Shift:   TShiftState;   X,   Y:   Integer);  
              procedure       MoverDown(Sender:   TObject;   Button:   TMouseButton;   Shift:   TShiftState;   X,   Y:   Integer);  
              procedure       MoverUp(Sender:   TObject;   Button:   TMouseButton;   Shift:   TShiftState;   X,   Y:   Integer);  
              procedure       MoverMove(Sender:   TObject;   Shift:   TShiftState;   X,   Y:   Integer);  
              procedure       DrawSizeRect(Rect:   TRect);  
              procedure       Calc_Size_Rect(SizerNum,   dx,   dy:   integer);  
              procedure       DoSizingEvent;  
              procedure       Calc_Move_Rect(dx,   dy:   integer);  
              procedure       DoMovingEvent;  
              procedure       Constrain_Size;  
              procedure       Constrain_Move;  
              procedure       MoverKeyDown(Sender:   TObject;   var   Key:   Word;   Shift:   TShiftState);  
              procedure       DoSizeMove(var   Key:   Word;   Shift:   TShiftState;   dx,   dy:   integer);  
              procedure       CreateGroupMovers;  
              procedure       CreateOneMover(m:   TMover;   c:   TControl);  
              function         FindMoverByBuddy(c:   TControl):   TMover;Top

2 楼aiirii(ari-http://spaces.msn.com/members/aiirii/)回复于 2005-11-20 21:45:12 得分 0

public  
              constructor   Create(AOwner:   TComponent);   override;  
              destructor     Destroy;   override;  
        published  
              property         Active:   boolean   read   FActive   write   SetActive   default   True;  
              property         ResizeControl:   TControl   read   FControl   write   SetControl;  
              property         ResizeGroup:   TWinControl   read   FGroup   write   SetGroup;  
              property         GridX:   integer   read   FGridX   write   FGridX   default   GRIDDEFAULT;  
              property         GridY:   integer   read   FGridY   write   FGridY   default   GRIDDEFAULT;  
              property         OnSized:   TNotifyEvent   read   FOnSized   write   FOnSized;  
              property         OnSizing:   TSizingEvent   read   FOnSizing   write   FOnSizing;  
              property         OnMoved:   TNotifyEvent   read   FOnMoved   write   FOnMoved;  
              property         OnMoving:   TMovingEvent   read   FOnMoving   write   FOnMoving;  
              property         AllowSize:   boolean   read   FAllowSize   write   FAllowSize   default   True;  
              property         AllowMove:   boolean   read   FAllowMove   write   FAllowMove   default   True;  
              property         KeepInParent:   boolean   read   FKeepIn   write   FKeepIn   default   True;  
              property         HotTrack:   boolean   read   FHotTrack   write   FHotTrack;  
        end;  
   
        TInvisWin   =   class(TPanel)           //   This   could   also   derive   from   TPanel  
        protected  
              procedure   WndProc(var   Message:   TMessage);   override;  
              procedure   CreateParams(var   Params:   TCreateParams);   override;  
              procedure   WMDLGCode(var   Message:   TMessage);   message   WM_GETDLGCODE;  
        public  
              property     OnKeyDown;  
        end;  
   
        TMover   =   class(TInvisWin)  
        public  
              Buddy           :   TControl;  
              procedure   Show;  
        end;  
   
   
  //procedure   Register;  
   
  implementation  
   
  const  
        SIZE           =   6;  
        HALFSIZE   =   SIZE   div   2;  
   
  type  
        TSizer   =   class(TPanel)  
        end;  
        {  
  procedure   Register;  
  begin  
      RegisterComponents('Samples',   [TResizer]);  
  end;  
                        }  
   
  //   *****************************************************************  
  //   TInvisWin  
   
  procedure   TInvisWin.WndProc(var   Message:   TMessage);  
  var  
        ps   :   TPaintStruct;  
  begin  
        case   Message.Msg   of  
              WM_ERASEBKGND:   Message.Result   :=   1;  
              WM_PAINT:   begin  
                    BeginPaint(Handle,   ps);  
                    EndPaint(Handle,   ps);  
                    Message.Result   :=   1;  
              end;  
        else  
              inherited   WndProc(Message);  
        end;  
  end;  
   
  procedure   TInvisWin.CreateParams(var   Params:   TCreateParams);  
  begin  
        inherited;  
        Params.ExStyle   :=   Params.ExStyle   or   WS_EX_TRANSPARENT;  
  end;  
   
  procedure   TInvisWin.WMDLGCode(var   Message:   TMessage);  
  begin  
        Message.Result   :=   DLGC_WANTARROWS   or   DLGC_WANTALLKEYS;  
  end;  
   
   
  //   *****************************************************************  
  //   TMover  
   
  procedure   TMover.Show;  
  begin  
        Assert(Buddy   <>   nil);  
        BoundsRect   :=   Buddy.BoundsRect;  
        Parent           :=   Buddy.Parent;  
        Visible         :=   True;  
        BringToFront;  
  end;  
  Top

3 楼aiirii(ari-http://spaces.msn.com/members/aiirii/)回复于 2005-11-20 21:45:29 得分 0

constructor   TResizer.Create(AOwner:   TComponent);  
  begin  
        inherited;  
        FActive             :=   True;  
        FKeepIn             :=   True;  
        FGridX               :=   GRIDDEFAULT;  
        FGridY               :=   GRIDDEFAULT;  
        FAllowSize       :=   True;  
        FAllowMove       :=   True;  
        GroupMovers     :=   TList.Create;  
        Sizers               :=   TList.Create;  
   
        OneMover   :=   TMover.Create(Self);  
        CreateOneMover(OneMover,   nil);  
   
        CreateSizers;  
  end;  
   
  destructor   TResizer.Destroy;  
  begin  
        GroupMovers.Free;  
        Sizers.Free;  
        Sizers   :=   nil;  
        inherited;  
  end;  
   
  procedure   TResizer.Notification(AComponent:   TComponent;   Operation:   TOperation);  
  begin  
        inherited;  
        if   csDestroying   in   ComponentState   then   exit;  
        if   (AComponent   =   ResizeControl)   and   (Operation   =   opRemove)   then  
              ResizeControl   :=   nil;  
  end;  
   
  procedure   TResizer.SetActive(b:   boolean);  
  begin  
        if   b<>FActive   then   begin  
              FActive   :=   b;  
              CheckSizers;  
        end;  
  end;  
   
  procedure   TResizer.SetControl(c:   TControl);  
  begin  
        if   c   <>   FControl   then   begin  
   
              if   c<>nil   then   begin  
                    if   ResizeGroup<>nil   then   begin  
                          Assert(c.Parent   =   ResizeGroup,   'ResizeControl   is   not   in   ResizeGroup!');  
                          CurMover   :=   FindMoverByBuddy(c);  
                    end   else   begin  
                          CurMover   :=   OneMover;  
                          CurMover.Buddy   :=   c;  
                    end;  
                    CurMover.Show;  
              end;  
   
              FControl   :=   c;  
              CheckSizers;  
        end;  
  end;  
   
  procedure   TResizer.SetGroup(p:   TWinControl);  
  begin  
        if   p   <>   FGroup   then   begin  
              FGroup   :=   p;  
              CreateGroupMovers;  
        end;  
  end;  
   
  procedure   TResizer.CreateGroupMovers;  
  var  
        i   :   integer;  
        m   :   TMover;  
        c   :   TControl;  
  begin  
        if   csDesigning   in   ComponentState   then   exit;  
   
        //   Clear   out   the   old   Movers  
        for   i   :=   0   to   GroupMovers.Count-1   do  
              TObject(GroupMovers[i]).Free;  
        GroupMovers.Clear;  
   
        if   ResizeGroup   <>   nil   then   begin  
              for   i   :=   0   to   ResizeGroup.ControlCount-1   do   begin  
                    c   :=   ResizeGroup.Controls[i];  
                    if   (c   is   TMover)   or   (c   is   TSizer)   then   continue;  
   
                    m   :=   TMover.Create(Self);  
                    CreateOneMover(m,   c);  
                    GroupMovers.Add(m);  
                    m.Show;  
              end;  
        end;  
  end;  
   
  procedure   TResizer.CreateSizers;  
  var  
        i   :   integer;  
        p   :   TSizer;  
  begin  
        if   csDesigning   in   ComponentState   then   exit;  
   
        for   i   :=   0   to   7   do   begin  
              p   :=   TSizer.Create(Self);  
              Sizers.Add(p);  
   
              p.BevelOuter       :=   bvNone;  
              p.Width                 :=   SIZE;  
              p.Height               :=   SIZE;  
              p.Color                 :=   clBlack;  
              p.Caption             :=   '';  
              p.Tag                     :=   i;  
              p.OnMouseDown     :=   SizerDown;  
              p.OnMouseUp         :=   SizerUp;  
              p.OnMouseMove     :=   SizerMove;  
              p.TabStop             :=   False;  
   
              case   i   of  
                    0,   7     :   p.Cursor   :=   crSizeNWSE;  
                    2,   5     :   p.Cursor   :=   crSizeNESW;  
                    1,   6     :   p.Cursor   :=   crSizeNS;  
                    3,   4     :   p.Cursor   :=   crSizeWE;  
              end;  
        end;  
  end;  
   
  procedure   TResizer.CreateOneMover(m:   TMover;   c:   TControl);  
  begin  
        m.OnMouseDown   :=   MoverDown;  
        m.OnMouseUp       :=   MoverUp;  
        m.OnMouseMove   :=   MoverMove;  
        m.TabStop           :=   True;  
        m.OnKeyDown       :=   MoverKeyDown;  
        m.Buddy               :=   c;  
  end;  
   
  procedure   TResizer.CheckSizers;  
  begin  
        if   (ResizeControl<>nil)   and   Active   and   (not   (csDesigning   in   ComponentState))   then  
              ShowSizers  
        else  
              HideSizers;  
  end;  
   
  procedure   TResizer.ShowSizers;  
  var  
        i   :   integer;  
        p   :   TPanel;  
        c   :   TControl;  
  begin  
        c   :=   ResizeControl;  
        Assert(c   <>   nil);  
   
        for   i   :=   0   to   7   do   begin  
              p   :=   TPanel(Sizers[i]);  
              case   i   of  
                    0,   1,   2   :   p.Top   :=   c.Top   -   HALFSIZE;  
                    3,         4   :   p.Top   :=   c.Top   +   c.Height   div   2   -   HALFSIZE;  
                    5,   6,   7   :   p.Top   :=   c.Top   +   c.Height   -   HALFSIZE;  
              end;  
   
              case   i   of  
                    0,   3,   5   :   p.Left   :=   c.Left   -   HALFSIZE;  
                    1,         6   :   p.Left   :=   c.Left   +   c.Width   div   2   -   HALFSIZE;  
                    2,   4,   7   :   p.Left   :=   c.Left   +   c.Width   -   HALFSIZE;  
              end;  
        end;Top

4 楼aiirii(ari-http://spaces.msn.com/members/aiirii/)回复于 2005-11-20 21:46:35 得分 0

Assert(CurMover<>nil);  
        CurMover.Show;  
   
        for   i   :=   0   to   Sizers.Count-1   do   begin  
              p   :=   TPanel(Sizers[i]);  
              p.Parent     :=   c.Parent;  
              p.Visible   :=   True;  
              p.BringToFront;  
        end;  
   
        if   CurMover.HandleAllocated   and   CurMover.CanFocus   then  
              CurMover.SetFocus;  
  end;  
   
  procedure   TResizer.HideSizers;  
  var  
        i   :   integer;  
        p   :   TPanel;  
  begin  
        for   i   :=   0   to   Sizers.Count-1   do   begin  
              p   :=   TPanel(Sizers[i]);  
              p.Visible   :=   False;  
              p.Update;  
        end;  
        OneMover.Visible   :=   False;  
  end;  
   
  procedure   TResizer.SizerDown(Sender:   TObject;   Button:   TMouseButton;   Shift:   TShiftState;   X,   Y:   Integer);  
  begin  
        Sizing     :=   True;  
        DownX       :=   X;  
        DownY       :=   Y;  
        HideSizers;  
        ResizeControl.Parent.Update;  
        ResizeControl.Update;  
        OrigSize   :=   ResizeControl.BoundsRect;  
        NewSize     :=   OrigSize;  
        DrawSizeRect(NewSize);  
  end;  
   
  procedure   DoSwap(DoSwap:   boolean;   var   a,   b:   integer);  
  var  
        t   :   integer;  
  begin  
        if   DoSwap   then   begin  
              t   :=   a;  
              a   :=   b;  
              b   :=   t;  
        end;  
  end;  
   
  procedure   TResizer.SizerUp(Sender:   TObject;   Button:   TMouseButton;   Shift:   TShiftState;   X,   Y:   Integer);  
  begin  
        if   NewSize.Right   <   NewSize.Left   then  
              DoSwap(True,   NewSize.Right,   NewSize.Left);  
        if   NewSize.Bottom   <   NewSize.Top   then  
              DoSwap(True,   NewSize.Bottom,   NewSize.Top);  
   
        Sizing   :=   False;  
        DrawSizeRect(NewSize);  
        ResizeControl.Invalidate;  
        ResizeControl.BoundsRect   :=   NewSize;  
        ShowSizers;  
        if   Assigned(OnSized)   then   OnSized(Self);  
  end;  
   
  procedure   TResizer.SizerMove(Sender:   TObject;   Shift:   TShiftState;   X,   Y:   Integer);  
  begin  
        if   Sizing   then   begin  
              DrawSizeRect(NewSize);  
   
              if   AllowSize   then   begin  
                    Calc_Size_Rect((Sender   as   TSizer).Tag,   X   -   DownX,   Y   -   DownY);  
                    DoSizingEvent;  
              end;  
   
              DrawSizeRect(NewSize);  
              if   HotTrack   then   ResizeControl.BoundsRect   :=   NewSize;  
        end;  
  end;  
   
  procedure   TResizer.DoSizingEvent;  
  var  
        tmpWid,   tmpHgt     :   integer;  
  begin  
        tmpWid   :=   NewSize.Right   -   NewSize.Left;  
        tmpHgt   :=   NewSize.Bottom   -   NewSize.Top;  
        if   Assigned(OnSizing)   then  
              OnSizing(Self,   NewSize.Left,   NewSize.Top,   tmpWid,   tmpHgt);  
        NewSize.Right     :=   NewSize.Left   +   tmpWid;  
        NewSize.Bottom   :=   NewSize.Top   +   tmpHgt;  
  end;  
  Top

5 楼zhuangbx220(星)回复于 2005-11-20 21:57:13 得分 20

//不需要控件就可以移动  
   
  procedure   TForm1.Button1MouseDown(Sender:   TObject;   Button:   TMouseButton;  
      Shift:   TShiftState;   X,   Y:   Integer);  
  begin  
        m_Move:=true;  
  end;  
   
  procedure   TForm1.Button1MouseMove(Sender:   TObject;   Shift:   TShiftState;   X,  
      Y:   Integer);  
  begin  
        if   m_Move   then  
        begin  
              ReleaseCapture();  
              SendMessage(Button1.Handle   ,     WM_NCLBUTTONDOWN,   HTCAPTION,   0);  
        end;  
  end;  
   
  procedure   TForm1.Button1MouseUp(Sender:   TObject;   Button:   TMouseButton;  
      Shift:   TShiftState;   X,   Y:   Integer);  
  begin  
        m_Move:=false;  
  end;Top

6 楼zzzl(不拉拉链)回复于 2005-11-20 22:44:23 得分 0

zhuangbx220(星)    
  我要让很多标准控件都具体这种能力,一个个写过来很麻烦的,更重要的是,用你的思路想调整控件大小很困难的Top

7 楼zzzl(不拉拉链)回复于 2005-11-20 22:54:00 得分 0

aiirii(ari-http://spaces.msn.com/members/aiirii/)  
  那个组件是个需要继承的类吗?有没有sample?Top

8 楼Cassava(车超)回复于 2005-11-21 10:21:50 得分 140

Developer   Express系列中的ExpressForumLibrary中的TdxfDesigner就可以实现你的功能,下载地址就不用我说了吧,到处都是的,而且有例子的Top

相关问题

  • 高分求控件
  • 高分求:TVideocap控件!高分求:TVideocap控件!高分求:TVideocap控件!
  • 高分求购leadtools控件
  • 高分求打印控件……
  • 高分求助:DBGrid控件
  • 控件的问题,高分
  • BarCode控件(高分求解)
  • 高分求购控件
  • 高分索取vb.net控件!
  • 高分寻两控件

关键词

  • 控件
  • tresizer
  • boolean
  • integer

得分解答快速导航

  • 帖主:zzzl
  • aiirii
  • zhuangbx220
  • Cassava

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo