• Как решить проблемы с ошибкой при изменении размера PictureBox в Visual Studio?

    lPestl
    @lPestl Автор вопроса
    UPD:
    Простой пример:
    На форме Form1 имеется элемент pictureBox, с установленными свойствами зависимости от размеров окна:
    this->pictureBox1->Anchor = static_cast<System::Windows::Forms::AnchorStyles>((((System::Windows::Forms::AnchorStyles::Top | System::Windows::Forms::AnchorStyles::Bottom) 
    				| System::Windows::Forms::AnchorStyles::Left) 
    				| System::Windows::Forms::AnchorStyles::Right));

    Так же на этой форме имеется таймер. Вот код который выполняется при событии 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));    
    					  }

    И два обработчика событий для изменения размера формы:
    private: System::Void Form1_ResizeBegin(System::Object^  sender, System::EventArgs^  e) {
    			 timer1->Stop();
    		 }
    private: System::Void Form1_ResizeEnd(System::Object^  sender, System::EventArgs^  e) {
    			 timer1->Start();
    		 }


    Но проблему это не решает. И при попытке изменить размер окна выскакивает следующее окошко с сообщением:
    An unhandled exception of type 'System.AccessViolationException' occurred in System.Drawing.dll
    Additional information: Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена.

    (Кстати только сейчас заметил что вид ошибки изменился, по крайней мере на том примере который я сейчас привел) В этом примере я попытался воссоздать те условия при которых ошибка вылетает. Не знаю на сколько удачно.