@@ -147,6 +147,118 @@ public WpfCursor CreateColoredPencilCursor(string tipColorHex)
147147 }
148148 }
149149
150+ /// <summary>
151+ /// Creates an eraser cursor
152+ /// </summary>
153+ /// <returns>Custom eraser cursor</returns>
154+ public WpfCursor CreateEraserCursor ( )
155+ {
156+ lock ( _cursorLock )
157+ {
158+ if ( _disposed )
159+ {
160+ _logger . LogWarning ( "CreateEraserCursor called on disposed CursorHelper" ) ;
161+ return WpfCursors . Cross ;
162+ }
163+
164+ try
165+ {
166+ _logger . LogDebug ( "Creating eraser cursor" ) ;
167+
168+ // Destroy previous cursor handle to prevent leaks
169+ if ( _currentCursorHandle != nint . Zero )
170+ {
171+ try
172+ {
173+ DestroyCursor ( _currentCursorHandle ) ;
174+ _logger . LogDebug ( "Destroyed previous cursor handle" ) ;
175+ }
176+ catch ( Exception ex )
177+ {
178+ _logger . LogError ( ex , "Failed to destroy previous cursor handle" ) ;
179+ }
180+ _currentCursorHandle = nint . Zero ;
181+ }
182+
183+ // Create a bitmap for the cursor (32x32 pixels)
184+ int size = 32 ;
185+ using ( Bitmap bitmap = new Bitmap ( size , size ) )
186+ using ( Graphics g = Graphics . FromImage ( bitmap ) )
187+ {
188+ g . SmoothingMode = SmoothingMode . AntiAlias ;
189+ g . Clear ( Color . Transparent ) ;
190+
191+ // Draw eraser shape (rectangle with slight perspective)
192+ int eraserWidth = 16 ;
193+ int eraserHeight = 12 ;
194+ int eraserLeft = ( size - eraserWidth ) / 2 ;
195+ int eraserTop = ( size - eraserHeight ) / 2 - 2 ;
196+
197+ // Draw eraser body (pink/beige color like a traditional eraser)
198+ using ( LinearGradientBrush eraserBrush = new LinearGradientBrush (
199+ new Rectangle ( eraserLeft , eraserTop , eraserWidth , eraserHeight ) ,
200+ Color . FromArgb ( 255 , 220 , 220 ) ,
201+ Color . FromArgb ( 255 , 180 , 180 ) ,
202+ 45f ) )
203+ {
204+ g . FillRectangle ( eraserBrush , eraserLeft , eraserTop , eraserWidth , eraserHeight ) ;
205+ }
206+
207+ // Draw eraser outline
208+ using ( Pen outlinePen = new Pen ( Color . Black , 1.5f ) )
209+ {
210+ g . DrawRectangle ( outlinePen , eraserLeft , eraserTop , eraserWidth , eraserHeight ) ;
211+ }
212+
213+ // Draw diagonal lines to give texture
214+ using ( Pen texturePen = new Pen ( Color . FromArgb ( 100 , 200 , 150 , 150 ) , 1 ) )
215+ {
216+ for ( int i = 0 ; i < 3 ; i ++ )
217+ {
218+ int offset = i * 5 ;
219+ g . DrawLine ( texturePen ,
220+ eraserLeft + offset , eraserTop ,
221+ eraserLeft + offset + 6 , eraserTop + eraserHeight ) ;
222+ }
223+ }
224+
225+ // Add highlight for depth
226+ using ( Pen highlight = new Pen ( Color . White , 1 ) )
227+ {
228+ g . DrawLine ( highlight , eraserLeft + 2 , eraserTop + 2 , eraserLeft + eraserWidth - 4 , eraserTop + 2 ) ;
229+ }
230+
231+ // Draw small "eraser particles" below to indicate erasing action
232+ using ( SolidBrush particleBrush = new SolidBrush ( Color . FromArgb ( 150 , 180 , 180 , 180 ) ) )
233+ {
234+ g . FillEllipse ( particleBrush , eraserLeft + 3 , eraserTop + eraserHeight + 2 , 2 , 2 ) ;
235+ g . FillEllipse ( particleBrush , eraserLeft + 8 , eraserTop + eraserHeight + 4 , 2 , 2 ) ;
236+ g . FillEllipse ( particleBrush , eraserLeft + 12 , eraserTop + eraserHeight + 3 , 2 , 2 ) ;
237+ }
238+
239+ // Convert bitmap to cursor with hotspot at center
240+ nint hCursor = CreateCursorFromBitmap ( bitmap , size / 2 , size / 2 ) ;
241+
242+ if ( hCursor != nint . Zero )
243+ {
244+ _currentCursorHandle = hCursor ;
245+ _logger . LogDebug ( "Successfully created eraser cursor (handle: {Handle})" , hCursor ) ;
246+
247+ return System . Windows . Interop . CursorInteropHelper . Create ( new SafeCursorHandle ( hCursor ) ) ;
248+ }
249+ }
250+
251+ _logger . LogWarning ( "Failed to create eraser cursor, returning default" ) ;
252+ return WpfCursors . Cross ;
253+ }
254+ catch ( Exception ex )
255+ {
256+ _logger . LogError ( ex , "Error creating eraser cursor, using default" ) ;
257+ return WpfCursors . Cross ;
258+ }
259+ }
260+ }
261+
150262 /// <summary>
151263 /// Creates a crosshair cursor with color indicator for the Line tool
152264 /// </summary>
0 commit comments