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

📄 qiplotdatacursor.pas

📁 iocopm3.04源码,一套很好的工控开发工具
💻 PAS
📖 第 1 页 / 共 4 页
字号:
  if FMouseDownHint then
    begin
      if FHintOrientation = ioVertical then
        FHintPosition := FDataView.PixelsYToPositionPercent(FMouseDownYPixels + (MouseData.Y - FMouseDownY))
      else
        FHintPosition := FDataView.PixelsXToPositionPercent(FMouseDownXPixels + (MouseData.X - FMouseDownX));

      if FHintPosition > 100 then FHintPosition := 100;
      if FHintPosition < 0   then FHintPosition := 0;

      DoUpdate;
      TriggerInvalidateNow(Self);
    end
  else if FMouseDownPointer1 then
    begin
      if FPointer1Orientation = ioVertical then
        FPointer1Position := FDataView.PixelsXToPositionPercent(FMouseDownXPixels + (MouseData.X - FMouseDownX))
      else
        FPointer1Position := FDataView.PixelsYToPositionPercent(FMouseDownYPixels + (MouseData.Y - FMouseDownY));

      if FPointer1Position > 100 then FPointer1Position := 100;
      if FPointer1Position < 0   then FPointer1Position := 0;

      DoUpdate;
      TriggerInvalidateNow(Self);
    end
  else if FMouseDownPointer2 then
    begin
      if FPointer2Orientation = ioVertical then
        FPointer2Position := FDataView.PixelsXToPositionPercent(FMouseDownXPixels + (MouseData.X - FMouseDownX))
      else
        FPointer2Position := FDataView.PixelsYToPositionPercent(FMouseDownYPixels + (MouseData.Y - FMouseDownY));

      if FPointer2Position > 100 then FPointer2Position := 100;
      if FPointer2Position < 0   then FPointer2Position := 0;

      DoUpdate;
      TriggerInvalidateNow(Self);
    end;
end;
//****************************************************************************************************************************************************
procedure TiPlotDataCursor.DoMouseUp(MouseData: TiPlotMouseData);
begin
  FMouseDownPointer1 := False;
  FMouseDownPointer2 := False;
  FMouseDownHint     := False;
  TriggerInvalidateNow(Self);
  
  if MouseDown then
    begin
      if iMouseHitTest(MouseData) then TiPlotComponentAccess(Owner).DoObjectClick(Self);
    end;
end;
//****************************************************************************************************************************************************
procedure TiPlotDataCursor.iKeyDown(var CharCode: Word; Shift: TShiftState);
var
  XPixelPercent : Double;
  YPixelPercent : Double;
begin
  if not Assigned(FDataView) then Exit;

  YPixelPercent := ABS(FDataView.PixelsYToPositionPercent(100) - FDataView.PixelsYToPositionPercent(101));
  XPixelPercent := ABS(FDataView.PixelsXToPositionPercent(101) - FDataView.PixelsXToPositionPercent(100));

  if ssCtrl in Shift then
    begin
      case CharCode of
        VK_LEFT  : begin
                     if FHintShow     then if FHintOrientation     = ioHorizontal then FHintPosition     := FHintPosition     - XPixelPercent;
                     if FPointer1Show then if FPointer1Orientation = ioVertical   then FPointer1Position := FPointer1Position - XPixelPercent;
                   end;
        VK_DOWN  : begin
                     if FHintShow     then if FHintOrientation     = ioVertical   then FHintPosition     := FHintPosition     - YPixelPercent;
                     if FPointer1Show then if FPointer1Orientation = ioHorizontal then FPointer1Position := FPointer1Position - YPixelPercent;
                   end;
        VK_RIGHT : begin
                     if FHintShow     then if FHintOrientation     = ioHorizontal then FHintPosition     := FHintPosition     + XPixelPercent;
                     if FPointer1Show then if FPointer1Orientation = ioVertical   then FPointer1Position := FPointer1Position + XPixelPercent;
                   end;
        VK_UP    : begin
                     if FHintShow     then if FHintOrientation     = ioVertical   then FHintPosition     := FHintPosition     + YPixelPercent;
                     if FPointer1Show then if FPointer1Orientation = ioHorizontal then FPointer1Position := FPointer1Position + YPixelPercent;
                   end;
        VK_PRIOR : case FPointer1Orientation of
                     ioVertical : FPointer1Position := FPointer1Position + XPixelPercent * 5;
                     else         FPointer1Position := FPointer1Position + YPixelPercent * 5;
                   end;
        VK_NEXT  : case FPointer1Orientation of
                     ioVertical : FPointer1Position := FPointer1Position - XPixelPercent * 5;
                     else         FPointer1Position := FPointer1Position - YPixelPercent * 5;
                   end;
        VK_HOME  : FPointer1Position := 0;
        VK_END   : FPointer1Position := 100;
      end;
    end
  else if FPointer2Show then
    begin
      case CharCode of
        VK_LEFT  : if FPointer2Orientation = ioVertical   then FPointer2Position := FPointer2Position - XPixelPercent;
        VK_DOWN  : if FPointer2Orientation = ioHorizontal then FPointer2Position := FPointer2Position - YPixelPercent;
        VK_RIGHT : if FPointer2Orientation = ioVertical   then FPointer2Position := FPointer2Position + XPixelPercent;
        VK_UP    : if FPointer2Orientation = ioHorizontal then FPointer2Position := FPointer2Position + YPixelPercent;
        VK_PRIOR : case FPointer2Orientation of
                     ioVertical : FPointer2Position := FPointer2Position + XPixelPercent * 5;
                     else         FPointer2Position := FPointer2Position + YPixelPercent * 5;
                   end;
        VK_NEXT  : case FPointer2Orientation of
                     ioVertical : FPointer2Position := FPointer2Position - XPixelPercent * 5;
                     else         FPointer2Position := FPointer2Position - YPixelPercent * 5;
                   end;
        VK_HOME  : FPointer2Position := 0;
        VK_END   : FPointer2Position := 100;
      end;
    end;

  if FHintPosition > 100     then FHintPosition     := 100;
  if FHintPosition < 0       then FHintPosition     := 0;

  if FPointer1Position > 100 then FPointer1Position := 100;
  if FPointer1Position < 0   then FPointer1Position := 0;

  if FPointer2Position > 100 then FPointer2Position := 100;
  if FPointer2Position < 0   then FPointer2Position := 0;

  TriggerInvalidateNow(Self);
