⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 textpic.pas

📁 用Delphi画矢量图
💻 PAS
📖 第 1 页 / 共 3 页
字号:
    //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 + -