Barbarosa, aquí hay un sub de una de mis herramientas que establece el cursor utilizando un mapa de bits dibujado "en la memoria", aunque usted podría fácilmente cargar un mapa de bits o un archivo de cursor de los recursos o la ubicación conocida ( System.Reflection.Assembly.GetExecutingAssembly().Location
quizás). Probablemente sea un poco demasiado prolijo, pero seguro que hay una o dos joyas que pueden ayudarte con tu(s) punto(s) conflictivo(s).
Tenga en cuenta que el cursor de la herramienta es sólo válido mientras el cursor del ratón está sobre el lienzo de ArcMap y luego vuelve al cursor de la ventana actual tan pronto como el cursor del ratón abandona la ventana. this.Cursor
es una propiedad de ESRI.ArcGIS.Desktop.AddIns.Tool no así para ESRI.ArcGIS.Desktop.AddIns.Button .
System.Windows.Forms.Cursor gFirstSelectionCursor;
System.Windows.Forms.Cursor gSecondSelectionCursor;
System.Windows.Forms.Cursor gSnappingCursor;
public void SetCursor()
{
gDispTran = gDoc.ActiveView.ScreenDisplay.DisplayTransformation;
int pHalfCursorSize = (int)cCursorSize / 2;
int pQuarterCursorSize = (int)pHalfCursorSize / 2;
System.Drawing.Point UL = new System.Drawing.Point(pQuarterCursorSize, pQuarterCursorSize);
System.Drawing.Point UR = new System.Drawing.Point(cCursorSize - pQuarterCursorSize, pQuarterCursorSize);
System.Drawing.Point LL = new System.Drawing.Point(pQuarterCursorSize, cCursorSize - pQuarterCursorSize);
System.Drawing.Point LR = new System.Drawing.Point(cCursorSize - pQuarterCursorSize, cCursorSize - pQuarterCursorSize);
Bitmap pBitmap = new Bitmap(cCursorSize, cCursorSize, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
Graphics pGraphics = Graphics.FromImage(pBitmap);
pGraphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.None;
Rectangle pRect = new Rectangle(0, 0, cCursorSize, cCursorSize);
int pHalfSelection = (int)gSelectionTolerance / 2;
pRect = new Rectangle(pHalfCursorSize - pHalfSelection, pHalfCursorSize - pHalfSelection, gSelectionTolerance, gSelectionTolerance);
Color pCol = Color.Transparent;
Color pCircleColour;
if (gCursorColour == gCursorEnum.Black)
pCircleColour = Color.Black;
else if (gCursorColour == gCursorEnum.Red)
pCircleColour = Color.Red;
else if (gCursorColour == gCursorEnum.White)
pCircleColour = Color.White;
else if (gCursorColour == gCursorEnum.Yellow)
pCircleColour = Color.Yellow;
else
pCircleColour = Color.Black;
// set the draw lines to the same colour as the
// selection circle
ILineSymbol pLineSym = new SimpleLineSymbol();
pLineSym.Color.RGB = ((pCircleColour.R | pCircleColour.G << 8) | pCircleColour.B << 0x10);
//pLineSym.Color = (IColor)ESRI.ArcGIS.ADF.Converter.ToRGBColor(pCircleColour);
pLineSym.Width = 1;
gSym = (ISymbol)pLineSym;
Brush pBrush = new SolidBrush(pCol);
float[] pDashValues = { 3, 1 };
Pen pPen = new Pen(pCircleColour, 1);
pPen.DashPattern = pDashValues;
pGraphics.FillRectangle(pBrush, pRect);
pGraphics.DrawEllipse(pPen, pRect);
gFirstSelectionCursor = new System.Windows.Forms.Cursor(pBitmap.GetHicon());
// second cursor
pBitmap = new Bitmap(cCursorSize, cCursorSize, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
pGraphics = Graphics.FromImage(pBitmap);
pGraphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.None;
pGraphics.DrawLine(pPen, UL, LR);
pGraphics.DrawLine(pPen, LL, UR);
gSecondSelectionCursor = new System.Windows.Forms.Cursor(pBitmap.GetHicon());
// third cursor
pBitmap = new Bitmap(cCursorSize, cCursorSize, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
pGraphics = Graphics.FromImage(pBitmap);
pGraphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.None;
pGraphics.DrawLine(pPen, UL, LR);
pGraphics.DrawLine(pPen, LL, UR);
pRect = new Rectangle((int)pHalfCursorSize / 2, (int)pHalfCursorSize / 2, pHalfCursorSize, pHalfCursorSize);
pGraphics.DrawEllipse(pPen, pRect);
gSnappingCursor = new System.Windows.Forms.Cursor(pBitmap.GetHicon());
if (gSelectionStarted)
this.Cursor = gSecondSelectionCursor;
else
this.Cursor = gFirstSelectionCursor;
}
Esto define el cursor como un círculo de cCursorSize
cuando se selecciona y cambia a una X grande cuando se selecciona algo. Tenga en cuenta que los cursores reales son globales, lo que permite un cambio rápido durante el evento OnMouseDown; este sub se llama sólo al iniciar la herramienta y cuando el cCursorSize
se modifica a través de un formulario.