首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

关于运行期间时对控件像设计期间的控制,该如何解决

2012-03-01 
关于运行期间时对控件像设计期间的控制现有以下难点:1.在运行期间可以用鼠标改变控件的大小和拖动位置,现

关于运行期间时对控件像设计期间的控制
现有以下难点:    
1.在运行期间可以用鼠标改变控件的大小和拖动位置,现在的问题是,如何多选或者用Shift和Ctrl键改变控件的位置和大小    
2.如何在运行期间显示各个控件的TabOrder值出来(如CnPack那样)    
 
以下是运行运行时只能用鼠标移动和改变控件大小的代码    
procedure     TForm1.Panel1MouseDown(Sender:     TObject;     Button:     TMouseButton;    
      Shift:     TShiftState;     X,     Y:     Integer);    
const    
      SC_DragMove     =     $F012;     //     a     magic     number    
begin    
      ReleaseCapture;    
      (Sender     as     TWinControl).Perform(wm_SysCommand,     SC_DragMove,     0);    
end;    
 
////////////////////////////////////    
unit     Unit2;    
 
interface    
 
uses    
      Windows,     Messages,     SysUtils,     Classes,     Graphics,     Controls,    
      Forms,     Dialogs;    
 
type    
      TSizerControl     =     class(TCustomControl)    
      private    
              FControl:         TControl;    
              FRectList:     array     [1..8]     of     TRect;    
              FPosList:         array     [1..8]     of     integer;    
              {             Private             declarations             }    
              procedure     Drawreg;    
      protected    
              {             Protected             declarations             }    
      public    
              constructor     Create(AOwner:     TComponent;     AControl:     TControl);    
              procedure     CreateParams(var     Params:     TCreateParams);     override;    
              procedure     Createhandle;     override;    
              procedure     WmNcHitTest(var     Msg:     TWmNcHitTest);     message     wm_NcHitTest;    
              procedure     WmSize(var     Msg:     TWmSize);     message     wm_Size;    
              procedure     WmLButtonDown(var     Msg:     TWmLButtonDown);     message     wm_LButtonDown;    


              procedure     WmMove(var     Msg:     TWmMove);     message     Wm_Move;    
              procedure     Paint;     override;    
              procedure     SizeControlExit(Sender:     TObject);    
              {             Public             declarations             }    
      published    
              {             Published             declarations             }    
      end;    
 
const    
      sc_DragMove:     longint     =     $F012;    
 
 
implementation    
 
constructor     TSizerControl.Create(AOwner:     TComponent;     AControl:     TControl);    
var    
      R:     TRect;    
begin    
      inherited         Create(AOwner);    
      FControl     :=     AControl;    
      OnExit             :=     SizeControlExit;    
      R     :=     FControl.BoundsRect;    
      InflateRect(R,     2,     2);    
      BoundsRect         :=     R;    
      Parent                         :=     FControl.Parent;    
      FPosList[1]     :=     htTopLeft;    
      FPosList[2]     :=     htTop;    
      FPosList[3]     :=     htTopRight;    
      FPosList[4]     :=     htRight;    
      FPosList[5]     :=     htBottomRight;    
      FPosList[6]     :=     htBottom;    
      FPosList[7]     :=     htBottomLeft;    
      FPosList[8]     :=     htLeft;    
end;    
 
procedure     TSizerControl.CreateParams(var     Params:     TCreateParams);    
begin    
      inherited         CreateParams(Params);    
      //增加透明特性    
      Params.ExStyle     :=     Params.ExStyle     +     WS_EX_TRANSPARENT;    
end;    
 
procedure     TSizerControl.Drawreg;    
var    
      I:     integer;    
begin    
      Canvas.Brush.Color     :=     clNavy     ;//$0024FF24;    


      for     I     :=     1     to     8     do    
              with     FRectList[I]     do    
                      Canvas.Rectangle(Left,     Top,     Right,     Bottom);    
 
end;    
 
procedure     TSizerControl.Createhandle;    
begin    
      inherited     Createhandle;    
      SetFocus;    
end;    
 
procedure     TSizerControl.WmNcHitTest(var     Msg:     TWmNcHitTest);    
var    
      Pt:     TPoint;    
      I:         integer;    
begin    
      Pt     :=     Point(Msg.XPos,     Msg.YPos);    
      Pt     :=     ScreenToClient(Pt);    
      Msg.Result     :=     0;    
      //检测鼠标位置并改变状态    
      for     I     :=     1     to     8     do    
              if     PtInRect(FRectList[I],     Pt)     then    
                      Msg.Result     :=     FPosList[I];    
      if     Msg.Result     =     0     then    
              inherited;    
end;    
 
procedure     TSizerControl.WmSize(var     Msg:     TWmSize);    
var    
      R:     TRect;    
begin    
      R     :=     BoundsRect;    
      InflateRect(R,     -2,     -2);    
      FControl.BoundsRect     :=     R;    
      //计算8个黑方框    
      FRectList[1]     :=     Rect(0,     0,     5,     5);    
      FRectList[2]     :=     Rect(Width     div     2     -     3,     0,     Width     div     2     +     2,     5);    
      FRectList[3]     :=     Rect(Width     -     5,     0,     Width,     5);    
      FRectList[4]     :=     Rect(Width     -     5,     Height     div     2     -     3,     Width,     Height     div     2     +     2);    
      FRectList[5]     :=     Rect(Width     -     5,     Height     -     5,     Width,     Height);    


      FRectList[6]     :=     Rect(Width     div     2     -     3,     Height     -     5,     Width     div     2     +     2,     Height);    
      FRectList[7]     :=     Rect(0,     Height     -     5,     5,     Height);    
      FRectList[8]     :=     Rect(0,     Height     div     2     -     3,     5,     Height     div     2     +     2);    
end;    
 
procedure     TSizerControl.WmLButtonDown(var     Msg:     TWmLButtonDown);    
begin    
      //执行拖动命令    
      Perform(Wm_SysCommand,     sc_DragMove,     0);    
      Self.Drawreg;    
end;    
 
procedure     TSizerControl.WmMove(var     Msg:     TWmMove);    
var    
      R:     TRect;    
begin    
      R     :=     BoundsRect;    
      InflateRect(R,     -2,     -2);    
      FControl.Invalidate;    
      FControl.BoundsRect     :=     R;    
      Drawreg;    
end;    
 
procedure     TSizerControl.Paint;    
begin    
      Drawreg;    
end;    
 
procedure     TSizerControl.SizeControlExit(Sender:     TObject);    
begin    
      Free;    
end;    
 
end.    


[解决办法]
不怎么懂,up下
[解决办法]
To 楼主
做个这方面的东西,有一个Dsn的控件可以满足你的要求,且可以多选,设置属性等,有源码,要的话留下邮箱,大家一起探讨

热点排行