2016-02-18 3 views
0

Я новичок в программировании приложения Windows Form. Я хочу захватить мою форму Windows (с помощью функции CaptureScreen()) и сохранить ее в файл, нажав кнопку с помощью SaveFileDialog. Здесь мой код:C++ - сохранить изображение из формы в файл

private: System::Void CaptureScreen() 
{ 
    Drawing::Graphics^ myGraphics = this->CreateGraphics(); 
    memoryImage = gcnew Drawing::Bitmap(Size.Width, Size.Height, myGraphics); 
    Drawing::Graphics^ memoryGraphics = Drawing::Graphics::FromImage(memoryImage); 
    memoryGraphics->CopyFromScreen(this->Location.X, this->Location.Y, 0, 0, this->Size); 
} 

private: System::Void btnSave_Click(System::Object^ sender, System::EventArgs^ e) 
{ 
    SaveFileDialog^ saveDiag2 = gcnew SaveFileDialog(); 
    saveDiag2->Filter = "Dateityp PNG (*.PNG)|*.PNG|All files (*.*)|*.*"; 
    saveDiag2->FilterIndex = 1; 
    saveDiag2->RestoreDirectory = true; 
    if (saveDiag2->ShowDialog() == System::Windows::Forms::DialogResult::OK) 
    { 
     String^ savePath = saveDiag2->FileName; 
     if (saveDiag2->OpenFile() != nullptr) 
     { 
      try 
      { 
       CaptureScreen(); 
       if (memoryImage != nullptr) 
       { 
        memoryImage->Save(savePath, Imaging::ImageFormat::Png); 
       } 
      } 
      catch (Exception^) 
      { 
       MessageBox::Show("There was a problem saving the file." 
        "Check the file permissions."); 
      } 
     } 
    } 
} 

Я всегда получаю отображение исключений. Что я делаю не так?

+0

'C++ - CLI' правильный тег для этого кода, также добавлены теги для Windows Forms. – crashmstr

+1

Не могли бы вы отобразить содержимое Исключения, это может указывать на то, что не так. Вы также можете поставить точку останова в начале блока try для отладки – purplepsycho

+0

Это ужасно сломанный код обработки ошибок, никогда не отображающий сообщение «это не работает». Это не полезно никому, ни вам. Используйте метод ToString() объекта объекта исключения. В вашем коде отсутствует 'delete memoryImage;' Если вы этого не сделаете, файл останется заблокированным и попытка перезаписать его не удастся. –

ответ

0

Ханс Пассент прав. Вы должны распоряжаться IDisposible объектами. В C++ CLI вы можете сделать это с помощью msclr :: auto_handle smart pointer.

#include <msclr/auto_handle.h> 

private: System::Void CaptureScreen() 
     { 
      msclr::auto_handle<Drawing::Graphics> myGraphics(this->CreateGraphics()); 
      memoryImage = gcnew Drawing::Bitmap(Size.Width, Size.Height, myGraphics.get()); 
      msclr::auto_handle<Drawing::Graphics> memoryGraphics(Drawing::Graphics::FromImage(memoryImage)); 
      memoryGraphics->CopyFromScreen(this->Location.X, this->Location.Y, 0, 0, this->Size); 
     } 

Также вы можете получить полезную информацию от объекта Exception:

catch (Exception^ exception) 
    { 
     MessageBox::Show("There was a problem saving the file: " + exception->ToString(), 
      "Check the file permissions."); 
    } 
+0

Спасибо за ваши ответы. Я добавил 'delete memoryImage' после кода обработки ошибок, предложенного @Hans Passant. @Dmitriy Объект исключения создает следующую ошибку: 'System.Runtime.InteropServices.ExternalException (0x80004005): Ошибка в GDI +.' 'В System.Drawing.Image.Save (String filename, ImageCodecInfo Encoder, EncoderParameters encoderParams)' 'в системе .Drawing.Image.Save (String filename, Formatform Format) '' в btnSave_Click (отправитель объекта, EventArgs e) в Programm.h: строка 548. 'Произошла ошибка из-за сохранения в сетевой папке. В этом как я должен справиться с этим? – Joello

+0

Вы можете легко проверить, сохранив его на локальном диске. Также вы можете проверить разрешения. Также посмотрите [здесь] (http://stackoverflow.com/questions/2431301/asp-net-error-on-bitmap-save-exception-0x80004005-a-generic-error-occurred-i) - второй ответ. –

Смежные вопросы