请教!!类似象棋棋子在棋盘上拖动如何实现? 我是个新手!试图自己做一个类似象棋的小游戏,但是不知道怎样处理棋子的拖动问题?请教各位!------------------------------------------------------------------------- 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 棋子处理OnStartDrag事件棋盘处理OnDragOver事件,如果是棋子发出的拖动则接受之棋盘处理OnDragDrop事件,改变棋子位置 你先实现一个能拖动的TImage来试试可以用OnMouseDown等Mouse消息 我给你一个可以拖动任何可视化控件的例子,你一定能写出你要的结果!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. 这么长?:)小兄弟要晕了... ...其实也很简单~先把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; delphi鼠标响应事件 Indy IoHandle 的Write问题 求基于三汇板卡的呼叫中心软件.要求稳定第一,通用功能既可.请QQ联系 【服务帖】接受倒分投诉以及建议 如何根据类名定义一个变量,并生成这个类的实例?注意:这个“类名”是一个字符串变量 【Gabing Delva 第2篇】 有没有人做过管理软件的演示程序 菜鸟数据库问题,大侠们帮帮吧!!!!! 高手请进,delphi不能实现*.swf的透明?! 如何使用clientDataSet控件进行对某一字段求总和,跳楼大甩分,割脉献血!!! 请问大家这样的一个数据库该如何设计(200分!!,另开贴) 画图????????
棋盘处理OnDragOver事件,如果是棋子发出的拖动则接受之
棋盘处理OnDragDrop事件,改变棋子位置
可以用OnMouseDown等Mouse消息
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.
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;