我是个新手!试图自己做一个类似象棋的小游戏,但是不知道怎样处理棋子的拖动问题?请教各位!
-------------------------------------------------------------------------

解决方案 »

  1.   

    棋子处理OnStartDrag事件
    棋盘处理OnDragOver事件,如果是棋子发出的拖动则接受之
    棋盘处理OnDragDrop事件,改变棋子位置
      

  2.   

    你先实现一个能拖动的TImage来试试
    可以用OnMouseDown等Mouse消息
      

  3.   

    我给你一个可以拖动任何可视化控件的例子,你一定能写出你要的结果!
    unit AddSizer;interfaceuses
      Classes, Windows, Messages, Controls, StdCtrls, Graphics,Dialogs,SysUtils;const
      sc_DragMove: Longint = $F012;
    type
      TAddSizerControl = class(TCustomControl)
      private
        FRectList: array[1..8] of TRect;
        FPosList : array[1..8] of Integer;
      public
        FControl : TControl;
        constructor Create(AOwner: TComponent; AControl: TControl);
        procedure CreateParams(var Params: TCreateParams); override;
        procedure CreateHandle; override;
        procedure WmNcHitTest(var Msg: TWmNcHitTest); message wm_NcHitTest;//Êó±êÒƶ¯µÄʱºò´¥·¢£¬»òbutton°´Ï»òÊͷŵÄʱºò
        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 SizerControlExit(Sender: TObject);
        procedure WmLButtonDblClk(var Msg: TWMLButtonDblClk); message WM_LBUTTONDBLCLK;
        procedure WmKeyDown(var Msg: TWmKeyDown); message WM_KeyDown;
      end;implementationconstructor TAddSizerControl.Create(AOwner: TComponent; AControl: TControl);
    var
      R: TRect;
    begin
      inherited Create(AOwner);
      FControl := AControl;                      (*panel1,edit4*)
      OnExit := SizerControlExit;  // set the size and position
      R := FControl.BoundsRect;
      InflateRect(R, 1, 1);//´°Ìå´óС¸Ä±ä
      BoundsRect := R;
      Parent := FControl.Parent;  // create the list of positions
      FPosList[1] := htTopLeft; //13
      FPosList[2] := htTop;     //12
      FPosList[3] := htTopRight;
      FPosList[4] := htRight;
      FPosList[5] := htBottomRight;
      FPosList[6] := htBottom;
      FPosList[7] := htBottomLeft;
      FPosList[8] := htLeft;
    end;procedure TAddSizerControl.CreateHandle;
    begin
      inherited CreateHandle;
      SetFocus;
    end;procedure TAddSizerControl.CreateParams (var Params: TCreateParams);
    begin
      inherited CreateParams(Params);
      Params.ExStyle := Params.ExStyle +ws_ex_Transparent; //$20;
    end;procedure TAddSizerControl.Paint;
    var
      I: Integer;
    begin              //»­±ß¿ò
      Canvas.Brush.Color := clred;
      for I := 1 to  8 do
        Canvas.Ellipse(FRectList[I].Left, FRectList[I].Top, FRectList[I].Right, FRectList[I].Bottom);
        Canvas.Brush.Color:=$00CCCABF;
        Canvas.Rectangle(Width-20,3,width-3,Height-2);
    end;procedure TAddSizerControl.WmNcHitTest(var Msg: TWmNcHitTest);
    var
      Pt: TPoint;
      I: Integer;
    begin         //¼Ç¼ÁËÊó±êÒƶ¯µÄµã¡£//ÊÇÕë¶ÔÄãËù´´½¨µÄ´°Ìå¶øÑԵģ¬ÕâÀï¾ÍÊÇ Medit4
      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 the return value was not set
      if Msg.Result = 0 then
        inherited;
    end;procedure TAddSizerControl.WmSize (var Msg: TWmSize);
    var
      R: TRect;
    begin
      R := BoundsRect;
      InflateRect(R, -1, -1);//¸Ä±äÖ¸¶¨ÇøÓòµÄ´óС
      FControl.BoundsRect := R;
        // setup data structures //×ø±ê¶¼ÊǶÔedit4¶øÑÔµÄ
      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 TAddSizerControl.SizerControlExit (Sender: TObject);
    begin
       Free;
    end;procedure TAddSizerControl.WmLButtonDown (var Msg: TWmLButtonDown);
    begin
      Perform(wm_SysCommand, sc_DragMove, 0);
    end;procedure TAddSizerControl.WmMove (var Msg: TWmMove);
    var
      R: TRect;
    begin
      R := BoundsRect;
      InflateRect(R, -1, -1);
      FControl.Invalidate; // repaint entire surface
      FControl.BoundsRect := R;
    end;procedure TAddSizerControl.WmLButtonDblClk(var Msg: TWMLButtonDblClk);
    begin
       FControl.Visible := False;
       SendMessage(TWinControl(FControl.Owner).Handle,WM_USER+100,0,0);
       Free;
    end;procedure TAddSizerControl.WmKeyDown(var Msg: TWmKeyDown);
    begin
       if Msg.CharCode=46 then
       begin
          FControl.Visible := False;
          SendMessage(TWinControl(FControl.Owner).Handle,WM_USER+100,0,0);
          Free;
       end;
    end;end.
      

  4.   

    这么长?:)小兄弟要晕了... ...其实也很简单~先把Tshape控件改装一下,让它变成个棋子... ...然后在这个图形的onmousedown,onmousemove,onmouseup事件中处理一下:
    procedure TForm1.Shape1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
      if flag=true then
      begin
      shape1.Left:=shape1.Left+x;
      shape1.top:=shape1.Top+y;
      end;
    procedure TForm1.Shape1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      flag:=true;
    end;