private void DrawRuler(PaintEventArgs e, bool highlighted) { Pen pen; Brush cursorBrush; Brush textBrush; StringFormat textFormat = new StringFormat(); int maxPixel; Color cursorColor; if (highlighted) { e.Graphics.Clear(SystemColors.Highlight); pen = SystemPens.HighlightText; textBrush = SystemBrushes.HighlightText; cursorColor = SystemColors.Window; } else { e.Graphics.Clear(SystemColors.Window); pen = SystemPens.WindowText; textBrush = SystemBrushes.WindowText; cursorColor = SystemColors.Highlight; } cursorColor = Color.FromArgb(128, cursorColor); cursorBrush = new SolidBrush(cursorColor); if (orientation == Orientation.Horizontal) { maxPixel = ScaleFactor.UnscaleScalar(ClientRectangle.Width); textFormat.Alignment = StringAlignment.Near; textFormat.LineAlignment = StringAlignment.Far; } else // if (orientation == Orientation.Vertical) { maxPixel = ScaleFactor.UnscaleScalar(ClientRectangle.Height); textFormat.Alignment = StringAlignment.Near; textFormat.LineAlignment = StringAlignment.Near; textFormat.FormatFlags |= StringFormatFlags.DirectionVertical; } float majorSkip = 1; int majorSkipPower = 0; float majorDivisionLength = (float)dpu; float majorDivisionPixels = (float)ScaleFactor.ScaleScalar(majorDivisionLength); int[] subdivs = GetSubdivs(measurementUnit); float offsetPixels = ScaleFactor.ScaleScalar((float)offset); int startMajor = (int)(offset / majorDivisionLength) - 1; int endMajor = (int)((offset + maxPixel) / majorDivisionLength) + 1; if (orientation == Orientation.Horizontal) { // draw Value if (!highlighted) { PointF pt = scaleFactor.ScalePointJustX(new PointF(ClientRectangle.Left + Value - Offset, ClientRectangle.Top)); SizeF size = new SizeF(Math.Max(1, scaleFactor.ScaleScalar(1.0f)), ClientRectangle.Height); pt.X -= 0.5f; CompositingMode oldCM = e.Graphics.CompositingMode; e.Graphics.CompositingMode = CompositingMode.SourceOver; e.Graphics.FillRectangle(cursorBrush, new RectangleF(pt, size)); e.Graphics.CompositingMode = oldCM; } // draw border e.Graphics.DrawLine(SystemPens.WindowText, new Point(ClientRectangle.Left, ClientRectangle.Bottom - 1), new Point(ClientRectangle.Right - 1, ClientRectangle.Bottom - 1)); } else if (orientation == Orientation.Vertical) { // draw Value if (!highlighted) { PointF pt = scaleFactor.ScalePointJustY(new PointF(ClientRectangle.Left, ClientRectangle.Top + Value - Offset)); SizeF size = new SizeF(ClientRectangle.Width, Math.Max(1, scaleFactor.ScaleScalar(1.0f))); pt.Y -= 0.5f; CompositingMode oldCM = e.Graphics.CompositingMode; e.Graphics.CompositingMode = CompositingMode.SourceOver; e.Graphics.FillRectangle(cursorBrush, new RectangleF(pt, size)); e.Graphics.CompositingMode = oldCM; } // draw border e.Graphics.DrawLine(SystemPens.WindowText, new Point(ClientRectangle.Right - 1, ClientRectangle.Top), new Point(ClientRectangle.Right - 1, ClientRectangle.Bottom - 1)); } while (majorDivisionPixels * majorSkip < 60) { majorSkip *= majorDivisors[majorSkipPower % majorDivisors.Length]; ++majorSkipPower; } startMajor = (int)(majorSkip * Math.Floor(startMajor / (double)majorSkip)); for (int major = startMajor; major <= endMajor; major += (int)majorSkip) { float majorMarkPos = (major * majorDivisionPixels) - offsetPixels; string majorText = (major).ToString(); if (orientation == Orientation.Horizontal) { SubdivideX(e.Graphics, pen, ClientRectangle.Left + majorMarkPos, majorDivisionPixels * majorSkip, -majorSkipPower, ClientRectangle.Top, ClientRectangle.Height, subdivs); e.Graphics.DrawString(majorText, Font, textBrush, new PointF(ClientRectangle.Left + majorMarkPos, ClientRectangle.Bottom), textFormat); } else // if (orientation == Orientation.Vertical) { SubdivideY(e.Graphics, pen, ClientRectangle.Top + majorMarkPos, majorDivisionPixels * majorSkip, -majorSkipPower, ClientRectangle.Left, ClientRectangle.Width, subdivs); e.Graphics.DrawString(majorText, Font, textBrush, new PointF(ClientRectangle.Left, ClientRectangle.Top + majorMarkPos), textFormat); } } textFormat.Dispose(); }