locked
Как реализовать Save As для рисования в Form с помощью Visual Studio C ++ RRS feed

  • Вопрос

  • Здравствуйте. Пожалуйста, помогите. использую Visual Studio 2015 Community, C ++ Windows Forms.

    Я делаю появление рисунка, линий, точек, многоугольников, фигур прямо на форме (Windows Forms). Полигон появляется непосредственно на поверхности этой Формы. Я использую FillPolygon(), SolidBrush(), TexturedBrush(). Изменяю размер формы и результат FillPolygon() исчезает. Есть ли какой-либо метод или свойство для предотвращения исчезновения?

    Рисую на форме и хочу сохранить последние изменения, используя «Сохранить Как - Save As», но последние изменения не сохраняются. Как сохранить их с помощью «Сохранить как - Save As»?

    Мне нужно рисовать в pictureBox, а не использовать .jpeg, gif, tiff images. Я создал ShowDialog (). Как создать способность видеть сохраненный последний шаг? Мне нужно понять точный алгоритм, получить код метода Save As.
    Где я могу увидеть функцию «Отменить последний шаг» (Отменить Ctrl + Z)?

    Будет лучше получить код с комментариями на C ++, постараюсь также понять код на С #. Пожалуйста, подробно не кратко, как обычно опытные программисты объясняют начинающим. Я буду рад получить ссылки на точный URL.

    Мой код:

    using namespace System::Drawing;
    using namespace System::Drawing::Drawing2D; 
    using namespace System::Drawing::Imaging;                   
    using namespace System::IO;
    
    public ref class Creat : public System::Windows::Forms::Form
        {
        private:
            Bitmap ^nak;    // variable Bitmap image
    
        PictureBox^ pictureBox4;
    
    public:
        void SaveAs(String^ filename)          // Save As method
        {
            throw gcnew System::NotImplementedException();
        }
       // constructor       
            Creat(void)
            {
                InitializeComponent();
    // setting the openDialog1 component
    
       openFileDialog1->AddExtension = true;
       openFileDialog1->Filter = "Image Files(*.bmp)|*.bmp|Image Files(*.JPG)|*.JPG|Image Files(*.jpeg)|*.jpeg|Image Files(*.GIF)|*.GIF|Image Files(*.emf)|*.emf|Image Files(*.ico)|*.ico|Image Files(*.png)|*.png|Image Files(*tif)|*.tif|Image Files(*.wmf)|*.wmf|Image Files(*.exif)|*.exif|All files(*.*)|*.*";
       openFileDialog1->FilterIndex = 2;
       openFileDialog1->DefaultExt = "jpg";
       openFileDialog1->Title = "Open Document";            
       openFileDialog1->Multiselect = false;
       openFileDialog1->CheckFileExists = true;
    
        // setting the saveFileDialog1 component
    
        saveFileDialog1->AddExtension = true;           
        saveFileDialog1->Filter = "Image Files(*.bmp)|*.bmp|Image Files(*.JPG)|*.JPG|Image Files(*.jpeg)|*.jpeg|Image Files(*.GIF)|*.GIF|Image Files(*.emf)|*.emf|Image Files(*.ico)|*.ico|Image Files(*.png)|*.png|Image Files(*.tif)|*.tif|Image Files(*.wmf)|*.wmf|Image Files(*.exif)|*.exif|All files(*.*)|*.*";
        saveFileDialog1->FilterIndex = 2;
        saveFileDialog1->DefaultExt = "jpg";            
        saveFileDialog1->Title = "Save Document";
        saveFileDialog1->CheckFileExists = true;
    
        fn = String::Empty;         // fn- file name
        imageChanged = false;
    }
    
    void InitializeComponent(void)
        {
           ...
           // saveFileDialog1
    
           this->saveFileDialog1->Filter = resources->GetString(L"saveFileDialog1.Filter");
    
            // openFileDialog1
    
            this->openFileDialog1->FileName = L"openFileDialog1";
            this->openFileDialog1->Filter = resources->GetString(L"openFileDialog1.Filter");
        ...
        }
        #pragma endregion
    
        String^ fn;                 // fn - file name
        bool imageChanged;   // true - if I made changes to the image
    
    // The image has changed in PictureBox'e 'or in the Form
    
        private: System::Void pictureBox1_BackgroundImageChanged(System::Object^  sender, System::EventArgs^  e) 
        {
            imageChanged = true;                        
        }
    
        // Writes an image to a file. 
        //Returns 0 or -1 if the user in the Save window clicks Cancel
    
        private: int ImageToFile()
        {
            System::Windows::Forms::DialogResult dr;
            int r = 0;                                  
    
            if (fn == String::Empty)
            {
                // this is a new document, ask the user for the file name.  
                // display the Save dialog
    
                dr = saveFileDialog1->ShowDialog();
                if (dr == System::Windows::Forms::DialogResult::OK)
                {
                    fn = saveFileDialog1->FileName;
                    r = 0;
                }
                    else
                    r = -1; // user did not save. click on the Cancel 
                            //button
            }
    
            // save file
    
            if (r == 0)
            {
                try
                {
                    // get information about the file fn
                    System::IO::FileInfo^ fi = gcnew System::IO::FileInfo(fn);
    
                    System::IO::FileStream^ fs = safe_cast<System::IO::FileStream^>(saveFileDialog1->OpenFile());
    
                    // stream for writing
                    System::IO::StreamWriter^ sw = fi->CreateText();
                    sw->Write(pictureBox1->Image);
                    sw->Close();     // close the stream
                    imageChanged = false;
                    r = 0;
                }
                catch (System::IO::IOException^ e)
                {
                    MessageBox::Show(e->ToString(), "BeautifulLady", MessageBoxButtons::OK, MessageBoxIcon::Information);
                }
            }
            return r;
        }
    
        // Check if there are any changes to the Image and save the Image 
        //in the file.
        // Returns: 0 or -1 if the user declines to save (click Cancel)
    
    private: int SaveImg()
    {
        System::Windows::Forms::DialogResult dr;
        int r;
        r = 0;
    
        if (imageChanged) // The image has been changed. Do you want to 
         // save it?
        {
            dr = MessageBox::Show("The image has been changed. Do you want to save it?", "BeautifulLady", MessageBoxButtons::YesNoCancel, MessageBoxIcon::Warning);
    
            switch (dr)
            {
            case System::Windows::Forms::DialogResult::Yes: 
                r = ImageToFile();    
                break;
            case System::Windows::Forms::DialogResult::No:
                r = 0;
                break;
            case System::Windows::Forms::DialogResult::Cancel:
                r = -1;
                break;
            }
        }
        return r;
    }
    
            // Open document
    
    private: void OpenDocument()
    {
        System::Windows::Forms::DialogResult dr;
        int r;
        r = SaveImg();
    
        if (r == 0)
        {
            openFileDialog1->FileName = String::Empty;
    
            // showing the Open window
    
            dr = openFileDialog1->ShowDialog();
            if (dr == System::Windows::Forms::DialogResult::OK)
            {
                fn = openFileDialog1->FileName;
    
                    // show file name in the title of the window
    
                this->Text = fn;
    
        // large object (Blob) - image file
    
        String^ sBlobFile = "C:\\Users\\Igor\\Pictures\\model.jpg";    
    
    try
    {
        // I read data from a file
        System::IO::StreamReader^ sr = gcnew System::IO::StreamReader(fn);
    
        FileStream^ fsBlobData = gcnew FileStream(sBlobFile, System::IO::FileMode::Open, System::IO::FileAccess::Read);
    
        System::IO::FileStream^ fs = gcnew System::IO::FileStream(fn, System::IO::FileMode::Open);
        Byte *bytBlobdata = new Byte[fsBlobData->Length];
    
    //  fsBlobData->Read(bytBlobdata, 0, bytBlobdata->Length);
    //  sBlobFile->Read(bytBlobdata, 0, bytBlobdata->Length);
    //  fsBlobData.Close();
    //  MemoryStream stmBlobData = new MemoryStream(bytBlobData);
    //  FileStream dumpFile = new FileStream("C:\Dump.jpg", 
    //  FileMode.Create, FileAccess.ReadWrite);
    //  stmBlobData.WriteTo(dumpFile);
    //  stmBlobData.Close();
    //  pictureBox1->Image = fs->BeginRead();
        fs->Close();
        File::Delete(sBlobFile);
    
        FileStream^ dumpFile = gcnew 
    FileStream("C:\\Users\\Igor\\Pictures\\Dump.jpg", 
                                                    System::IO::FileMode::Create, System::IO::FileAccess::ReadWrite);
    
    //  System::IO::BinaryReader^ br = gcnew System::IO::BinaryReader(fn);    
    
        Image^ img = Image::FromStream(fs);
    //  Bitmap^ bmp = Image::FromStream(fs);
    //  pictureBox1->Text = sr->ReadToEnd();                        
    //  pictureBox1->SelectionStart = pictureBox1->TextLength;          
    
        img->Save(fn, System::Drawing::Imaging::ImageFormat::Jpeg);
        imageChanged = false;
    }
    catch (System::IO::FileLoadException^ e)
        {
           MessageBox::Show("Error of reading the image file\n" + e->Message, "BeautifulLady", MessageBoxButtons::OK,
                            MessageBoxIcon::Error);                  
        }
    }           
    }
    }
        // Save the document
    
        private: void SaveDocument()
        {
            System::Windows::Forms::DialogResult dr;
            int r;
            r = SaveImg();
    
                if (r == 0)
                {
                    this->Text = fn;
                    imageChanged = false;
    
                    // show Save dialog
                    dr = saveFileDialog1->ShowDialog();
                }           
            }
    
    // create a document
    
    private: void NewDocument()
    {
        int r;
        r = SaveImg();
    
        if (r == 0)
        {
            this->Text = "New Image";
    
                // to paint over the previous one
    
                Color ^col = gcnew Color();
                Graphics ^im = this->CreateGraphics();
                im->Clear(col->White);
                imageChanged = false;
                fn = String::Empty;
            }
        }
    
    // User attempts to close the program window
    
    private: System::Void Creat_FormClosing(System::Object^  sender, System::Windows::Forms::FormClosingEventArgs^  e) 
    {
        int r;
        r = SaveImg();
            if (r != 0)
            {
                e->Cancel = true;
            }
        }
    
    // function to save the polygon
    
    private: void Save_Restore(PaintEventArgs^ e)
    {
        Graphics^ og = this->CreateGraphics();  
    
        // I create a polygon
        SolidBrush ^sb = gcnew SolidBrush(Color::Blue);
    
        Point pa1 = Point(850, 200);
        Point pa2 = Point(900, 250);
        Point pa3 = Point(930, 270);
        Point pa4 = Point(950, 280);
        Point pa5 = Point(850, 200);
    
        array<Point>^ pP = { pa1,pa2,pa3,pa4,pa5, };
        og->FillPolygon(sb, pP);
    
        // I save the polygon
        SaveImg();
        SaveDocument();
        GraphicsState^ creaPolState = e->Graphics->Save();
    }
    
    // Save (click the Save button)
    
    private: System::Void button16_Click(System::Object^  sender, System::EventArgs^  e) 
    {
        saveFileDialog1->ShowDialog();
        Bitmap^ bitmap = gcnew Bitmap(Convert::ToInt32(1024), Convert::ToInt32(1024), System::Drawing::Imaging::PixelFormat::Format32bppArgb);
            Graphics^ g = Graphics::FromImage(bitmap);
    
        g = this->CreateGraphics();
    
        // I create a polygon
    
        SolidBrush ^sb = gcnew SolidBrush(Color::Blue);
    
            Point pa1 = Point(150, 200);
            Point pa2 = Point(200, 250);
            Point pa3 = Point(230, 270);
            Point pa4 = Point(150, 200);        
    
            array<Point>^ pP = { pa1,pa2,pa3,pa4 };
            g->FillPolygon(sb, pP);
    
            g->DrawImage(bitmap, (sb, (pa1, pa2, pa3, pa4)));       
    
            bitmap->Save("C:\\Users\\Igor\\Pictures\\savepol.jpg", System::Drawing::Imaging::ImageFormat::Jpeg);
    
            SaveImg();
            SaveDocument();
    private: String^ full_name_of_image;    // full pathname + name
    private: Bitmap^ bitmap_for_draw;   // bitmap for drawing 
    
            // button to display the image in pictureBox1
    
    private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e)
    {
            // Get image
    
        nak = gcnew Bitmap(Application::StartupPath + "\\model.jpg", true);  
        pictureBox1->Image = nak; // PictureBox to display the image                        
    
            // "Open" dialog box
    
        OpenFileDialog^ opf = gcnew OpenFileDialog();
        opf->Filter = "Image Files(*.BMP)|*.BMP|Image Files(*.JPG)|*.JPG|Image Files(*.GIF)|*.GIF|Image Files(*.PNG)|*.PNG|All files(*.*)|*.*";
    
    if (opf->ShowDialog() == System::Windows::Forms::DialogResult::Yes)
    {           
        try
        {
            full_name_of_image = opf->FileName;
            bitmap_for_draw = gcnew Bitmap(opf->FileName);
            this->pictureBox1->SizeMode = PictureBoxSizeMode::CenterImage;
            bitmap_for_draw = nak;
            pictureBox1->Image = bitmap_for_draw;
            pictureBox1->Invalidate();
        }
        catch (IOException^)
        {
            System::Windows::Forms::DialogResult^ result;
            result = MessageBox::Show("Impossible to open selected file\n," + "probably the file does not exists.", "Beautiful Lady", MessageBoxButtons::OK, MessageBoxIcon::Information);
        }
      }
    }
    
    // Drawing on model in pictureBox1
    
    bool Draw;          // drawing variable in pictureBox1
    private: System::Void button19_Click(System::Object^  sender, System::EventArgs^  e)
    {
        Graphics^ g = pictureBox1->CreateGraphics();        
    
    }
    
    // User moves the mouse and draws on the model
    
    private: System::Void pictureBox1_MouseMove(System::Object^  sender, System::Windows::Forms::MouseEventArgs^  e)
    {
         Graphics^ gr = pictureBox1->CreateGraphics();
         SolidBrush ^sb = gcnew SolidBrush(Color::AliceBlue);
         if (Draw)
         {
             gr->FillRectangle(sb, e->X, e->Y, 1, 1);   // brush thickness 
             // filling with rectangles
         }
    }   
    // User pressed the mouse button
    
    private: System::Void pictureBox1_MouseDown(System::Object^  sender, System::Windows::Forms::MouseEventArgs^  e)
    {
        Draw = true;
    }   
    
    // User let go of the mouse     
    private: System::Void pictureBox1_MouseUp(System::Object^  sender, System::Windows::Forms::MouseEventArgs^  e)
    {
        Draw = false;
    }
    
    // to use the Save method.'Save Model' button
    
    private: System::Void button15_Click(System::Object^  sender, System::EventArgs^  e)
    {           
        Bitmap ^myImage = gcnew 
        Bitmap("C:\\Users\\Igor\\Pictures\\orgn.jpg");
    
        if (pictureBox1->Image != nullptr)
        {
            full_name_of_image = "C:\\Users\\Igor\\Pictures\\orgn1.jpg";
            String^ format = full_name_of_image->Substring(full_name_of_image->Length - 5, 4);  
    
            SaveFileDialog^ sd = gcnew SaveFileDialog();
            sd->Title = "Save image As";
            sd->CheckPathExists = true;
            sd->CheckFileExists = true;
            sd->AddExtension = true;
            sd->Filter = "Image Files(*.BMP)|*.BMP|Image Files(*.JPG)|*.JPG|Image Files(*.GIF)|*.GIF|Image Files(*.PNG)|*.PNG|All files(*.*)|*.*";
            sd->FilterIndex = 2;
            sd->DefaultExt = "jpg";
            sd->OverwritePrompt = true;
            sd->ShowHelp = true;
    
            // if user choses to save
    
        if (sd->ShowDialog() == System::Windows::Forms::DialogResult::Yes)
        {
            this->saveFileDialog1->ShowDialog();
            fn = saveFileDialog1->FileName;
            SaveImg();
            SaveDocument();
    
            try
            {
                //sd->FileName = "C:\\Users\\Igor\\Pictures\\orgn1.jpg";
                myImage->Save(sd->FileName, System::Drawing::Imaging::ImageFormat::Jpeg);                   
            }
            catch(IOException^)
            {
                MessageBox::Show("Impossible to save this image", "Beautiful Lady", MessageBoxButtons::OK, MessageBoxIcon::Information);
            }   
            pictureBox1->Image->Save(sd->FileName, System::Drawing::Imaging::ImageFormat::Jpeg);
         }
    
        }
    }
    
    // draws the model
    
    private: System::Void Creat_Paint(System::Object^ sender, System::Windows::Forms::PaintEventArgs^ e)
    {   
        // for not to write e->Graphics every time
    
        System::Drawing::Graphics ^g = e->Graphics;
    
        // I draw a model at 508 horizontally, 184 vertically
        Graphics ^nak = this->CreateGraphics();         
     }
    
    // The SizeChanged event occurs when the form size is changed
    
    private: System::Void Creat_SizeChanged(System::Object^  sender, System::EventArgs^  e) 
    {
        // The Refresh method: the form needs to be redrawn
        this->Refresh();        // update form
    }

    29 июля 2018 г. 17:01

Ответы

  • " и если дать новое имя, а не имя существующего файла кидает исключение"

    Попробуйте установить saveFileDialog.CheckFileExists в false.

    "Вылетает при щелчке на "Отмена"  Не обрабатываемое исключение в приложении Платформы .NET Framework: "Путь имеет недопустимую форму"."

    Сделайте проверку, если ShowDialog возвращает DialogResult.Cancel, не идите дальше (исключение возникает, так как в имени файла в этом случае будет неизвестная строка). Ведь при нажатии на отмену не нужно ничего сохранять?

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

    Проще всего, перед рисованием полигона предварительно нарисовать прямоугольник нужного цвета (FillRectangle), шириной и высотой равный размерам изображения.

    "Да и как благодарить, что тут на сайте кликать чего как, пож-ста напишите. Я тут 2-й раз. Пока не освоился".

    Стрелка вверх если сообщение помогло, "Отметить как ответ" - если сообщение полностью решило проблему / содержит исчерпывающий ответ.

    30 июля 2018 г. 17:08
  • В вашем коде результат вызова и SaveImg, и ShowDialog игнорируется. Естественно, будет вылетать. У вас пользователь может нажать отмена как в MessageBox, так и в SaveDialog, и обе ситуации надо обработать:

    if( SaveImg() <=0) return; //(я полагаю, ImgToFile возвращает значение больше нуля?)

    if(saveFileDialog1
    ->ShowDialog() ==
    System::Windows::Forms::DialogResult::Cancel) return;

    bitmap->Save(saveFileDialog1->FileName, System::Drawing::Imaging::ImageFormat::Jpeg);

    • Помечено в качестве ответа I65 1 августа 2018 г. 12:30
    1 августа 2018 г. 11:34
  • Здравствуйте Игорь,

    Вне топика хочу отметить, что отвечающий Вадим, он указан в правом нижнем углу ответа. Я лишь предложил его ответ как решение.


    Если Вам помог чей-либо ответ, пожалуйста, не забывайте жать на кнопку "Предложить как ответ" или "Проголосовать за полезное сообщение" Мнения, высказанные здесь, являются отражение моих личных взглядов, а не позиции корпорации Microsoft. Вся информация предоставляется "как есть" без каких-либо гарантий.

    • Помечено в качестве ответа I65 1 августа 2018 г. 12:31
    1 августа 2018 г. 12:12
    Модератор
  • Спасибо VadimTagil

    сейчас буду вникать...

    игорь I65 

    • Помечено в качестве ответа I65 1 августа 2018 г. 12:32
    1 августа 2018 г. 12:30

Все ответы

  • Ошибка в том, что вы рисуете в объекте Graphics, полученном с помощью Form.CreateGraphics. Вместо этого нужно получать объект Graphics либо из аргументов события Paint (для формы), либо с помощью Graphics.FromImage (для картинки из PictureBox), и рисовать в них. 
    29 июля 2018 г. 19:44
  • Спасибо, большое Vadim Tagil!

    Если я правильно понял, код может быть таким:

    private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) 
    	{		
    
    		// создаю битмап
    		Bitmap^ bitmap = gcnew Bitmap(Convert::ToInt32(1024), Convert::ToInt32(1024), System::Drawing::Imaging::PixelFormat::Format32bppArgb);
    		
                    // создаю объект из FromImage() 
                    Graphics^ g = Graphics::FromImage(bitmap);
    
    		pictureBox2->Image = bitmap;
    
    		// создаю кисть и полигон
    		SolidBrush ^sb = gcnew SolidBrush(Color::LightCoral);
    
    		Point pa1 = Point(150, 111);
    		Point pa2 = Point(170, 120);
    		Point pa3 = Point(180, 125);
    		Point pa4 = Point(155, 115);		
    
    		array<Point>^ pP = { pa1,pa2,pa3,pa4 };
    		g->FillPolygon(sb, pP);
    
    		g->DrawImage(bitmap, (sb, (pa1, pa2, pa3, pa4)));		
    		
    	        // сохраняю 
    		SaveImg();
    		SaveDocument();
    		
    		saveFileDialog1->ShowDialog();
    		bitmap->Save(/*"C:\\Users\\Igor\\Pictures\\blu.jpg"*/saveFileDialog1->FileName, System::Drawing::Imaging::ImageFormat::Jpeg);
    }
     По щелчку на кнопке button1

    открывается окно "Сохранить", просит имя файла, и если дать новое имя, а не имя существующего файла кидает исключение, что файл с новым, предложенным мной, именем не существует и "Убедитесь в правильности указанного имени файла". Исключение системное, как бы его обработать?

    Вылетает при щелчке на "Отмена"  Не обрабатываемое исключение в приложении Платформы .NET Framework: "Путь имеет недопустимую форму".

    из-за того, что я абсолютный путь к сохраняемому файлу: C:\\Users\\Igor\\Pictures\\blu.jpg  в строке 

    bitmap->Save("C:\\Users\\Igor\\Pictures\\blu.jpg",  System::Drawing::Imaging::ImageFormat::Jpeg)

    заменил на:  saveFileDialog1->FileName

    но мне ведь надо добиться сохранять файл под любым именем и задавать путь любой.

    Функционал "Сохранить Как" создан у меня криво, изображение пересоздаётся как и хочу, а имя новое, любое, какое назначаю пересозданному, не даёт исключение описанное выше. И черный фон пересозданного изображения не знаете как заменить на бесцветный или серый. С BackColor для - System::Windows::Forms::Control::BackColor = White;   

    компилятор не принимает... Да и как благодарить, что тут на сайте кликать чего как, пож-ста напишите. Я тут 2-й раз. Пока не освоился.  

    30 июля 2018 г. 16:31
  • " и если дать новое имя, а не имя существующего файла кидает исключение"

    Попробуйте установить saveFileDialog.CheckFileExists в false.

    "Вылетает при щелчке на "Отмена"  Не обрабатываемое исключение в приложении Платформы .NET Framework: "Путь имеет недопустимую форму"."

    Сделайте проверку, если ShowDialog возвращает DialogResult.Cancel, не идите дальше (исключение возникает, так как в имени файла в этом случае будет неизвестная строка). Ведь при нажатии на отмену не нужно ничего сохранять?

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

    Проще всего, перед рисованием полигона предварительно нарисовать прямоугольник нужного цвета (FillRectangle), шириной и высотой равный размерам изображения.

    "Да и как благодарить, что тут на сайте кликать чего как, пож-ста напишите. Я тут 2-й раз. Пока не освоился".

    Стрелка вверх если сообщение помогло, "Отметить как ответ" - если сообщение полностью решило проблему / содержит исчерпывающий ответ.

    30 июля 2018 г. 17:08
  • Здравствуйте,  Maksim

    только что получилось сделать часть из рекомендованного Вами. Сохранение используя 

    saveFileDialog1->CheckFileExists = false;

    и замену черного фона при сохранении используя заливку белым прямоугольником всей площади сохраняемого изображения:

    SolidBrush^ rb = gcnew SolidBrush(Color::White);   и     g->FillRectangle(rb, 0, 0, 296, 719);

    я не нашел до сих пор способ как "сделать проверку "если ShowDialog возвращает DialogResult.Cancel" это про щелчок на "Отмена" и  "Не обрабатываемое исключение в приложении Платформы .NET Framework". 

    Извините за глупый вопрос, не напишите как сделать эту проверку, и как понять "не идите дальше"? 

    Я при появлении окна с этим исключением, жму на кнопку Выход и это окно закрывается вместе с приложением.

    У меня в функции Сохранить Изображение в случае нажатия Отмена сохранения, возвращает 0 или -1 если отказаться от выполнения сохранения. По моему не должно вылетать это исключение от этого. Вот код функции:

    private: int SaveImg()
    {
    	System::Windows::Forms::DialogResult dr;
    	int r;
    	r = 0;
    
    	if (imgChangd)					
    	{
    		dr = MessageBox::Show("Изображение было изменено. Вы хотите сохранить его?", "BeautifulLady", MessageBoxButtons::YesNoCancel, MessageBoxIcon::Warning);
    		
    		switch (dr)
    		{
    		case System::Windows::Forms::DialogResult::Yes: 
    			r = ImgToFile();
    			break;
    		case System::Windows::Forms::DialogResult::No:
    			r = 0;
    			break;
    		case System::Windows::Forms::DialogResult::Cancel:				
    			r = -1;
    			break;
    		}
    	}
    	return r;
    }

    Не знаю в каком направлении, где и как сделать эту проверку "если ShowDialog возвращает DialogResult.Cancel". Подскажите пожалуйста. Я не опытный в разработке, стараюсь как могу...

    Может url есть с простой и ясной реализацией Save, для сохранения нарисованного на форме в Windows Form, насчет SaveAs, ищу много времени на msdn и безуспешно...

    Заранее, благодарен Игорь I65

     
    1 августа 2018 г. 10:44
  • В вашем коде результат вызова и SaveImg, и ShowDialog игнорируется. Естественно, будет вылетать. У вас пользователь может нажать отмена как в MessageBox, так и в SaveDialog, и обе ситуации надо обработать:

    if( SaveImg() <=0) return; //(я полагаю, ImgToFile возвращает значение больше нуля?)

    if(saveFileDialog1
    ->ShowDialog() ==
    System::Windows::Forms::DialogResult::Cancel) return;

    bitmap->Save(saveFileDialog1->FileName, System::Drawing::Imaging::ImageFormat::Jpeg);

    • Помечено в качестве ответа I65 1 августа 2018 г. 12:30
    1 августа 2018 г. 11:34
  • Здравствуйте Игорь,

    Вне топика хочу отметить, что отвечающий Вадим, он указан в правом нижнем углу ответа. Я лишь предложил его ответ как решение.


    Если Вам помог чей-либо ответ, пожалуйста, не забывайте жать на кнопку "Предложить как ответ" или "Проголосовать за полезное сообщение" Мнения, высказанные здесь, являются отражение моих личных взглядов, а не позиции корпорации Microsoft. Вся информация предоставляется "как есть" без каких-либо гарантий.

    • Помечено в качестве ответа I65 1 августа 2018 г. 12:31
    1 августа 2018 г. 12:12
    Модератор
  • Спасибо VadimTagil

    сейчас буду вникать...

    игорь I65 

    • Помечено в качестве ответа I65 1 августа 2018 г. 12:32
    1 августа 2018 г. 12:30
  • Хорошо, я понял.

    Жму на кнопки.

    1 августа 2018 г. 12:31
  • У меня ImgToFile() возвращает 0 или -1.

    возвращает -1, в случае: юзер в окне Сохранить нажмет Отмена. (в поле Имя файла fn пусто). -1 как результат не сохранения изображения в файл.

    Возвращает 0 в случае: юзер в окне Сохранить сохранит и нажмет ОК. 0 как результат сохранения. Код:

    private: int ImgToFile()
    {
    	System::Windows::Forms::DialogResult dr;
    	int r = 0;	// результат сохранения
    
    	if (fn == String::Empty)
    	{
    		// это новый документ, запросить у юзера имя файла. отобразить диалог Сохранить
    	    dr = saveFileDialog1->ShowDialog();
    	    if (dr == System::Windows::Forms::DialogResult::OK)
                {
    		fn = saveFileDialog1->FileName;
    		r = 0;
    	    }
    	    else
    		r = -1;	// юзер не стал сохранять. сделал щелчок на кнопке Отмена
    		}
    
    	// сохранить файл
    	if (r == 0)
    	{
    	    try
    	    {
    	     // получу информацию о файле fn
    		System::IO::FileInfo^ fi = gcnew System::IO::FileInfo(fn);
    
    		System::IO::FileStream^ fs = safe_cast<System::IO::FileStream^>(saveFileDialog1->OpenFile());
    				
    		// поток для записи
    		System::IO::StreamWriter^ sw = fi->CreateText();
    		sw->Write(pictureBox1->Image);
    		sw->Close();	  // закрываю поток
    		imgChangd = false;
    		r = 0;
    	    }
    	    catch (System::IO::IOException^ e)
    	    {
    		MessageBox::Show(e->ToString(), "BeautifulLady", MessageBoxButtons::OK, MessageBoxIcon::Information);
    	    }
    	}
        return r;
    }

    1 августа 2018 г. 13:04