📄 drwobj.~pas
字号:
t:TRect;
rgn:HRgn;
begin
if not Visible then exit;
{保存画布的原先设置}
oldPenColor:=drwCanvas.Pen.Color;
oldBrushColor:=drwCanvas.Brush.Color;
oldBrushStyle:=drwCanvas.Brush.Style;
oldPenWidth:=drwCanvas.Pen.Width;
oldPenMode:=drwCanvas.Pen.Mode;
oldPenStyle:=drwCanvas.Pen.Style;
{设置画布新的设置}
drwCanvas.Pen.Color:=GetPenColor;
drwCanvas.Brush.Color :=FBrushColor;
drwCanvas.Brush.Style :=FBrushStyle;
drwCanvas.Pen.Width :=GetPenWidth;
drwCanvas.Pen.Mode:=pmCopy;
drwCanvas.Pen.Style :=getPenStyle;
t.TopLeft:=Point(m_x1,m_y1);
t.BottomRight:=Point(m_x2,m_y2);
{进行方向正常化}
NormalRect(t);
m_x1:=t.Left;m_y1:=t.Top;
m_x2:=t.Right;m_y2:=t.Bottom;
//渐变填充 2004.4.9 add
t:=rect(round(m_x1*fZoomScale),round(m_y1*fZoomScale),round(m_x2*fZoomScale),round(m_y2*fZoomScale));
if Gradient then
begin
drwcanvas.Brush.Style:=bsSolid;
rgn:=CreateEllipticRgn(t.Left,t.Top,t.Right,t.Bottom);
selectClipRgn(drwCanvas.Handle,rgn);
FillWithGradient(drwCanvas,BeginColor,EndColor,GradientStyle,t);
SelectClipRgn(drwCanvas.Handle,0);
DeleteObject(rgn);
drwCanvas.Brush.Style:=bsClear;
drwCanvas.Ellipse(t.Left,t.Top,t.Right,t.Bottom);
end
else
drwCanvas.Ellipse(round(m_x1*fZoomScale),round(m_y1*fZoomScale),round(m_x2*fZoomScale),round(m_y2*fZoomScale));
{恢复画布的设置}
drwCanvas.Pen.Color :=oldPenColor;
drwCanvas.Pen.Width :=oldPenWidth;
drwCanvas.Pen.Mode :=oldPenMode;
drwCanvas.Brush.Color :=oldBrushColor;
drwCanvas.Brush.Style :=oldBrushStyle;
drwCanvas.Pen.Style :=oldPenStyle;
if FSelected then
HotPoints(drwCanvas);
end;
function TDrawCircle.getMaxPoint: TPoint;
begin
result.X :=m_x2;
result.Y :=m_y2;
end;
function TDrawCircle.getMinPoint: TPoint;
begin
result.x:=m_x1;
result.y:=m_y1;
end;
procedure TDrawCircle.HotPoints(drwCanvas: TCanvas);
begin
HotPoint(drwcanvas,round(m_x1*fZoomScale),round(m_y1*fZoomScale));
HotPoint(drwCanvas,round(m_x2*fZoomScale),round(m_y2*fZoomScale));
HotPoint(drwCanvas,round(m_x1*fZoomScale),round(m_y2*fZoomScale));
HotPoint(drwCanvas,round(m_x2*fZoomScale),round(m_y1*fZoomScale));
end;
function TDrawCircle.IsValid: boolean;
var
t1,t2:TPoint;
begin
t1:=Point(m_x1,m_y1);
t2:=Point(m_x2,m_y1);
isValid:=not IsEqual(t1,t2);
end;
procedure TDrawCircle.Load(stream: TStream);
begin
inherited;
stream.Read(FBrushColor,sizeOf(TColor));
stream.Read(FBrushStyle,sizeOf(TBrushStyle));
stream.Read(m_x1,sizeOf(longint));
stream.Read(m_y1,sizeOf(longint));
stream.Read(m_x2,sizeOf(longint));
stream.Read(m_y2,sizeOf(longint));
end;
procedure TDrawCircle.MoveAt(drwCanvas: TCanvas; flags, x, y: Integer);
var
oldPenColor:TColor;
oldPenWidth:integer;
oldBrushStyle:TBrushStyle;
oldPenStyle:TPenStyle;
oldPenMode:TPenMode;
begin
if not Assigned(self) then exit;
{保存画布的原先设置}
oldPenColor:=drwCanvas.Pen.Color;
oldBrushStyle:=drwCanvas.Brush.Style;
oldPenWidth:=drwCanvas.Pen.Width;
oldPenMode:=drwCanvas.Pen.Mode;
oldPenStyle:=drwCanvas.Pen.Style;
{设置画布新的设置}
drwCanvas.Pen.Color:=clBlack;
drwCanvas.Brush.Style :=bsClear;
drwCanvas.Pen.Width :=1;
drwCanvas.Pen.Mode:=pmNotXor;
drwCanvas.Pen.Style :=getPenStyle;
{如果原先设置的热点,则取消}
if mSelected then
HotPoints(drwCanvas);
{首先删除椭圆}
drwCanvas.Ellipse(round((m_x1)*fZoomScale),round((m_y1)*fZoomScale),round((m_x2)*fZoomScale),round((m_y2)*fZoomScale));
{设置新的图形坐标}
if flags=1 then
begin
m_y1:=y;
m_x1:=m_x2-(m_y2-m_y1);
end
else if flags=2 then
begin
m_y2:=y;
m_x1:=m_x2-(m_y2-m_y1);
end
else if flags=3 then
begin
m_y1:=y;
m_x2:=m_x1+(m_y2-m_y1);
end
else if flags=4 then
begin
m_y2:=y;
m_x2:=m_x1+(m_y2-m_y1);
end
else if flags=-1 then
begin
m_x1:=m_x1+x-m_oldx;
m_y1:=m_y1+y-m_oldy;
m_x2:=m_x2+x-m_oldx;
m_y2:=m_y2+y-m_oldy;
m_oldx:=x;
m_oldy:=y;
end;
{绘制新图形}
drwCanvas.Ellipse(round((m_x1)*fZoomScale),round((m_y1)*fZoomScale),round((m_x2)*fZoomScale),round((m_y2)*fZoomScale));
{恢复画布的原先设置}
drwCanvas.Pen.Color :=oldPenColor;
drwCanvas.Pen.Width :=oldPenWidth;
drwCanvas.Pen.Mode :=oldPenMode;
drwCanvas.Brush.Style :=oldBrushStyle;
drwCanvas.Pen.Style :=oldPenStyle;
{如果原先设置的热点,则取消}
if mSelected then
HotPoints(drwCanvas);
end;
function TDrawCircle.NewPoint(x, y: Integer): integer;
begin
m_x1:=x;m_x2:=x;
m_y1:=y;m_y2:=y;
result:=4;
end;
procedure TDrawCircle.Save(stream: TStream);
begin
inherited;
stream.Write(FBrushColor,sizeOf(TColor));
stream.Write(FBrushStyle,sizeOf(TBrushStyle));
stream.Write(m_x1,sizeOf(longint));
stream.Write(m_y1,sizeOf(longint));
stream.Write(m_x2,sizeOf(longint));
stream.Write(m_y2,sizeOf(longint));
end;
function TDrawCircle.SelectAt(x, y: Integer): integer;
var
rgn:HRGN;
begin
rgn:=CreateEllipticRgn(m_x1,m_y1,m_x2,m_y2);
if AtPoint(m_x1,m_y1,x,y) then
result:=1
else if atPoint(m_x1,m_y2,x,y) then
result:=2
else if atPoint(m_x2,m_y1,x,y) then
result:=3
else if atPoint(m_x2,m_y2,x,y) then
result:=4
else if PtInRegion(rgn,x,y) then
begin
m_oldx:=x;
m_oldy:=y;
result:=-1
end
else
result:=0;
DeleteObject(rgn);
end;
procedure TDrawCircle.Selected(drwCanvas: TCanvas; select: boolean);
begin
if not Assigned(self) then exit;
if select then
begin
if not mSelected then
begin
HotPoints(drwCanvas);
mSelected:=true;
end;
end
else
begin
if mSelected then
begin
HotPoints(drwCanvas);
mSelected:=false;
end;
end;
end;
procedure TDrawCircle.setOrg;
begin
fRect:=Rect(m_x1,m_y1,m_x2,m_y2);
end;
{ TDrawPline }
function TDrawPline.AddPoint(x, y: Integer): integer;
begin
inc(Fm_number);
setLength(m_aPoints,Fm_number);
m_aPoints[fm_number-1].X :=x;
m_aPoints[fm_number-1].Y :=y;
result:=fm_number+1;
end;
procedure TDrawPline.addXY(x, y, flags: integer;zoomScaleX:real=1.0;zoomScaleY:real=1.0);
var
i:integer;
begin
if flags=-1 then
begin
for i:=0 to Fm_number-1 do
begin
m_aPoints[i].X :=round(m_aPoints[i].X*zoomScaleX +x);
m_aPoints[i].Y :=round(m_aPoints[i].Y*zoomScaleY +y);
end;
end;
if flags<>-1 then
begin
for i:=0 to Fm_number-1 do
begin
m_aPoints[i].X :=round(old_aPoints[i].X*zoomScaleX);
m_aPoints[i].Y :=round(old_aPoints[i].Y*zoomScaleY);
end;
end;
end;
constructor TDrawPline.create;
begin
inherited;
Fm_number:=0;
end;
procedure TDrawPline.Draw(drwCanvas: TCanvas);
var
oldPenMode:TPenMode;
oldPenWidth,i:integer;
oldPenStyle:TPenStyle;
oldPenColor:TColor;
tmpArr:TDrwPline;
begin
if not Visible then
exit;
oldPenMode:=drwCanvas.Pen.Mode;
oldPenWidth:=drwCanvas.Pen.Width ;
oldPenStyle:=drwCanvas.Pen.Style;
oldPenColor:=drwCanvas.Pen.Color;
drwCanvas.Pen.Mode:=pmCopy;
drwCanvas.Pen.Width :=getPenWidth;
drwCanvas.Pen.Style :=getPenStyle;
drwCanvas.Pen.Color :=getPenColor;
for i:=0 to high(m_aPoints) do
begin
setLength(tmpArr,i+1);
tmpArr[i].X :=round(m_aPoints[i].X *fZoomScale);
tmpArr[i].Y :=round(m_aPoints[i].Y *fZoomScale);
end;
if Fm_number>0 then
drwCanvas.Polyline(tmpArr);
drwCanvas.Pen.Mode :=oldPenMode;
drwCanvas.Pen.Width :=oldPenWidth;
drwCanvas.Pen.Style :=oldPenStyle;
drwCanvas.Pen.Color :=oldPenColor;
if FSelected then
HotPoints(drwCanvas);
end;
function TDrawPline.getMaxPoint: TPoint;
var
i:integer;
max_X,max_Y:longint;
begin
max_X:=m_aPoints[0].X;
max_Y:=m_aPoints[0].Y;
for i:=1 to Fm_number-1 do
begin
if max_X<m_aPoints[i].X then
max_X:=m_aPoints[i].X;
if max_Y<m_aPoints[i].Y then
max_Y:=m_aPoints[i].Y;
end;
result:=Point(max_X,max_Y);
end;
function TDrawPline.getMinPoint: TPoint;
var
i:integer;
min_X,min_Y:longint;
begin
min_X:=m_aPoints[0].X;
min_Y:=m_aPoints[0].Y;
for i:=1 to Fm_number-1 do
begin
if min_X>m_aPoints[i].X then
min_X:=m_aPoints[i].X;
if min_Y>m_aPoints[i].Y then
min_Y:=m_aPoints[i].Y;
end;
result:=Point(min_X,min_Y);
end;
procedure TDrawPline.HotPoints(drwCanvas: TCanvas);
var
i:integer;
begin
for i:=0 to Fm_number-1 do
HotPoint(drwCanvas,round(m_aPoints[i].X*fZoomScale),round(m_aPoints[i].Y*fZoomScale));
end;
function TDrawPline.IsValid: boolean;
begin
result:=(Fm_number>1);
end;
procedure TDrawPline.Load(stream: TStream);
begin
inherited;
stream.Read(Fm_number,sizeOf(longint));
setlength(m_aPoints,Fm_number);
stream.Read(m_aPoints[0],Fm_number*sizeOf(TPoint));
end;
procedure TDrawPline.MoveAt(drwCanvas: TCanvas; flags, x, y: Integer);
var
oldPenMode:TPenMode;
oldPenWidth:integer;
oldPenStyle:TPenStyle;
oldPenColor:TColor;
i:integer;
begin
{保存画布的设置}
oldPenMode:=drwCanvas.Pen.Mode;
oldPenWidth:=drwCanvas.Pen.Width ;
oldPenStyle:=drwCanvas.Pen.Style;
oldPenColor:=drwCanvas.Pen.Color;
drwCanvas.Pen.Mode:=pmNotXor;
drwCanvas.Pen.Width :=1;
drwCanvas.Pen.Style :=getPenStyle;
drwCanvas.Pen.Color :=clBlack;
if mSelected then
HotPoints(drwCanvas);
{修改新的图形}
if flags=1 then
begin
drwCanvas.MoveTo(round(m_aPoints[0].x*fZoomScale),round(m_aPoints[0].y*fZoomScale));
drwCanvas.LineTo(round(m_aPoints[1].x*fZoomScale),round(m_aPoints[1].y*fZoomScale));
m_aPoints[0].X :=x;
m_aPoints[0].Y :=y;
drwCanvas.MoveTo(round(m_aPoints[0].x*fZoomScale),round(m_aPoints[0].y*fZoomScale));
drwCanvas.LineTo(round(m_aPoints[1].x*fZoomScale),round(m_aPoints[1].y*fZoomScale));
end
else if flags=Fm_number then
begin
drwCanvas.MoveTo(round(m_aPoints[Fm_number-2].x*fZoomScale),round(m_aPoints[Fm_number-2].y*fZoomScale));
drwCanvas.LineTo(round(m_aPoints[Fm_number-1].x*fZoomScale),round(m_aPoints[Fm_number-1].y*fZoomScale));
m_aPoints[Fm_number-1].X :=x;
m_aPoints[Fm_number-1].Y :=y;
drwCanvas.MoveTo(round(m_aPoints[Fm_number-2].x*fZoomScale),round(m_aPoints[Fm_number-2].y*fZoomScale));
drwCanvas.LineTo(round(m_aPoints[Fm_number-1].x*fZoomScale),round(m_aPoints[Fm_number-1].y*fZoomScale));
end
else if flags=Fm_number+1 then
begin
drwCanvas.MoveTo(round(m_aPoints[fm_number-1].x*fZoomScale),round(m_aPoints[fm_number-1].y*fZoomScale));
drwCanvas.LineTo(round(m_oldx*fZoomScale),round(m_oldy*fZoomScale));
m_oldx:=x;
m_oldy:=y;
drwCanvas.MoveTo(round(m_aPoints[fm_number-1].x*fZoomScale),round(m_aPoints[fm_number-1].y*fZoomScale));
drwCanvas.LineTo(round(m_oldx*fZoomScale),round(m_oldy*fZoomScale));
end
else if (flags>1) and (flags<fm_number) then
begin
drwCanvas.MoveTo(round(m_aPoints[flags-2].x*fZoomScale),round(m_aPoints[flags-2].y*fZoomScale));
drwCanvas.LineTo(round(m_aPoints[flags-1].x*fZoomScale),round(m_aPoints[Flags-1].y*fZoomScale));
drwCanvas.LineTo(round(m_aPoints[flags].x*fZoomScale),round(m_aPoints[flags].Y*fZoomScale));
m_aPoints[flags-1].X :=x;
m_aPoints[flags-1].Y :=y;
drwCanvas.MoveTo(round(m_aPoints[flags-2].x*fZoomScale
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -