Article-22233-Tools-Palette-Part-32-Crosshair-Magnifier This repository is an article-derived reference project based on the original MQL5 article. It does not claim to reproduce the full original source code unless files are explicitly attached. ## Overview This project references MQL5 article **Part 32** of a Tools Palette series. The article extends a previously built interactive chart sidebar with a dedicated crosshair subsystem that adds: - reticle tick-mark overlays - full-chart vertical and horizontal crosshair lines - dynamic price and time axis labels - a circular magnifier lens for zoomed candle inspection - a double-click measurement mode with anchor, diagonal line, bar count, pip distance, and raw price difference The implementation described in the article is centered around canvas-based rendering and chart event handling. ## Original Article - **Article ID:** 22233 - **Author:** Allan Munene Mutiiria - **Publication date:** 2026.05.21 - **Category:** MQL5 GUI / Chart objects - **URL:** https://www.mql5.com/en/articles/22233 ## Repository Purpose This repository should be treated as a **reference/reconstruction project** for the article’s described architecture and code fragments. Its purpose is to document and preserve the article’s main implementation ideas for: - custom chart navigation overlays in MQL5 - layered bitmap-label canvas rendering - magnifier lens rendering on live chart data - measurement tooling integrated into a sidebar-driven UI - event-driven crosshair interaction and cleanup logic ## Key Concepts - Custom crosshair rendering beyond the default MetaTrader crosshair - Reticle overlay with configurable offset, tick length, and thickness - Magnifier lens with configurable diameter, zoom factor, and cursor offset - Axis label rendering using chart foreground/background colors - Canvas layer expansion from basic sidebar/flyout rendering to multiple overlay surfaces - Bresenham line drawing for measure diagonals - Double-click detection using microsecond timing - Conversion between chart coordinates and screen coordinates - Theme-aware redraw behavior - Automatic hiding of crosshair elements over sidebar and flyout regions ## Algorithm / Architecture Summary The article describes the following architecture: 1. **New input parameters** - `ReticleOffset` - `ReticleTickLen` - `ReticleThickness` - `MagDiameter` - `MagZoom` - `MagOffset` - `AxisLabelFontSize` - `AxisLabelFont` 2. **Primitive extension** - `CCanvasPrimitives` is extended with `DrawBresenhamLine(...)` for pixel-level diagonal rendering with alpha blending. 3. **Canvas layer expansion** - `CCanvasLayer` grows from four canvases to fifteen total surfaces. - Added canvases include reticle, magnifier, crosshair lines, crosshair labels, measure anchor lines, measure labels, and a full-screen diagonal line canvas. - Helper methods prefill 1-pixel-wide or 1-pixel-tall line canvases using chart foreground colors. 4. **Dedicated manager class** - A new `CCrosshairManager` class is introduced between sidebar rendering and chart event handling. - It tracks visibility flags, measurement state, anchor coordinates, double-click timing, and cached magnifier cursor position. 5. **Rendering responsibilities** - Draw reticle tick marks on a transparent square canvas. - Show/hide and reposition vertical/horizontal crosshair lines. - Render and place price/time axis labels. - Render a circular magnifier lens with: - candle bodies and wicks - bid/ask lines - circular clipping - anti-aliased lens border - center guide marks - current price label 6. **Measurement mode** - Double-click toggles measurement anchor mode. - Anchor time/price and pixel coordinates are stored. - Vertical/horizontal anchor lines and axis labels are shown. - A diagonal line is drawn from anchor to current cursor. - A floating chart label shows bars, pips, and absolute price difference. 7. **Top-level integration** - Cleanup method removes crosshair and measurement state on tool switch. - Mouse-move handler coordinates all real-time updates when the crosshair tool is active. ## Mentioned or Attached Files ### Explicitly attached files No attached source files were available in the processed input. ### Files mentioned in the article text - `Tools Palette Part 4.mq5` ### Classes mentioned in the article - `CCanvasPrimitives` - `CCanvasLayer` - `CCrosshairManager` - `CToolsSidebar` ### Methods specifically shown or discussed - `DrawBresenhamLine` - `CreateAllCanvases` - `DestroyAllCanvases` - `DrawCrossVerticalLinePixels` - `DrawCrossHorizontalLinePixels` - `DrawMeasureVerticalLinePixels` - `DrawMeasureHorizontalLinePixels` - `DrawReticleTickMarks` - `ShowReticle` - `HideReticle` - `UpdateReticlePosition` - `ShowCrossVertical` - `HideCrossVertical` - `UpdateCrossVerticalPosition` - `ShowCrossHorizontal` - `HideCrossHorizontal` - `UpdateCrossHorizontalPosition` - `ShowCrossPriceLabel` - `HideCrossPriceLabel` - `ShowCrossTimeLabel` - `HideCrossTimeLabel` - `DrawAndPositionAxisLabel` - `UpdateCrosshairAxisLabels` - `ShowMeasureLines` - `HideMeasureLines` - `UpdateMeasureVerticalPosition` - `UpdateMeasureHorizontalPosition` - `UpdateMeasureAnchorLabels` - `ShowMagnifier` - `HideMagnifier` - `UpdateMagnifierPosition` - `DrawMagnifierLensContent` - `UpdateMeasureDiagonalLine` - `UpdateMeasurementInfoLabel` - `HideAllCrosshairElements` - `ShowAllCrosshairElements` - `HandleCrosshairDoubleClick` - `DeleteAllMeasureObjects` - `CleanupCrosshairOnToolSwitch` - `HandleCrosshairMouseMove` ## Statistics - **Inputs added:** 8 - **New canvas layers added:** 11 - **Total canvases after expansion:** 15 - **New manager class introduced:** 1 - **Protected member variables in `CCrosshairManager` described by the article:** 20 - **Protected methods in `CCrosshairManager` declared in the article:** 30 ## Tags `mql5` `metatrader-5` `canvas` `crosshair` `magnifier` `chart-ui` `sidebar` `measurement-tool` `bresenham-line` `interactive-tools` ## Difficulty Intermediate to Advanced ## Limitations - The full original project source code is **not available** in the provided input. - Only article text and embedded code excerpts were provided, so this repository should not be presented as a complete drop-in reproduction. - The article depends on earlier parts of the Tools Palette series, especially prior sidebar, renderer, event-routing, and tool-registry infrastructure. - Some referenced base classes and existing methods are not fully included in the provided material. - Backtesting visuals are described, but no packaged test assets or complete runnable project structure were attached in the processed input. ## Reference Original article: [Tools Palette Part 32](https://www.mql5.com/en/articles/22233) by Allan Munene Mutiiria.