请教image控件的使用问题 ( 积分: 40 )

  • 主题发起人 主题发起人 siso
  • 开始时间 开始时间
S

siso

Unregistered / Unconfirmed
GUEST, unregistred user!
我在学习五子棋程序,界面中加了两个image,image2的picture属性为棋盘的图片,
image1的picture属性为棋子 。为了效果,我让棋子图片(image1)随鼠标移动。
大概代码如下:这时由于移动的棋子图片image1挡住了自己,所以没办法下子(填充image1)。
除非修改坐标,例如x,y分别减30才可以,如下:
请问有什么办法不改变x,y坐标也能实现(不然移动的棋子就和下(填充)的位置看起来不一致的感觉了)。
我也不知这样加载图形对否,或者应该怎样加载.
谢谢!!

procedure TForm1.Image2MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
image1.left:=x; 这里改为image1.left:=x-30;
image1.Top:=y; 这里改为image1.left:=y-30;
end;

procedure TForm1.Image2MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
image2.Canvas.Draw(x,y,image1.picture.Graphic);
end;
 
我在学习五子棋程序,界面中加了两个image,image2的picture属性为棋盘的图片,
image1的picture属性为棋子 。为了效果,我让棋子图片(image1)随鼠标移动。
大概代码如下:这时由于移动的棋子图片image1挡住了自己,所以没办法下子(填充image1)。
除非修改坐标,例如x,y分别减30才可以,如下:
请问有什么办法不改变x,y坐标也能实现(不然移动的棋子就和下(填充)的位置看起来不一致的感觉了)。
我也不知这样加载图形对否,或者应该怎样加载.
谢谢!!

procedure TForm1.Image2MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
image1.left:=x; 这里改为image1.left:=x-30;
image1.Top:=y; 这里改为image1.left:=y-30;
end;

procedure TForm1.Image2MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
image2.Canvas.Draw(x,y,image1.picture.Graphic);
end;
 
我建议用光标来做,做两个棋子的光标代替默认的光标.

很少人用图片吧.
 
先谢谢oiwin
我的意思是不考虑鼠标 的形状,就是棋子移到哪 例如: (50,50),单击,则在(50,50)处填充棋子.
就像我们在盖章一样,章移到哪,单击,下面也就显示该图案.
 
procedure TForm1.Image2MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
image2.Canvas.Draw(x-image1.width/2,y-image1.height/2,image1.picture.Graphic);
end;
 
鼠标移到50,50,假设棋子大小是20×20,那么棋子目标位置应该是40,40,这个偏移你考虑没?
另外,应该像oiwin说的,用光标来做
如果要像你现在这样的话,在鼠标落子的时候得有消息通知父窗体
 
不要让棋子跟着鼠标移动,这样会显得很不自然!
让鼠标选选定下一步的位置,判断可行后,再让棋子移过去!
 
另外,应该像oiwin说的,用光标来做
 
就象网页上的鼠标跟随?用image实现估计不太好吧
 
先谢谢大家,我刚学delphi,请问用光标该如何做.谢谢!
 
至于islet8大哥说的我有考虑过,这里我只是先简化了来请教大家.
在实际程序中有进行偏移,能实现棋子只落在棋盘交叉点,即移动鼠标时棋子图只会落到交叉点了
但就是棋子跟着移动后就没有办法下子(填充)了.

我没有试过用光标,一来我确实没有想到,二来这样就不能让鼠标移动时只让棋子落在交叉点的效果了.
 
Woooo大哥的方法好像不能通过编译
[Error] Unit1.pas(54): Incompatible types: 'Integer' and 'Extended'
 
有点理解了。
比如网格大小是20,棋子大小是16
那点击
procedure TForm1.Image2MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var dx,dy:integer;
begin
dx:=((x+10) div 20)*20-8;
dy:=((y+10) div 20)*20-8;
image2.Canvas.Draw(dx,dy,image1.picture.Graphic);
end;
 
image1用于存棋子图片是可以(不过最好用资源文件比较好点~),image2的onMouseDown如Woooo写的不错,另外在image2的onMouseMove里判断当前鼠标位置是否在以某个棋盘十字交点为圆心的一定范围内,如果在就把image2的当前cursor属性设为一个棋子形(放在资源文件里的,我以前偷懒就直接用自带的手形鼠标样式表示了),若不在该圆形范围内(即不可落子)则就恢复普通箭头形
 
谢谢大家的帮助!
不过Woooo大哥的代码实现的是下棋(即单击时)使棋子下在交叉线处,这点我已经解决了!
我的问题是棋子图片在没有单击之前随着移动,单击时被棋子图片自己挡住了.

下面是在CSDN得到的帮助,那位大哥heluqing解答了该问题.
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin

image2MouseUp(image2,button,shift,x+image1.Left,y+image1.Top);
end;

procedure TForm1.Image2MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
image2.Canvas.Draw(x,y,image1.Picture.Graphic);
end;

procedure TForm1.Image2MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
image1.Left:=X;
image1.Top:=Y;
end;
不过还是要谢谢大家的热心解答!谢谢大家!!!
 
汗。。我们说的就是这个代码所表示的。。
 

Similar threads

F
回复
3
查看
147
fl0603
F
回复
7
查看
197
夏雨天
S
回复
4
查看
341
sundayyoung
S
后退
顶部