做一个简单的示例吧,这里只处理了一种情况,就是一左上Image,一右下Image,
把左上Image的(Left+Width,Top)与右下的(Left,Top+Height)连接起来,还需要具体的处理
TLine = class(TGraphicControl)
private
{ Private declarations }
FImage1: TImage;
FImage2: TImage;
procedure CalcPosition;
procedure SetImage1(AValue: TImage);
procedure SetImage2(AValue: TImage);
protected
{ Protected declarations }
procedure WMPaint(var Msg: TWMPaint); message WM_PAINT;
procedure WMLButtonDowm(var Msg: TWMLButtonDown); message WM_LBUTTONDOWN;
public
{ Public declarations }
published
{ Published declarations }
property Image1: TImage read FImage1 write SetImage1;
property Image2: TImage read FImage2 write SetImage2;
end;
procedure Register;
implementation
procedure TLine.WMPaint(var Msg: TWMPaint);
begin
with Canvas do
begin
Lock;
Brush.Style:=bsClear;
FillRect(Canvas.ClipRect); //使其他部分透明
if (not Assigned(Image1)) or (not Assigned(Image2)) then
Exit;
Brush.Style:=bsSolid;
Pen.Color:=clBlack; //画直线,颜色
Pen.Width:=3; //线宽度
MoveTo(0,0);
LineTo(Width,Height);
UnLock;
end;
end;
procedure TLine.CalcPosition;
begin //根据两个Image的位置计算TLine的大小、位置,决定如何画线,在Image移动后重新调用本方法
if (not Assigned(Image1)) or (not Assigned(Image2)) then
Exit;
Left:=Image1.Left+Image1.Width; //这里只处理了一种情况
Top:=Image1.Top; //需要对此处扩充,以处理所有不同的情况
Width:=Image2.Left-Left; //正确的画线
Height:=Image2.Top+Image2.Height-Top;
Repaint;
end;
procedure TLine.SetImage1(AValue: TImage);
begin
FImage1:=AValue;
CalcPoint;
end;
procedure TLine.SetImage2(AValue: TImage);
begin
FImage2:=AValue;
CalcPoint;
end;
procedure TLine.WMLButtonDowm(var Msg: TWMLButtonDown);
begin
//此处根据鼠标位置计算是否在画有直线的范围
//是则为选定状态
end;
end.