/// <summary> /// Draws the scrubber manipulator and calculates the bounding rectangle on the handle</summary> /// <param name="g">The graphics object to draw with</param> /// <param name="handleRect">The handle's bounding rectangle for pick tests, in view /// coordinates</param> protected virtual void DrawManipulator(D2dGraphics g, out RectangleF handleRect) { Matrix worldToView = Owner.Transform; float viewX = Sce.Atf.GdiUtil.Transform(worldToView, Position); Rectangle clipRectangle = Owner.VisibleClientRectangle; // allow only the arrow portion to be selected handleRect = new RectangleF( viewX - 5, clipRectangle.Top, 10, 7); g.DrawLine(viewX, clipRectangle.Top, viewX, clipRectangle.Bottom, s_color, 1.0f, null); Color handle_color = m_isMoving ? Color.Tomato : s_color; float pos_x = viewX; float pos_y = clipRectangle.Top + 5; s_arrow[0] = new PointF(pos_x - 4, pos_y - 5); s_arrow[1] = new PointF(pos_x - 4, pos_y); s_arrow[2] = new PointF(pos_x - 5, pos_y + 1); s_arrow[3] = new PointF(pos_x - 5, pos_y + 2); s_arrow[4] = new PointF(pos_x, pos_y + 7); s_arrow[5] = new PointF(pos_x + 5, pos_y + 2); s_arrow[6] = new PointF(pos_x + 5, pos_y + 1); s_arrow[7] = new PointF(pos_x + 4, pos_y); s_arrow[8] = new PointF(pos_x + 4, pos_y - 5); //g.FillPolygon(s_arrow, handle_color); // Fill arrow // Draw arrow border with same gray Photoshop uses //g.DrawLines(s_arrow, Color.FromArgb(116, 114, 106), 3.0f); g.DrawLines(s_arrow, handle_color, 2.0f); string label = Position.ToString(CultureInfo.CurrentCulture); g.DrawText(label, Owner.Renderer.TextFormat, new PointF(pos_x + 6, clipRectangle.Top), SystemColors.WindowText); }