如何实现运行时能够像设计时一样 点击组件,组件周围出现八个矩形区域
鼠标移到矩形区域上可以托动,改变组件的大小,位置等

解决方案 »

  1.   

    用这个,然后在鼠标的Move事件中使用。procedure ManipulateControl(WinControl: TWinControl; Shift: TShiftState;
      X, Y, Precision: integer);
    var SC_MANIPULATE: Word;
    begin
      //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      //光标在控件的最左侧**********************************************************
      //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           if (X<=Precision) and (Y>Precision) and (Y<WinControl.Height-Precision)
      then begin
             SC_MANIPULATE  := $F001;
             WinControl.Cursor := crSizeWE;
           end
      //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      //光标在控件的最右侧**********************************************************
      //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      else if (X>=WinControl.Width-Precision) and (Y>Precision) and (Y<WinControl.Height-Precision)
      then begin
             SC_MANIPULATE  := $F002;
             WinControl.Cursor := crSizeWE;
           end
      //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      //光标在控件的最上侧**********************************************************
      //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      else if (X>Precision) and (X<WinControl.Width-Precision) and (Y<=Precision)
      then begin
             SC_MANIPULATE  := $F003;
             WinControl.Cursor := crSizeNS;
           end
      //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      //光标在控件的左上角**********************************************************
      //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      else if (X<=Precision) and (Y<=Precision)
      then begin
             SC_MANIPULATE  := $F004;
             WinControl.Cursor := crSizeNWSE;
           end
      //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      //光标在控件的右上角**********************************************************
      //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      else if (X>=WinControl.Width-Precision) and (Y<=Precision)
      then begin
             SC_MANIPULATE  := $F005;
             WinControl.Cursor := crSizeNESW    ;
           end
      //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      //光标在控件的最下侧**********************************************************
      //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      else if (X>Precision) and (X<WinControl.Width-Precision) and (Y>=WinControl.Height-Precision)
      then begin
             SC_MANIPULATE  := $F006;
             WinControl.Cursor := crSizeNS;
           end
      //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      //光标在控件的左下角**********************************************************
      //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      else if (X<=Precision) and (Y>=WinControl.Height-Precision)
      then begin
             SC_MANIPULATE  := $F007;
             WinControl.Cursor := crSizeNESW;
           end
      //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      //光标在控件的右下角**********************************************************
      //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      else if (X>=WinControl.Width-Precision) and (Y>=WinControl.Height-Precision)
      then begin
             SC_MANIPULATE  := $F008;
             WinControl.Cursor := crSizeNWSE;
           end
      //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      //光标在控件的客户区(移动整个控件)******************************************
      //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      else if (X>5) and (Y>5) and (X<WinControl.Width-5) and (Y<WinControl.Height-5)
      then begin
             SC_MANIPULATE  := $F009;
             WinControl.Cursor := crSizeAll;
           end
      else begin
             SC_MANIPULATE := $F000;
             WinControl.Cursor := crDefault;
           end;
      //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      if Shift=[ssLeft] then
      begin
        ReleaseCapture;
        WinControl.Perform(WM_SYSCOMMAND, SC_MANIPULATE, 0);
      end;
    end;
      

  2.   

    谢过楼上的!
    我的说明有“点击组件,组件周围出现八个矩形区域”一句,你的没有实现
    且对于TLABEL这样的做法是不行的。
      

  3.   

    如果完全按照你所说的去做,难度非常大。
    上面的代码只对从TWinControl继承下来的VCL控件有效。
    TLabel可以使用TStaticText来替代。
      

  4.   

    1、画出来,得自己捕捉焦点
    2、使用Windows控件
      

  5.   

    自己处理MouseDown,MouseUp等事件,在MouseDown时动态生成8个小控件(可以用TPanel之类的),并且在鼠标拖动这8个小控件时,自动更新主体。如果要加上多选的功能就更复杂了,一句两句说不清楚的。。