2009-02-05 11 views
8

È possibile creare un cursore da un'immagine e farlo diventare semitrasparente?Crea un cursore semitrasparente da un'immagine

Attualmente sto scattando un'immagine personalizzata e sovrascrivendo l'immagine del cursore del mouse. Sarebbe bello se potessi renderlo semi-trasparente, ma non necessario. I ragazzi delle vendite adorano brillare.

Attualmente fare qualcosa di simile:

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

risposta

5

Ho provato seguente, e stava funzionando benissimo ...

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); 
    } 

e ho messo questo su evento click del pulsante (è possibile chiamare da dove vi pare):

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

E l'immagine Up.png viene salvata con il 75% di opacità in Adobe Photoshop.

0

Sulla parte superiore della mia testa (vorrei provare quella prima):

  1. creare nuova bitmap con stesse dimensioni dell'originale , ma con struttura ARGB
  2. drawimage: bitmap esistente alla nuova bitmap
  3. accedere ai dati bitmap non elaborati e sostituire A byte con 128

Si dovrebbe avere una bella bitmap semitrasparente lì.

Se le prestazioni lo consentono, è possibile eseguire la scansione di pixel completamente trasparenti e impostare A su zero per loro!

-2

che è molto facile, io non uso API.

il codice è

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. 

Mi auguro che sia la soluzione

+1

-1 non lo rende semi-trasparente. – quantum

+0

-1 Inoltre, non consente di impostare la posizione dell'hotspot. – takrl

0

Se si desidera impostare la trasparenza di un topo personalizzato cursore del bitmap 'al volo' si può trovare questa funzione utile. Usa una matrice di colori per impostare la quantità di trasparenza su ogni bitmap e restituirà quella modificata. Per avere solo un tocco di trasparenza il TranspFactor dovrebbe essere tra 225 e 245, basta provarlo. (È necessario importare System.Drawing e 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; 

}