問題:このコードをループで 3322 回 (bottom メソッドを使用すると 1246 回) 使用した後、GetHIcon() で一般的な GDI+ 例外がスローされます。
サンプル プロジェクト: http://dl.dropbox.com/u/18919663/TestGDICursorDrawing.zip
私がやろうとしていること:ループ内のビットマップから新しいカーソルを描画して、単純なフォーカス アニメーションを実行します。
既に確認したこと:すべてのビットマップとグラフィックスが破棄されていることを確認し、メモリ リークを監視して確認しました。また、他のプロセスに目に見えるリークがないことも確認してください。ビットマップが正しく使用されていることを確認するために、別の方法と方法を試しました。
Google からの回答: GDI+ にバグがあるようで、誰も解決策を提供していません。1 人が独自のビットマップからアイコンへのコンバーターを作成しようとしましたが、非一般的な画像サイズを処理するには柔軟性がありません。
public static Cursor CreateCursor(Bitmap bmp, int xHotSpot, int yHotSpot)
{
//Shows me exactly when the error occurs.
counter++;
Console.WriteLine(counter + " GetHicon() calls");
//GetHicon() is the trouble maker.
var newCur = new Cursor(bmp.GetHicon());
bmp.Dispose();
bmp = null;
return newCur;
}
私が試した他の方法:
public static Cursor CreateCursor(Bitmap bmp, int xHotSpot, int yHotSpot)
{
//Tried this method too, but this method results in an error with even fewer loops.
Bitmap newBitmap = new Bitmap(bmp);
// was told to try to make a new bitmap and dispose of the last to ensure that it wasn't locked or being used somewhere.
bmp.Dispose();
bmp = null;
//error occurs here.
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; // Specifies whether this structure defines an icon or a cursor. A value of TRUE specifies
public Int32 xHotspot; // Specifies the x-coordinate of a cursor's hot spot. If this structure defines an icon, the hot
public Int32 yHotspot; // Specifies the y-coordinate of the cursor's hot spot. If this structure defines an icon, the hot
public IntPtr hbmMask; // (HBITMAP) Specifies the icon bitmask bitmap. If this structure defines a black and white icon,
public IntPtr hbmColor; // (HBITMAP) Handle to the icon color bitmap. This member can be optional if this
}