2009-02-05 15 views
8

¿Es posible crear un cursor a partir de una imagen y hacer que sea semitransparente?Crear un cursor semitransparente desde una imagen

Actualmente estoy tomando una imagen personalizada y sobreescribiendo la imagen del cursor del mouse. Sería genial si pudiera hacer esto semitransparente, pero no necesario. A los vendedores les encanta brillante.

Actualmente haciendo algo como esto:

Image cursorImage = customImage.GetThumbnailImage(300, 100, null, IntPtr.Zero); 
cursorImage.SetResolution(96.0F, 96.0F); 
int midPointX = cursorImage.Width/2; 
int midPointY = cursorImage.Height/2; 
Bitmap cursorMouse = GetCursorImage(cursorOverlay); 
Graphics cursorGfx = Graphics.FromImage(cursorImageCopy); 
cursorGfx.DrawImageUnscaled(cursorMouse, midPointX, midPointY); 

Cursor tmp = new Cursor(cursorImage.GetHicon()); 

alt text http://members.cox.net/dustinbrooks/drag.jpg

Respuesta

5

He intentado siguiente ejemplo, y estaba trabajando bien ...

public struct IconInfo 
    { 
     public bool fIcon; 
     public int xHotspot; 
     public int yHotspot; 
     public IntPtr hbmMask; 
     public IntPtr hbmColor; 
    } 


    [DllImport("user32.dll")] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    public static extern bool GetIconInfo(IntPtr hIcon, ref IconInfo pIconInfo); 

    [DllImport("user32.dll")] 
    public static extern IntPtr CreateIconIndirect(ref IconInfo icon); 

    public static Cursor CreateCursor(Bitmap bmp, int xHotSpot, int yHotSpot) 
    { 
     IntPtr ptr = bmp.GetHicon(); 
     IconInfo tmp = new IconInfo(); 
     GetIconInfo(ptr, ref tmp); 
     tmp.xHotspot = xHotSpot; 
     tmp.yHotspot = yHotSpot; 
     tmp.fIcon = false; 
     ptr = CreateIconIndirect(ref tmp); 
     return new Cursor(ptr); 
    } 

Y he puesto en este evento de clic de botón (se puede llamar desde donde se quiere):

Bitmap b = new Bitmap("D:/Up.png"); 
this.Cursor = CreateCursor(b, 5, 5); 

Y la imagen Up.png se guarda con un 75% de opacidad en Adobe Photoshop.

0

En la parte superior de la cabeza (me gustaría probar que la primera):

  1. crear nuevo mapa de bits con el mismo tamaño que el original , pero con la estructura ARGB
  2. drawimage: mapa de bits existente en el nuevo mapa de bits
  3. acceder datos de mapa de bits sin procesar, y reemplazar A bytes con 128

Debe tener un mapa de bits semitransparente agradable allí.

Si el rendimiento lo permite, puede escanear en busca de píxeles completamente transparentes y establecer A en cero para ellos.

-2

eso es muy fácil, no uso la API.

el código es

Bitmap img = new Bitmap(new Bitmap(@"image.png"), 30, 30); //this is the size of cursor 

    Icon icono = Icon.FromHandle(img.GetHicon()); //create the Icon object 

    Cursor = new Cursor(icono.Handle); //the icon Object has the stream to create a Cursor. 

espero que sea la solución

+1

-1 no lo hace semitransparente. – quantum

+0

-1 Además, no permite establecer la ubicación del punto de acceso. – takrl

0

Si desea establecer la transparencia de un ratón de encargo del cursor de mapa de bits 'sobre la marcha' se puede encontrar esta función útil. Utiliza una matriz de colores para establecer la cantidad de transparencia en cualquier mapa de bits dado y devolverá la modificación. Para tener un toque de transparencia, TranspFactor debe estar entre 225 y 245, solo pruébalo. (Es necesario importar System.Drawing y System.Drawing.Imaging)

public static Bitmap GetBMPTransparent(Bitmap bmp, int TranspFactor) 

{

Bitmap transpBmp = new Bitmap(bmp.Width, bmp.Height); 
using (ImageAttributes attr = new ImageAttributes()) { 
    ColorMatrix matrix = new ColorMatrix { Matrix33 = Convert.ToSingle(TranspFactor/255) }; 
    attr.SetColorMatrix(matrix); 
    using (Graphics g = Graphics.FromImage(transpBmp)) { 
     g.DrawImage(bmp, new Rectangle(0, 0, bmp.Width, bmp.Height), 0, 0, bmp.Width, bmp.Height, GraphicsUnit.Pixel, attr); 
    } 
} 
return transpBmp; 

}

Cuestiones relacionadas