主要是能达到:点击form上的元件,会显示被选择(8个黑点),可以move,resize这样的功能就行了

解决方案 »

  1.   

    代码如下:
    procedure TForm1.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;然后在按钮的鼠标事件中写如下代码(注意,一定要是窗口组件才可以):
    procedure TForm1.Button1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
      Caption := IntToStr(X) + '/' + IntToStr(Y);
      ManipulateControl((Sender as twincontrol), Shift, X, Y, 10);
    end;
      

  2.   

    to:wdsimon(老王(路漫漫其修远兮,吾将上下而求索)) 还有问题:一个是元件多选,一个是多层元件,既要能自由控制,又不能改变原状态