📄 textpic.pas
字号:
//CreateLineRgn(startPoint.x,startPoint.y,endPoint.x,endPoint.y);//,Top,Right,Bottom);
if not Choosed then begin //图元未选中,只要判断是否在图元区域即可
if PtInRegion(RectHrgn, APoint.x, APoint.y) = True then result := POS_CENTER
end else begin //图元被选中,不仅要判断是否在图元区域,还需要判断在图元的具体位置
if PtInRegion(RectHrgn, APoint.x, APoint.y) = True then result := POS_CENTER;
GetFocusPoints; //取焦点坐标
LpToDp(ACanvas.Handle, focusPoint[1], focusNumber);
mPoint:=APoint;
for i := 1 to focusNumber do begin
with mRect do begin
Left := focusPoint[i].x - FOCUS_SIZE;
Top := focusPoint[i].y - FOCUS_SIZE;
Right := focusPoint[i].x + FOCUS_SIZE;
Bottom := focusPoint[i].y + FOCUS_SIZE;
end;
if PtInRect(mRect, mPoint) = True then begin
Result := MOUSE_POS(Ord(POS_LEFTTOP)- 1 + i);
Break;
end
end;
end;
DeleteObject(RectHrgn);
end;
function TTextPic.CreatePicRgn(ACanvas:TCanvas): HRGN; //产生图元区域的句柄
var
mRect: TRect;
pp: array[1..2] of TPoint;
begin
mRect := PicRect;
with mRect do begin
pp[1].x := Left;
pp[1].y := Top;
pp[2].x := Right;
pp[2].y := Bottom;
LpToDp(ACanvas.Handle, pp[1], 2);
Left := pp[1].x;
Top := pp[1].y;
Right := pp[2].x;
Bottom := pp[2].y;
end;
Result := CreateRectRgn(mRect.Left, mRect.Top, mRect.Right, mRect.Bottom);
end;
procedure TTextPic.DrawFocusRect(ACanvas:TCanvas); //在Acanvas上画焦点
var
mRect: TRect;
FocusNumber: Integer; //焦点数量
i: Integer;
begin
focusNumber := FOCUS_NUM; //=2 焦点数量
GetFocusPoints; //取焦点坐标
LpToDp(ACanvas.Handle,FocusPoint[1],FocusNumber);
ACanvas.Pen:=FocusPen;
ACanvas.Brush:=FocusBrush;
for i := 1 to focusNumber do begin //绘制焦点矩形
mRect.Left := focusPoint[i].x - FOCUS_SIZE;
mRect.Top := focusPoint[i].y - FOCUS_SIZE;
mRect.Right := focusPoint[i].x + FOCUS_SIZE;
mRect.Bottom := focusPoint[i].y + FOCUS_SIZE;
ACanvas.Rectangle(mRect.Left, mRect.Top, mRect.Right, mRect.Bottom);
end;
end;
procedure TTextPic.ParentDbClick(ACanvas:TCanvas);
begin
fCanvas:=ACanvas;
InvalidatePicRect(ACanvas,PicRect);
fEdit.Width:=Abs(EndPos.X-StartPos.X);
fEdit.Height:=Abs(EndPos.Y-StartPos.Y);
fEdit.Text:=fText.Text;
fEdit.Font:=PicFont;
fEdit.Left:=StartPos.X;
fEdit.Top:=StartPos.Y;
fEdit.Parent:=TWinControl(fEditParent);
fEdit.AutoSelect:=False;
fEdit.SelStart:=Length(fEdit.Text);
fEditMode:=True;
fEdit.SetFocus;
end;
//鼠标响应
procedure TTextPic.ParentMouseDown(ACanvas:TCanvas;CursorNum:Integer; Button: TMouseButton;Shift: TShiftState; APoint:TPoint);
begin
if Button = mbRight then Exit;
//设置pen的格式
//ACanvas.Pen:=PicPen;
//ACanvas.Pen.Mode:=pmXor;
//设置Brush的格式
//ACanvas.Brush:=PicBrush;
fCanvas:=aCanvas;
StartPos:=APoint; //设置图元的起点
EndPos := APoint; //置终点坐标
fInputMode:=True;
fEdit.Left:=APoint.X;
FEdit.Top :=APoint.Y;
//fEdit.Text:=fText;
fEdit.Height:=Abs(PicFont.Height)+2;
fEdit.Font:=PicFont;
fEdit.Parent:= TWinControl(fEditParent);
fEdit.AutoSelect:=False;
fEdit.SelStart:=Length(fEdit.Text);
fEdit.SetFocus;
end;
procedure TTextPic.ParentMouseMove(ACanvas:TCanvas;CursorNum:Integer; Shift: TShiftState;APoint:TPoint);
begin
//没有移动属性
end;
procedure TTextPic.ParentMouseUp(ACanvas:TCanvas;CursorNum:Integer; Button: TMouseButton; Shift: TShiftState; APoint:TPoint);
begin
//
end;
//键盘响应
procedure TTextPic.ParentKeyDown(ACanvas:TCanvas;CursorNum:Integer; var Key: Word; mouse: TPoint; Shift:TShiftState);
begin
end;
procedure TTextPic.ParentKeyUp(ACanvas:TCanvas;CursorNum:Integer; var Key: Word; mouse: TPoint; Shift: TShiftState);
begin
end;
//图象改变
procedure TTextPic.PicChangeing(ACanvas:TCanvas; mouseInPos: MOUSE_POS; chooseRect:TRect;
mouseDownOldX, mouseDownOldY, mouseOldX, mouseOldY, mouseX, mouseY:Integer);
var
mouseDiffX: Integer;
mouseDiffY: Integer;
tempStartPoint, tempEndPoint: TPoint;
pp: array[1..3] of TPoint;
procedure ChangPointXY; //坐标变换
begin
pp[1]:=tempstartpoint;
pp[2]:=tempendpoint;
oldsp:=pp[1];
oldep:=pp[2];
LptoDp(ACanvas.Handle,pp[1],2);
ACanvas.Rectangle(pp[1].X,pp[1].Y,pp[2].x,pp[2].Y);
end;
begin
//坐标变换
pp[1]:=Point(mouseDownOldX,mouseDownOldY);
pp[2]:=Point(mouseOldX, mouseOldY);
pp[3]:=Point(mouseX, mouseY);
DPtoLP(ACanvas.Handle, pp, 3);
mouseDownOldX := pp[1].x;
mouseDownOldY := pp[1].y;
mouseOldX := pp[2].x;
mouseOldY := pp[2].y;
mouseX := pp[3].x;
mouseY := pp[3].y;
//设置绘图方式
ACanvas.Pen.Width := 1;
ACanvas.Pen.Mode := pmXor;
ACanvas.Pen.Style := psDot;
ACanvas.Brush.Style := bsClear;
//计算选择图元的宽度和高度
case mouseInPos of
POS_LEFTTOP: // :Integer = 1 ; //左上
begin
//清除前一次
mouseDiffX := mouseOldX - mouseDownOldX;
mouseDiffY := mouseOldY - mouseDownOldY;
//绘制图元
tempStartPoint :=Point(startPos.x + mouseDiffX, startPos.y + mouseDiffY);
tempEndPoint :=endPos;
ChangPointXY;
//绘制当前虚线图元
mouseDiffX := mouseX - mouseDownOldX;
mouseDiffY := mouseY - mouseDownOldY;
//绘制图元
tempStartPoint :=Point(startPos.x + mouseDiffX, startPos.y + mouseDiffY);
tempEndPoint := endPos; //+ mouseDiffX;
//坐标变换
ChangPointXY;
end;
POS_RIGHTTOP: // :Integer = 2 ; //右上
begin
//清除前一次
mouseDiffX := mouseOldX - mouseDownOldX;
mouseDiffY := mouseOldY - mouseDownOldY;
//绘制图元
tempStartPoint.X:=StartPos.X;
tempStartPoint.Y:=StartPos.Y+MouseDiffY;
tempendPoint.X:=endpos.X+MouseDiffX;
tempendPoint.Y:=endpos.Y;
ChangPointXY;
//绘制当前虚线图元
mouseDiffX := mouseX - mouseDownOldX;
mouseDiffY := mouseY - mouseDownOldY;
//绘制图元
tempStartPoint.X:=StartPos.X;
tempStartPoint.Y:=StartPos.Y+MouseDiffY;
tempendPoint.X:=endpos.X+MouseDiffX;
tempendPoint.Y:=endpos.Y;
//坐标变换
ChangPointXY;
end;
POS_RIGHTBOTTOM: // :Integer = 3 ; //右下
begin
//清除前一次
mouseDiffX := mouseOldX - mouseDownOldX;
mouseDiffY := mouseOldY - mouseDownOldY;
//绘制图元
tempStartPoint:=StartPos;
tempendPoint.X:=endpos.X+MouseDiffX;
tempendPoint.Y:=endpos.Y+MouseDiffY;
ChangPointXY;
//绘制当前虚线图元
mouseDiffX := mouseX - mouseDownOldX;
mouseDiffY := mouseY - mouseDownOldY;
//绘制图元
tempStartPoint:=StartPos;
tempendPoint.X:=endpos.X+MouseDiffX;
tempendPoint.Y:=endpos.Y+MouseDiffY;
//坐标变换
ChangPointXY;
end;
POS_LEFTBOTTOM: // :Integer = 4 ; //左下
begin
//清除前一次
mouseDiffX := mouseOldX - mouseDownOldX;
mouseDiffY := mouseOldY - mouseDownOldY;
//绘制图元
tempStartPoint.X:=StartPos.X+MouseDiffX;
tempStartPoint.Y:=StartPos.Y;
tempendPoint.X:=endpos.X;
tempendPoint.Y:=endpos.Y+MouseDiffY;
ChangPointXY;
//绘制当前虚线图元
mouseDiffX := mouseX - mouseDownOldX;
mouseDiffY := mouseY - mouseDownOldY;
//绘制图元
tempStartPoint.X:=StartPos.X+MouseDiffX;
tempStartPoint.Y:=StartPos.Y;
tempendPoint.X:=endpos.X;
tempendPoint.Y:=endpos.Y+MouseDiffY;
//坐标变换
ChangPointXY;
end;
POS_CENTERTOP: // :Integer = 5 ; //上中
begin
//清除前一次
//mouseDiffX := mouseOldX - mouseDownOldX;
mouseDiffY := mouseOldY - mouseDownOldY;
//绘制图元
tempStartPoint.X:=StartPos.X;
tempStartPoint.Y:=StartPos.Y+MouseDiffY;
tempendPoint:=endpos;
ChangPointXY;
//绘制当前虚线图元
//mouseDiffX := mouseX - mouseDownOldX;
mouseDiffY := mouseY - mouseDownOldY;
//绘制图元
tempStartPoint.X:=StartPos.X;
tempStartPoint.Y:=StartPos.Y+MouseDiffY;
tempendPoint:=endpos;
//坐标变换
ChangPointXY;
end;
POS_RIGHTCENTER: // :Integer = 6 ; //右中
begin
//清除前一次
mouseDiffX := mouseOldX - mouseDownOldX;
//mouseDiffY := mouseOldY - mouseDownOldY;
//绘制图元
tempStartPoint:=StartPos;
tempendPoint.X:=endpos.X+MouseDiffX;
tempendPoint.Y:=endpos.Y;
ChangPointXY;
//绘制当前虚线图元
mouseDiffX := mouseX - mouseDownOldX;
//mouseDiffY := mouseY - mouseDownOldY;
//绘制图元
tempStartPoint:=StartPos;
tempendPoint.X:=endpos.X+MouseDiffX;
tempendPoint.Y:=endpos.Y;
//坐标变换
ChangPointXY;
end;
POS_CENTERBUTTOM: // :Integer = 7 ; //下中
begin
//清除前一次
//mouseDiffX := mouseOldX - mouseDownOldX;
mouseDiffY := mouseOldY - mouseDownOldY;
//绘制图元
tempStartPoint:=StartPos;
tempendPoint.X:=EndPos.X;
tempendPoint.Y:=endpos.Y+MouseDiffY;
ChangPointXY;
//绘制当前虚线图元
//mouseDiffX := mouseX - mouseDownOldX;
mouseDiffY := mouseY - mouseDownOldY;
//绘制图元
tempStartPoint:=StartPos;
tempendPoint.X:=EndPos.X;
tempendPoint.Y:=endpos.Y+MouseDiffY;
//坐标变换
ChangPointXY;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -