Se puede girar su cursor utilizando la clase System.Drawing.Icon de WinForms en combinación con la capacidad de rotación de mapa de bits de WPF.
La forma de hacerlo es cargar el icono, convertirlo en un BitmapSource, usar Image y RenderTargetBitmap para rotarlo, convertirlo de nuevo a un icono, guardarlo y finalmente actualizar los bytes 2, 10 y 11 que hacer que sea .cur en lugar de .ico.
Esto es lo que se ve el código como:
public Cursor GetRotatedCursor(byte[] curFileBytes, double rotationAngle)
{
// Load as Bitmap, convert to BitmapSource
var origStream = new MemoryStream(curFileBytes);
var origBitmap = new System.Drawing.Icon(origStream).ToBitmap();
var origSource = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(origBitmap.GetHBitmap());
// Construct rotated image
var image = new Image
{
BitmapSource = origSource,
RenderTransform = new RotateTransform(rotationAngle)
};
// Render rotated image to RenderTargetBitmap
var width = origBitmap.Width;
var height = origBitmap.Height;
var resultSource = new RenderTargetBitmap(width, height, 96, 96, PixelFormats.Pbgra32);
resultSource.Render(image);
// Convert to System.Drawing.Bitmap
var pixels = new int[width*height];
resultSource.CopyPixels(pixels, width, 0);
var resultBitmap = new System.Drawing.Bitmap(width, height, System.Drawing.Imaging.PixelFormat.Format32bppPargb);
for(int y=0; y<height; y++)
for(int x=0; x<width; x++)
resultBitmap.SetPixel(x, y, Color.FromArgb(pixels[y*width+x]));
// Save to .ico format
var resultStream = new MemoryStream();
new System.Drawing.Icon(resultBitmap.GetHIcon()).Save(resultStream);
// Convert saved file into .cur format
resultStream.Seek(2); resultStream.WriteByte(curFileBytes, 2, 1);
resultStream.Seek(10); resultStream.WriteByte(curFileBytes, 10, 2);
resultStream.Seek(0);
// Construct Cursor
return new Cursor(resultStream);
}
Si se quiere evitar el bucle, se puede reemplazar con un pequeño trozo de código usafe a llamar al constructor System.Drawing.Bitmap que toma los datos de inicialización :
fixed(int* bits = pixels)
{
resultBitmap = new System.Drawing.Bitmap(width, height, width, System.Drawing.Imaging.PixelFormat.Format32bppPargb, new IntPtr(bits));
}
Tendrá que llamar a esto cada vez que cambie la rotación del cuadro de texto. Esto se puede hacer desde el código que rota su TextBox, o desde un PropertyChangedCallback en un valor que está vinculado a la rotación del TextBox.
Tal vez ... Dado que el "Cursor" es en sí mismo un Control real, se podría rotar de la misma manera que estoy rotando mis otros Controles. Hmmm, intentaré esto y volveré a publicar. –
Nup ... ¡No funcionó! Argh! –
Cuando dices Cursor te refieres al Cursor del mouse, es decir. el I Beam o se refiere al Caret que se muestra para indicar dónde se insertará/borrará el siguiente personaje, etc. Solo pregunto porque yo de los diez escucho la palabra cursor que solía implicar a ambos. Supongo que te refieres al cursor del mouse porque el cursor parpadea, pero pensé que lo haría de todos modos. –