Как сделать так, чтобы окно формы открывало / закрывало / располагало файл изображения

МОЙ ВОПРОС: Есть ли способ получить форму окна, чтобы выпустить открытое изображение, не закрывая форму.

МОЯ ПРОБЛЕМА: я работаю над формой windows в c ++. У меня есть программа, которая позволяет пользователям редактировать изображения .bmp. Пользователь выбирает изображение, которое он хотел бы редактировать, из dataGridView. Изображения отображаются в столбце изображений в dataGridView. Когда я загружаю изображение в элемент управления dataGridView, форма открывает файл изображения и предотвращает дальнейшее редактирование файла изображения. Файл изображения нельзя редактировать, даже если элемент управления dataGridView удален. Форма должна полностью закрыться, прежде чем она выпустит файл изображения.

МОЙ КОД:

namespace EditImageTest {
public ref class Form1 : public System::Windows::Forms::Form  {
public: Form1(void)  {
// create an image column & dataGridView.
System::Windows::Forms::DataGridViewImageColumn^ c = gcnew System::Windows::Forms::DataGridViewImageColumn();
c->ImageLayout = System::Windows::Forms::DataGridViewImageCellLayout::Zoom;
System::Windows::Forms::DataGridView^ dgv = gcnew System::Windows::Forms::DataGridView();
// add column to dataGridView.
dgv->Columns->Add(c);
// add dataGridView to form.
this->Controls->Add(dgv);
// add .bmp image on desktop to dataGridView.
dgv->Rows>Add(System::Drawing::Image::FromFile("C:\\Users\\User\\Desktop\\1.bmp"));
// the form has now opened the .bmp image file preventing any edits on this file.
// you can not even manualy delete this file now.

// attempt to open the .bmp image for editing.
FILE* f;
fopen_s(&f,"C:\\Users\\User\\Desktop\\1.bmp","w");
if(f)  {
// write garbage in the .bmp image.
fwrite("SOME TEXT",sizeof(unsigned char),9,f);
// close the .bmp image.
fclose(f);
}
}
protected: ~Form1()  {  if (components)  {  delete components;  }  }
private: System::ComponentModel::Container ^components;
};
}

1

Решение

Класс Image создает файл с отображением в памяти, чтобы отобразить пиксельные данные растрового изображения в память. Это эффективно, это не займет места в файле подкачки, и если страницы ОЗУ не отображаются, то их всегда можно перезагрузить из файла. Имеет тенденцию иметь значение для растровых изображений, они могут быть довольно большими.

Но MMF создает блокировку для файла, она не будет снята, пока вы не удалите объект с помощью оператора delete. Что, конечно, не может произойти до тех пор, пока окно не закроется.

Этого можно избежать, сделав глубокую копию изображения, что позволит быстро снять блокировку. Сделайте это с помощью конструктора Bitmap (Image ^):

    auto img = System::Drawing::Image::FromFile("C:\\Users\\User\\Desktop\\1.bmp"));
dgv->Rows>Add(gcnew Bitmap(img));
delete img;
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]