📄 qiplotdatacursor.pas
字号:
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 + -