2010-05-14 15 views
9

Tengo un TextBox que permito a mis usuarios rotar. Pero lo que ME ENCANTARÍA a mis usuarios es hacer que su Cursor gire en el mismo ángulo en que se giró el TextBox. Por ejemplo, si rotaron el TextBox a 28 °, cuando el Cursor ingrese ese TextBox, el Cursor también debería rotar a 28 °.Cursor giratorio de acuerdo con el cuadro de texto girado

Cualquier ayuda será muy apreciada.

Gracias :)

+0

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. –

+0

Nup ... ¡No funcionó! Argh! –

+0

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. –

Respuesta

8

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.

+0

¡Guau! Funciona perfectamente Muchas gracias por tomarse el tiempo para escribir esto. ¡Brillante! –

+0

De nada. Fue un pequeño rompecabezas divertido. Me alegro de que mi código realmente funcionó. –

+0

Recibo varios errores de sintaxis. – SepehrM

0

mmm no estoy seguro ... pero desde el cursor es administrado por Windows .. supongo que tendría que ocultar el cursor cuando se entra en el cuadro de texto y dibujar su propio (que sería fácil de girar ya que está girando los otros controles).

Je, buscar en Google una manera de hacer esto, el primer resultado fue naturalmente de SO, es posible que desee comprobar la respuesta aceptada (si está utilizando WPF):

Custom cursor in WPF?

+0

Gracias por esto. :-) Me salvó un montón de futre y el tiempo jajaja. –

Cuestiones relacionadas