end;
//****************************************************************************************************************************************************
procedure TiPlotDataCursor.DrawHint(const Canvas: TCanvas; const BackGroundColor: TColor);
var
  AWidth         : Integer;
  AHeight        : Integer;
  AText          : String;
  ARect          : TRect;
  Margin         : Integer;
  LineMid        : Integer;
  Dual           : Boolean;
  PositionPixels : Integer;
begin
  if not Assigned(Channel) then AText := GetTranslation('No Channel') else AText := FCursorDisplayText;

  TiPlotComponentAccess(Owner as TiPlotComponent).DoDataCursorCustomizeHint(Self, AText);

  with Canvas, TiPlotLayoutAccess(FDataView) do
    begin
      Pen.Style   := psSolid;
      Pen.Width   := 0;
      Font.Assign(FFont);

      AWidth   := iTextWidth(Canvas, AText);

      ARect    := Rect(0,0, AWidth, 0);
      AHeight  := iDrawText(Canvas, AText, ARect, [itfCalcRect, itfWordBreak]);

      //AHeight  := TextHeight(AText);
      Margin   := TextWidth('A');

      FHintHeight := AHeight + Margin div 2;
      FHintWidth  := AWidth  + Margin;

      if FStyle in [ipcsDeltaX, ipcsDeltaY, ipcsInverseDeltaX] then Dual := True else Dual := False;

      case FHintOrientation of
        ioVertical   : begin
                         if FPointer1Show then
                           LineMid := (FPointer1Rect.Left + FPointer1Rect.Right) div 2
                         else
                           LineMid := (FPointer2Rect.Left + FPointer2Rect.Right) div 2;

                         if (LineMid + 5 + Margin + AWidth) > Right then FHintOrientationSide := iosTopLeft;
                         if (LineMid - 5 - Margin - AWidth) < Left  then FHintOrientationSide := iosBottomRight;

                         PositionPixels := FDataView.PositionPercentToPixelsY(HintPosition);

                         if not Dual then
                           case FHintOrientationSide of
                             iosBottomRight : FHintRect := Rect(LineMid + 5,                   PositionPixels - FHintHeight div 2,
                                                                LineMid + 5 + AWidth + Margin, PositionPixels + FHintHeight div 2);
                             iosTopLeft     : FHintRect := Rect(LineMid - 5 - AWidth - Margin, PositionPixels - FHintHeight div 2,
                                                                LineMid - 5 ,                  PositionPixels + FHintHeight div 2);
                           end
                         else
                           begin
                             LineMid := (FPointer1Rect.Left + FPointer1Rect.Right + FPointer2Rect.Left + FPointer2Rect.Right) div 4;
                             FHintRect := Rect(LineMid - FHintWidth div 2, PositionPixels - FHintHeight div 2,
                                               LineMid + FHintWidth div 2, PositionPixels + FHintHeight div 2);
                           end;

                       end;
        ioHorizontal : begin
                         if FPointer1Show then
                           LineMid := (FPointer1Rect.Top + FPointer1Rect.Bottom) div 2
                         else
                           LineMid := (FPointer2Rect.Top + FPointer2Rect.Bottom) div 2;

                         if (LineMid + Margin + AHeight) > Bottom then FHintOrientationSide := iosTopLeft;
                         if (LineMid - Margin - AHeight) < Top    then FHintOrientationSide := iosBottomRight;

                         PositionPixels := FDataView.PositionPercentToPixelsX(HintPosition);

                         if not Dual then
                           case FHintOrientationSide of
                             iosBottomRight : FHintRect := Rect(PositionPixels - FHintWidth div 2, LineMid + 5,
                                                                PositionPixels + FHintWidth div 2, LineMid + 5 + FHintHeight);
                             iosTopLeft     : FHintRect := Rect(PositionPixels - FHintWidth div 2, LineMid - 5 - FHintHeight,
                                                                PositionPixels + FHintWidth div 2, LineMid - 5);
                           end
                         else
                           begin
                             LineMid := (FPointer1Rect.Top + FPointer1Rect.Bottom + FPointer2Rect.Top + FPointer2Rect.Bottom) div 4;
                             FHintRect := Rect(PositionPixels - FHintWidth div 2, LineMid - FHintHeight div 2,
                                               PositionPixels + FHintWidth div 2, LineMid + FHintHeight div 2);
                           end;
                       end;
      end;

      if FHintRect.Left   < Left   then OffsetRect(FHintRect, Left - FHintRect.Left, 0);
      if FHintRect.Right  > Right  then OffsetRect(FHintRect, Right - FHintRect.Right, 0);
      if FHintRect.Top    < Top    then OffsetRect(FHintRect, 0, Top - FHintRect.Top);
      if FHintRect.Bottom > Bottom then OffsetRect(FHintRect, 0, Bottom - FHintRect.Bottom);

      if Dual then
        begin
          Pen.Style   := psDot;
          if FUseChannelColor and Assigned(Channel) then Pen.Color := Channel.Color else Pen.Color := FColor;
          Brush.Style := bsClear;
          case FHintOrientation of
            ioVertical   : Polyline([Point((FPointer1Rect.Left + FPointer1Rect.Right) div 2, (FHintRect.Top     + FHintRect.Bottom    ) div 2),
                                     Point((FPointer2Rect.Left + FPointer2Rect.Right) div 2, (FHintRect.Top     + FHintRect.Bottom    ) div 2)]);
            ioHorizontal : Polyline([Point((FHintRect.Left     + FHintRect.Right    ) div 2, (FPointer1Rect.Top + FPointer1Rect.Bottom) div 2),
                                     Point((FHintRect.Left     + FHintRect.Right    ) div 2, (FPointer2Rect.Top + FPointer2Rect.Bottom) div 2)]);
          end
        end;

      Pen.Style := psSolid;
      if FUseChannelColor and Assigned(Channel) then Pen.Color := Channel.Color  else Pen.Color := clBlack;
      Brush.Color := clInfoBk;
      Brush.Style := bsSolid;
      Font.Color := clInfoText;

      ARect := Rect(FHintRect.Left, FHintRect.Top, FHintRect.Right, FHintRect.Bottom);
      Rectangle(ARect.Left, ARect.Top, ARect.Right, ARect.Bottom);

      ARect := Rect(FHintRect.Left+2, FHintRect.Top+1, FHintRect.Right, FHintRect.Bottom);
      iDrawText(Canvas, AText, ARect, [itfHLeft, itfVCenter]);
      
      ARect := Rect(FHintRect.Left, FHintRect.Top, FHintRect.Right, FHintRect.Bottom);
      Brush.Style := bsClear;
      Rectangle(ARect.Left, ARect.Top, ARect.Right, ARect.Bottom);
      InflateRect(ARect, 2, 2);

      if Self.UserSelected then
        begin
          Font.Color  := clWhite;
          Pen.Color   := clWhite;
          Brush.Style := bsClear;
          iDrawFocusRect2(Canvas, ARect);
        end;
    end;
end;
//****************************************************************************************************************************************************
procedure TiPlotDataCursor.Draw(const Canvas: TCanvas; const BackGroundColor: TColor);
begin
  if not Assigned(FDataView) then Exit;
  if not Visible             then Exit;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -