如何选中一条直线?
小弟在做一个画笔程序,需要可以将画好的直线删除,移动,缩放等等。
大家看看我得思路有什么问题:
1、每画好一条直线,当mouseup时,将其两个端点坐标记入一个二维数组,比如第
一条直线坐标记为a[1][1],a[1][2],第二条直线记为a[2][1],a[2][2]。
2、当我的鼠标点在直线上时,此直线处于选中状态,判断mousedown的坐标是在直线
中部,还是在两个端点。若是中部,那么将作的是删除或移动,在直线两端加上
两个小方框,;若是端点,那么将是作缩放(就是一个端点不动,选(点击)中的
端点随着鼠标的移动而移动),只在一个端点加一个小方框。
3、当删除时,在坐标数组中找出此直线的端点坐标,在此两点再画一条直线,异或
掉原来的。
4、当移动时,记录mouseup时的坐标差,在坐标数组中找出此直线的端点坐标,先在
原位置画线,加上坐标差后再画一条。
5、当缩放时,若点击的为终点ep(画线代码见后),则按程序中的画线方法再画一
次;若点击的是起点sp,则要先将sp、ep对调,再画线。由于两点画线的函数用
的次数太多,我想做成一个子程序随时调用。
整个程序和word中的画图功能基本相同。
问题是:
1、如何将我画好的线标号,使line1对应a[1][1]、a[1][2],line2对应a[2][1]、a
[2][2]?
2、如何判断我的点击是否在直线上,就是:点(x,y)是否在(x1,y1)、(x2,y2)这条
直线上(实际上是在这条直线的周围一个小区域内就行)?
附:画直线部分的代码(我的程序要比这要复杂,要有水平线,竖直线等,这是其中比较关键的部分代码)
bool IsDraw=false;
TPoint ep,sp;
void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
if(Button==mbLeft)
{
IsDraw=true;
sp=ep=Point(X,Y);
Canvas->Pen->Width=2;
Canvas->Pen->Color=clRed ^ ColorToRGB(Color);
Canvas->Pen->Mode=pmXor;
Canvas->PenPos=sp;
Canvas->LineTo(ep.x,ep.y);
}
}
void __fastcall TForm1::FormMouseMove(TObject *Sender, TShiftState Shift,
int X, int Y)
{
if(IsDraw==true)
{
Canvas->PenPos=sp;
Canvas->LineTo(ep.x,ep.y);
ep=Point(X,Y);
Canvas->PenPos=sp;
Canvas->LineTo(ep.x,ep.y);
}
}
void __fastcall TForm1::FormMouseUp(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
if(IsDraw==true)
IsDraw=false;
}