Как решить проблемы с ошибкой при изменении размера PictureBox в Visual Studio?
Имеем диалоговую форму для работы с камерой, где в элемент pictureBox выводиться изображения кадров, которые меняются в Timer_tick. Все работает отлично, но если попробовать изменить размер окна (размер pictureBox меняется вместе с ним), то вылетает ошибка и приложение падает. Деббагер останавливается на строке вызова этого диалогового окна. В output запись об ошибке следующая:
An unhandled exception of type 'System.ArgumentException' occurred in System.Drawing.dll
Additional information: Недопустимый параметр.
Пробовал останавливать таймер по событию SizeChanged, но это не помогло.
Подскажите как эту проблему можно победить? Если требуется более подробное описание с приведением кода, могу привести. Сразу не привел потому, что похожая ошибка вылетает даже в самых простых случаях в примерах с подобным описанием.
Так же на этой форме имеется таймер. Вот код который выполняется при событии Timer_tick:
// Задаем имя для временного файла (буфер)
const char *filename = "img.jpg";
// Очищаем Image ^img;
img = nullptr;
// Получаем IP-адрес в String ^ipaddress;
ipaddress = "http://" + ipAdress->Text + "/snapshot.cgi?user=" + logIn->Text + "&pwd=" + passWord->Text;
// Standard C++ string declaration
std::string str;
// Convert Managed (.Net) String to standard C++ string
// (Look in the Utils.cpp file of the project)
ToStdString(ipaddress,str);
// Convert to const char
const char *chIpAddress=str.c_str();
//Если скачивание с камеры успешно, то...
if ( URLDownloadToFileA(NULL,LPCSTR(chIpAddress),LPCSTR(filename),0,NULL) == S_OK ) {
//Считываем скаченный кадр с IP-камеры
cv::Mat frame=cv::imread("img.jpg");
int size=frame.elemSize();
int step=frame.step;
//Преобразуем в .NET
img = gcnew Bitmap(frame.cols, frame.rows,step,PixelFormat::Format24bppRgb, IntPtr(frame.data));
//Выводим на pictureBox1
this->pictureBox1->Image=img;
this->pictureBox1->Refresh();
//освобождаем память (не обязательно для cv::Mat)
//frame.release();
//Очищаем кэш для следующего кадра
DeleteUrlCacheEntryA(LPCSTR(chIpAddress));
//Если не удалось подключиться к камере и получить кадр, то тормозим процесс
}else{
timer1->Enabled=false;
btnStart->Enabled=true;
btnStart->Text="Старт";
//this->pictureBox1->Image = NULL;
MessageBox::Show("Не могу подключиться к камере");
DeleteUrlCacheEntryA(LPCSTR(chIpAddress));
}
И два обработчика событий для изменения размера формы:
Но проблему это не решает. И при попытке изменить размер окна выскакивает следующее окошко с сообщением:
An unhandled exception of type 'System.AccessViolationException' occurred in System.Drawing.dll
Additional information: Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена.
(Кстати только сейчас заметил что вид ошибки изменился, по крайней мере на том примере который я сейчас привел) В этом примере я попытался воссоздать те условия при которых ошибка вылетает. Не знаю на сколько удачно.