Я работаю над программой, которая включает в себя изменение изображения курсора во время события перетаскивания, примерно через 1:30 минут выполнения или после завершения ~ 120 перетаскиваний, программа вылетает со следующей ошибкой.
System.Runtime.InteropServices.ExternalException
HResult=0x80004005
Message=A generic error occurred in GDI+.
Source=System.Drawing
StackTrace:
at System.Drawing.Bitmap.GetHicon()
at Planner.Form1.dataGridView1_DragOver(Object sender, DragEventArgs e) in C:\Users\Name\Desktop\Items\Organizer\Planner\Planner\Form1.cs:line 319
at System.Windows.Forms.Control.OnDragOver(DragEventArgs drgevent)
at System.Windows.Forms.Control.System.Windows.Forms.IDropTarget.OnDragOver(DragEventArgs drgEvent)
at System.Windows.Forms.DropTarget.System.Windows.Forms.UnsafeNativeMethods.IOleDropTarget.OleDragOver(Int32 grfKeyState, POINTSTRUCT pt, Int32& pdwEffect)
Вот код, который я использую для изменения курсора.Когда я впервые столкнулся с проблемой, я добавил try / catch, чтобы посмотреть, смогу ли я просто пропустить, вместо этого это приводит к ухудшению работы программы и ее поломке в других областях (без ошибок, просто отставание и неправильная работа)
private void dataGridView1_DragOver(object sender, DragEventArgs e)
{
e.Effect = DragDropEffects.Move;
//MessageBox.Show(CursorID);
//try
{
Bitmap DragCursor = new Bitmap(myPath + CursorID + ".png");
DragCursor.MakeTransparent(Color.FromArgb(0, 0, 0, 0)); //TODO: This doesn't add transparency
Cursor cur = new Cursor(DragCursor.GetHicon());
Cursor.Current = cur;
DragCursor.Dispose();
}
//catch (Exception ex)
//{
//}
}
Функция перетаскивания работает в DataGridView ячеек изображения и текста (где видны только ячейки изображения).Каждое изображение имеет связанный идентификатор, который размещается в правой соседней ячейке, чтобы отслеживать, какое изображение присутствует.При инициации перетаскивания изображение начальной ячейки удаляется (и появляется в виде курсора), затем при его отбрасывании целевая ячейка удерживается в памяти, изображение курсора сбрасывается в цель, а первоначальная ячейка заменяется изображением, которое теперь удерживается (от цели).Просто чтобы помочь дать представление о том, что происходит.В папке более 10000 изображений.