C++builder下Image图像清除问题

来源:百度知道 编辑:UC知道 时间:2024/09/21 01:21:10
最近在做围棋程序,需要对棋子实现动态显示和清除。实现的方法是:棋盘图像Image1作为背景,黑子图像为Image2,白子为Image3,根据在棋盘的点击事件(Image1 OnMouseDown) 计算出坐标,然后用DRAW方法将棋子画在Image1上面。现在的问题是,显示棋子时用DRAW方法画上去可以,但清除棋子时再用DRAW方法效果不好,比如在棋盘边界。所以请教该如何实现在已知坐标的情况下,清除图像的方法。
因为是棋盘上棋子是根据在棋盘的点击事件动态画上去的,所以不能用Delete方法实现,请教各路高人。
达到的效果如图:

void __fastcall TForm1::DisplayChess(int x,int y,char c)
{ if(c=='B')
{Image1->Canvas->Draw(((x-1)*32+40)-28,((y-1)*32+16)-16,Image2->Picture->Graphic);
Stepnum++;}
else if(c=='W')
{
Image1->Canvas->Draw(((x-1)*32+40)-28,((y-1)*32+16)-16,Image3->Picture->Graphic);
Stepnum++;
}
else if(c=='C')
{Image1->Canvas->Draw(((x-1)*32+40)-28,((y-1)*32+16)-16,Image5->Picture->Graphic);
}
1楼能再说明得详细点吗,比如用什么控件实现,大概有哪些步骤。双缓冲的作用不是防止闪烁吗,这里的作用是?
2楼的方法可行,但问题是要达到比较好的效果,对空棋盘的截图要非常准确才行(精确到像素),这个很难实现,试了

难啊,还没学到这个程度,帮你顶一下,吼吼

1,按照你现在的处理方法,用Draw画上去,清除的时候要把以前的背景图再'画'上去,这样的处理方法简单,但算法上会麻烦一些。要处理很多的背景图,特别是四边的图块和角上的,最少要9个才行。 跟据你要画上去的黑白棋子的坐标(你计算好的),调用不同的背景图。
你可以建立一个对应的image数组,存放这9个背景图,
在调用的时候动态取出,以达到清除的效果,就如你代码中的Image5->Picture->Graphic

可以改成数组Image5[]。

2,另一种方法就是把背景图做为一个图层,棋子用Image控件做为显示,设置以透明色,放在背景图的上面,这样你不用考虑清除的问题了,如楼上说的一样,只控制显示与否即可,可以动态生成image棋子,也可以一开始就初始化好所有的棋子。

为什么不用控件代替呢?控制是否显示就是了,在这黑白方点的事件分别不一样,控件也响应不一样的事件。不过这样做消耗会多很多!
另外一个就是画图时候用双缓冲!