本人菜鸟,想用 canvas 作一个圆形的围棋盘,具有放大功能。 (230分)

  • 主题发起人 主题发起人 hoho5999
  • 开始时间 开始时间
H

hoho5999

Unregistered / Unconfirmed
GUEST, unregistred user!
本人菜鸟,想用 canvas 作一个圆形的围棋盘,圆棋盘大小固定 200,但每一个格子可以自定义颜色,大小,遇到圆边面积不满一格则不画;全图具有放大功能,左键从左到右框选放大框选的部分,从右到左框选恢复原图,摁住右键可移动图片,支持鼠标中键滚动 zoom in/out 最好。而且,鼠标移动到每格会有tip提示【左x上y】该格坐标。很难哦!!!!!!

因为初学delphi,最好有 source code 参考,谢谢高手!也可以 Email 联系。hoho5999@etang.com,谢谢。
 
给你点提示:
1:每一格的颜色设置:canvas.pen.color:=你的颜色;
2:格子大小:canvas.Rectangle(1,1,100,100) //大小自己设
3:放大呢可以用canvas.copyrect(rect1,canvas,rect2)语句来实现
4:关于TIP呢:可以在FORM的MOUSEMOVE事件中得到某点的X,Y,然后再去判断.就OK.

这只是个人的一点理解.不当之处请指正.
 
楼上说的没错.
 
肯定是不难的,只是代码很多。
要写控件。谁有这么多时间?
最好你遇到什么具体的问题,就发问。

3:放大呢可以用canvas.copyrect(rect1,canvas,rect2)语句来实现(不好,。。。)
 
哎,我也不是不想做,可是delphi只是刚入门,老板却要做一个这样的 plugin ,无从下手啊。以前只是做过一个简单的 pooler三层数据库小软件,别的都没什么经验,连控件的用法都不太熟悉。大侠给点门路吧?
 
1、你的问题表述有问题,“圆棋盘大小固定 200,但每一个格子可以自定义颜色,大小”不是每一个格子都可以定义大小吧?是格子都一样大,但可以定义他们有多大吧!还有你的格子是按网格状划分排列的,还是行列对不齐,只是要添满圆棋盘。

2、属于数学上的问题就不说了,如何计算它们的位置。缩放从根本上讲也是数学问题,跟控制关系不大。

3、如何做:

首先将每一个格子都看作是一个类,为它们定义一个类
TCell=class
private
AOwner:TControl;//用于在画图前调用提供逻辑单位到设备单位的转换的函数
public
constructor create(AOwner:TControl);virtual; //这个AOwner:TControl是你的画布所在的控件。提供逻辑单位到设备单位的转换---用在缩放时计算新的坐标。
destructor destroy;override;
procedure draw(ACanvas:TCanvas;ARect:TRect);//ARect:TRect 你的画布的大小,超出去的就不画了,这个参数主要是提高速度,根据计算的数据量大小,也可以不要。
procedure NeeedDraw(ARect:TRect);//如果上一个函数带ARect:TRect 参数,这里做判断,判断你的格子是否和ARect:TRect 相交,如果相交就画它,否则不画。
function Intersects(const APoint:TPoint):boolean; //判断APoint(就是鼠标的点)是否在格子里。
published
property Site:TRect //计算得来的位置。
property Color:TColor //刷子的颜色。
property LineColor:TColor //边线的颜色
property Col:integer; //列
property Row:integer;//行
......
end;

因为在这个程序里圆盘是固定逻辑大小的,所以是否定义一个圆盘的父类,由它自动生成子类(格子)的集合就由你自己考虑了。

大致的流程可以这样:
圆盘大小有了,知道格子大小,在圆盘里封装或另外定义一个专门封装格式算法的抽象类(供提供不同的算法)。计算出格子的大小和数目、行列位置,添加到一个由圆盘类维护的LIST里。第一次生成棋盘后,在绘图控件的ONPAINT中循环调用所有格子的DRAW函数。以后每次放大或缩小、移动时都重绘一次即可。在鼠标事件中调用每一个格子的Intersects,将返回真值的col、row显示出来就可以了。
 
有个控件叫EasyGraph,或xygraphni
你可以参考一下。
 
to wk_knife,
在哪里有 code 可以看?
 
已给你发了邮件,附件是EasyGraph,查收
 
收到了,谢谢
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
872
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
后退
顶部