Problem: . After using this code in a loop 3322 times (1246 times using the bottom method), a general GDI + exception is thrown in GetHIcon ().
Project example: http://dl.dropbox.com/u/18919663/TestGDICursorDrawing.zip
What I'm trying to do: Draw a new cursor from a bitmap in a loop to make a simple focusing animation.
What I already checked: I made sure that all bitmaps and graphics are located and controlled by memory leaks to make sure. Also make sure that no other process has a visible leak. We tried alternative methods and ways to ensure the correct use of bitmaps.
What Google told me: There is a bug in GDI +, and no one has suggested a solution. One person tried to create their own Bitmap to Icon converter, but it is not flexible enough to make non-generic images.
public static Cursor CreateCursor(Bitmap bmp, int xHotSpot, int yHotSpot)
{
counter++;
Console.WriteLine(counter + " GetHicon() calls");
var newCur = new Cursor(bmp.GetHicon());
bmp.Dispose();
bmp = null;
return newCur;
}
Another method I tried:
public static Cursor CreateCursor(Bitmap bmp, int xHotSpot, int yHotSpot)
{
Bitmap newBitmap = new Bitmap(bmp);
bmp.Dispose();
bmp = null;
IntPtr ptr = newBitmap.GetHicon();
ICONINFO tmp = new ICONINFO();
GetIconInfo(ptr, ref tmp);
tmp.xHotspot = xHotSpot;
tmp.yHotspot = yHotSpot;
tmp.fIcon = false;
ptr = CreateIconIndirect(ref tmp);
newBitmap.Dispose();
newBitmap = null;
return new Cursor(ptr);
}
[DllImport("user32.dll", EntryPoint = "GetIconInfo")]
public static extern bool GetIconInfo(IntPtr hIcon, ref ICONINFO piconinfo);
[DllImport("user32.dll")]
public static extern IntPtr CreateIconIndirect(ref ICONINFO icon);
[StructLayout(LayoutKind.Sequential)]
public struct ICONINFO
{
public bool fIcon;
public Int32 xHotspot;
public Int32 yHotspot;
public IntPtr hbmMask;
public IntPtr hbmColor;
}
source
share