Использование DrawImage в winform

Я пытаюсь использовать DrawImage в winform, которая рисует указанную часть указанного изображения в указанном месте и с указанным размером. Но я получаю определенные ошибки.

  error C2039: 'Graphics' : is not a member of 'System::EventArgs'
error C2227: left of '->DrawImage' must point to class/struct/union/generic type

Следующий фрагмент кода взят из Вот, выполняет следующее:

1- Создает изображение из файла JPEG SampImag.jpg в папке примера.

2- Создает точки, которые определяют параллелограмм, в котором можно нарисовать изображение.

3- Создает прямоугольник, чтобы выбрать часть изображения для рисования.

4- Устанавливает графический элемент рисования в пиксель.

5- Рисует изображение на экране.

Чтобы использовать этот фрагмент кода в моем приложении, я создал простое приложение winform. В форму я добавил кнопку. При нажатии кнопки я хочу, чтобы следующий код выполнялся:

private:
void DrawImageParaRect( PaintEventArgs^ e )
{

// Create image.
Image^ newImage = Image::FromFile( "SampImag.jpg" );

// Create parallelogram for drawing image.
Point ulCorner = Point(100,100);
Point urCorner = Point(325,100);
Point llCorner = Point(150,250);
array<Point>^ destPara = {ulCorner,urCorner,llCorner};

// Create rectangle for source image.
Rectangle srcRect = Rectangle(50,50,150,150);
GraphicsUnit units = GraphicsUnit::Pixel;

// Draw image to screen.
e->Graphics->DrawImage( newImage, destPara, srcRect, units );
}

В приложении, которое я создал, я получил следующие строки для кнопки:

  #pragma endregion
private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e)
{}

Поэтому я помещаю код в это событие, как показано ниже:

 #pragma endregion
private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e)
{// Create image.
Image^ newImage = Image::FromFile( "SampImag.jpg" );

// Create parallelogram for drawing image.
Point ulCorner = Point(100,100);
Point urCorner = Point(325,100);
Point llCorner = Point(150,250);
array<Point>^ destPara = {ulCorner,urCorner,llCorner};

// Create rectangle for source image.
Rectangle srcRect = Rectangle(50,50,150,150);
GraphicsUnit units = GraphicsUnit::Pixel;

// Draw image to screen.
e->Graphics->DrawImage( newImage, destPara, srcRect, units );
}

Как мне избавиться от ошибки?

   error C2039: 'Graphics' : is not a member of 'System::EventArgs'
error C2227: left of '->DrawImage' must point to class/struct/union/generic type

Я положил system.drawing.dll в папку, где присутствует мой form1.h.

Ниже приведен полный код:

#include "stdafx.h"#include <stdio.h>
#using <system.drawing.dll>using namespace System;
using namespace System::Drawing;#pragma once

namespace Zooming_10Nov {using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;

/// <summary>
/// Summary for Form1
/// </summary>
public ref class Form1 : public System::Windows::Forms::Form
{
public:
Form1(void)
{
InitializeComponent();
//
//TODO: Add the constructor code here
//
}

protected:
/// <summary>
/// Clean up any resources being used.
/// </summary>
~Form1()
{
if (components)
{
delete components;
}
}
private: System::Windows::Forms::Button^  button1;
protected:

private:
/// <summary>
/// Required designer variable.
/// </summary>
System::ComponentModel::Container ^components;

#pragma region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
void InitializeComponent(void)
{
this->button1 = (gcnew System::Windows::Forms::Button());
this->SuspendLayout();
//
// button1
//
this->button1->Location = System::Drawing::Point(120, 91);
this->button1->Name = L"button1";
this->button1->Size = System::Drawing::Size(75, 23);
this->button1->TabIndex = 0;
this->button1->Text = L"button1";
this->button1->UseVisualStyleBackColor = true;
this->button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click);
//
// Form1
//
this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
this->ClientSize = System::Drawing::Size(292, 273);
this->Controls->Add(this->button1);
this->Name = L"Form1";
this->Text = L"Form1";
this->ResumeLayout(false);

}
#pragma endregion
private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e)
{

// Create image.
Image^ newImage = Image::FromFile( "SampImag.jpg" );

// Create parallelogram for drawing image.
Point ulCorner = Point(100,100);
Point urCorner = Point(325,100);
Point llCorner = Point(150,250);
array<Point>^ destPara = {ulCorner,urCorner,llCorner};

// Create rectangle for source image.
Rectangle srcRect = Rectangle(50,50,150,150);
GraphicsUnit units = GraphicsUnit::Pixel;

// Draw image to screen.
e->Graphics->DrawImage( newImage, destPara, srcRect, units );}
};
}

3

Решение

Как сказал компилятор:Графика‘: не является членом’Система :: EventArgs».
Единственными аргументами события, которые имеют объект Graphics, является PaintEventArgs, который вы получите только в Paint и PaintBackground.

Теперь, поскольку вы хотите нарисовать изображение в событии нажатия кнопки, вам нужно будет создать графический объект для области поверхности, на которой вы хотите нарисовать изображение.

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

Graphics^ graphicsInstance = Graphics::FromHwnd(this->Handle);

и просто заменить e->Graphics с graphicsInstance чтобы получить этот звонок:

graphicsInstance->DrawImage( newImage, destPara, srcRect, units );

Подробнее о самой картине:
Как вы могли видеть в предоставленной вами статье, они только что опубликовали метод и удобно передали PaintEventArgs в качестве аргумента, это типичный шаблон, используемый при переопределении OnPaint а также OnPaintBackground чтобы уменьшить беспорядок в коде события краски. Поэтому просто убедитесь, что графический объект передан из одного из двух событий рисования в ваш вспомогательный метод, или, если необходимо, создайте свой собственный с помощью описанного выше метода (немного изучив тип Graphics, вы увидите, что вы можете создать его из нескольких источники, а не только ручка формы).
Вы можете найти хорошую статью о проекте кода с некоторой теорией крафта вокруг рисования в WinFroms здесь: ссылка на сайт

1

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

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

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