Control.OnPaint(PaintEventArgs) 方法 (System.Windows.Forms)

2026-01-06 10:11:37

引发 Paint 事件。

protected:

virtual void OnPaint(System::Windows::Forms::PaintEventArgs ^ e);

protected virtual void OnPaint(System.Windows.Forms.PaintEventArgs e);

abstract member OnPaint : System.Windows.Forms.PaintEventArgs -> unit

override this.OnPaint : System.Windows.Forms.PaintEventArgs -> unit

Protected Overridable Sub OnPaint (e As PaintEventArgs)

参数

e

PaintEventArgs

包含事件数据的 PaintEventArgs。

示例

下面的代码示例使用户能够将图像或图像文件拖到窗体上,并使其显示在拖放位置。

OnPaint重写 方法以在每次绘制窗体时重新绘制图像;否则,图像将仅保留到下一次重绘。 事件 DragEnter 处理方法确定要拖动到窗体中的数据类型,并提供适当的反馈。 如果可以从数据创建 ,Image则DragDrop事件处理方法会在窗体上显示图像。

DragEventArgs.X由于 和 DragEventArgs.Y 值是屏幕坐标,因此此示例使用 PointToClient 方法将它们转换为客户端坐标。

private:

Image^ picture;

Point pictureLocation;

public:

Form1()

{

// Enable drag-and-drop operations and

// add handlers for DragEnter and DragDrop.

this->AllowDrop = true;

this->DragDrop += gcnew DragEventHandler( this, &Form1::Form1_DragDrop );

this->DragEnter += gcnew DragEventHandler( this, &Form1::Form1_DragEnter );

}

protected:

virtual void OnPaint( PaintEventArgs^ e ) override

{

// If there is an image and it has a location,

// paint it when the Form is repainted.

Form::OnPaint( e );

if ( this->picture != nullptr && this->pictureLocation != Point::Empty )

{

e->Graphics->DrawImage( this->picture, this->pictureLocation );

}

}

private:

void Form1_DragDrop( Object^ /*sender*/, DragEventArgs^ e )

{

// Handle FileDrop data.

if ( e->Data->GetDataPresent( DataFormats::FileDrop ) )

{

// Assign the file names to a String* array, in

// case the user has selected multiple files.

array^files = (array^)e->Data->GetData( DataFormats::FileDrop );

try

{

// Assign the first image to the picture variable.

this->picture = Image::FromFile( files[ 0 ] );

// Set the picture location equal to the drop point.

this->pictureLocation = this->PointToClient( Point(e->X,e->Y) );

}

catch ( Exception^ ex )

{

MessageBox::Show( ex->Message );

return;

}

}

// Handle Bitmap data.

if ( e->Data->GetDataPresent( DataFormats::Bitmap ) )

{

try

{

// Create an Image and assign it to the picture variable.

this->picture = dynamic_cast(e->Data->GetData( DataFormats::Bitmap ));

// Set the picture location equal to the drop point.

this->pictureLocation = this->PointToClient( Point(e->X,e->Y) );

}

catch ( Exception^ ex )

{

MessageBox::Show( ex->Message );

return;

}

}

// Force the form to be redrawn with the image.

this->Invalidate();

}

void Form1_DragEnter( Object^ /*sender*/, DragEventArgs^ e )

{

// If the data is a file or a bitmap, display the copy cursor.

if ( e->Data->GetDataPresent( DataFormats::Bitmap ) || e->Data->GetDataPresent( DataFormats::FileDrop ) )

{

e->Effect = DragDropEffects::Copy;

}

else

{

e->Effect = DragDropEffects::None;

}

}

private Image picture;

private Point pictureLocation;

public Form1()

{

// Enable drag-and-drop operations and

// add handlers for DragEnter and DragDrop.

this.AllowDrop = true;

this.DragDrop += new DragEventHandler(this.Form1_DragDrop);

this.DragEnter += new DragEventHandler(this.Form1_DragEnter);

}

protected override void OnPaint(PaintEventArgs e)

{

// If there is an image and it has a location,

// paint it when the Form is repainted.

base.OnPaint(e);

if(this.picture != null && this.pictureLocation != Point.Empty)

{

e.Graphics.DrawImage(this.picture, this.pictureLocation);

}

}

private void Form1_DragDrop(object sender, DragEventArgs e)

{

// Handle FileDrop data.

if(e.Data.GetDataPresent(DataFormats.FileDrop) )

{

// Assign the file names to a string array, in

// case the user has selected multiple files.

string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);

try

{

// Assign the first image to the picture variable.

this.picture = Image.FromFile(files[0]);

// Set the picture location equal to the drop point.

this.pictureLocation = this.PointToClient(new Point(e.X, e.Y) );

}

catch(Exception ex)

{

MessageBox.Show(ex.Message);

return;

}

}

// Handle Bitmap data.

if(e.Data.GetDataPresent(DataFormats.Bitmap) )

{

try

{

// Create an Image and assign it to the picture variable.

this.picture = (Image)e.Data.GetData(DataFormats.Bitmap);

// Set the picture location equal to the drop point.

this.pictureLocation = this.PointToClient(new Point(e.X, e.Y) );

}

catch(Exception ex)

{

MessageBox.Show(ex.Message);

return;

}

}

// Force the form to be redrawn with the image.

this.Invalidate();

}

private void Form1_DragEnter(object sender, DragEventArgs e)

{

// If the data is a file or a bitmap, display the copy cursor.

if (e.Data.GetDataPresent(DataFormats.Bitmap) ||

e.Data.GetDataPresent(DataFormats.FileDrop) )

{

e.Effect = DragDropEffects.Copy;

}

else

{

e.Effect = DragDropEffects.None;

}

}

Private picture As Image

Private pictureLocation As Point

Public Sub New()

' Enable drag-and-drop operations.

Me.AllowDrop = True

End Sub

Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)

MyBase.OnPaint(e)

' If there is an image and it has a location,

' paint it when the Form is repainted.

If (Me.picture IsNot Nothing) And _

Not (Me.pictureLocation.Equals(Point.Empty)) Then

e.Graphics.DrawImage(Me.picture, Me.pictureLocation)

End If

End Sub

Private Sub Form1_DragDrop(ByVal sender As Object, _

ByVal e As DragEventArgs) Handles MyBase.DragDrop

' Handle FileDrop data.

If e.Data.GetDataPresent(DataFormats.FileDrop) Then

' Assign the file names to a string array, in

' case the user has selected multiple files.

Dim files As String() = CType(e.Data.GetData(DataFormats.FileDrop), String())

Try

' Assign the first image to the 'picture' variable.

Me.picture = Image.FromFile(files(0))

' Set the picture location equal to the drop point.

Me.pictureLocation = Me.PointToClient(New Point(e.X, e.Y))

Catch ex As Exception

MessageBox.Show(ex.Message)

Return

End Try

End If

' Handle Bitmap data.

If e.Data.GetDataPresent(DataFormats.Bitmap) Then

Try

' Create an Image and assign it to the picture variable.

Me.picture = CType(e.Data.GetData(DataFormats.Bitmap), Image)

' Set the picture location equal to the drop point.

Me.pictureLocation = Me.PointToClient(New Point(e.X, e.Y))

Catch ex As Exception

MessageBox.Show(ex.Message)

Return

End Try

End If

' Force the form to be redrawn with the image.

Me.Invalidate()

End Sub

Private Sub Form1_DragEnter(ByVal sender As Object, _

ByVal e As DragEventArgs) Handles MyBase.DragEnter

' If the data is a file or a bitmap, display the copy cursor.

If e.Data.GetDataPresent(DataFormats.Bitmap) _

Or e.Data.GetDataPresent(DataFormats.FileDrop) Then

e.Effect = DragDropEffects.Copy

Else

e.Effect = DragDropEffects.None

End If

End Sub

// This example creates a PictureBox control on the form and draws to it.

// This example assumes that the Form_Load event handler method is

// connected to the Load event of the form.

private:

PictureBox^ pictureBox1;

void Form1_Load( Object^ /*sender*/, System::EventArgs^ /*e*/ )

{

pictureBox1 = gcnew PictureBox;

// Dock the PictureBox to the form and set its background to white.

pictureBox1->Dock = DockStyle::Fill;

pictureBox1->BackColor = Color::White;

// Connect the Paint event of the PictureBox to the event handler method.

pictureBox1->Paint += gcnew System::Windows::Forms::PaintEventHandler( this, &Form1::pictureBox1_Paint );

// Add the PictureBox control to the Form.

this->Controls->Add( pictureBox1 );

}

void pictureBox1_Paint( Object^ /*sender*/, System::Windows::Forms::PaintEventArgs^ e )

{

// Create a local version of the graphics object for the PictureBox.

Graphics^ g = e->Graphics;

// Draw a string on the PictureBox.

g->DrawString( "This is a diagonal line drawn on the control",

gcnew System::Drawing::Font( "Arial",10 ), System::Drawing::Brushes::Blue, Point(30,30) );

// Draw a line in the PictureBox.

g->DrawLine( System::Drawing::Pens::Red, pictureBox1->Left, pictureBox1->Top,

pictureBox1->Right, pictureBox1->Bottom );

}

// This example creates a PictureBox control on the form and draws to it.

// This example assumes that the Form_Load event handler method is

// connected to the Load event of the form.

private PictureBox pictureBox1 = new PictureBox();

// Cache font instead of recreating font objects each time we paint.

private Font fnt = new Font("Arial",10);

private void Form1_Load(object sender, System.EventArgs e)

{

// Dock the PictureBox to the form and set its background to white.

pictureBox1.Dock = DockStyle.Fill;

pictureBox1.BackColor = Color.White;

// Connect the Paint event of the PictureBox to the event handler method.

pictureBox1.Paint += new System.Windows.Forms.PaintEventHandler(this.pictureBox1_Paint);

// Add the PictureBox control to the Form.

this.Controls.Add(pictureBox1);

}

private void pictureBox1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)

{

// Create a local version of the graphics object for the PictureBox.

Graphics g = e.Graphics;

// Draw a string on the PictureBox.

g.DrawString("This is a diagonal line drawn on the control",

fnt, System.Drawing.Brushes.Blue, new Point(30,30));

// Draw a line in the PictureBox.

g.DrawLine(System.Drawing.Pens.Red, pictureBox1.Left, pictureBox1.Top,

pictureBox1.Right, pictureBox1.Bottom);

}

' This example creates a PictureBox control on the form and draws to it.

' This example assumes that the Form_Load event handler method is connected

' to the Load event of the form.

Private pictureBox1 As New PictureBox()

Private fnt as New Font("Arial", 10)

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load

' Dock the PictureBox to the form and set its background to white.

pictureBox1.Dock = DockStyle.Fill

pictureBox1.BackColor = Color.White

' Connect the Paint event of the PictureBox to the event handler method.

AddHandler pictureBox1.Paint, AddressOf Me.pictureBox1_Paint

' Add the PictureBox control to the Form.

Me.Controls.Add(pictureBox1)

End Sub

Private Sub pictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs)

' Create a local version of the graphics object for the PictureBox.

Dim g As Graphics = e.Graphics

' Draw a string on the PictureBox.

g.DrawString("This is a diagonal line drawn on the control", _

fnt, Brushes.Red, New PointF(30.0F, 30.0F))

' Draw a line in the PictureBox.

g.DrawLine(System.Drawing.Pens.Red, pictureBox1.Left, _

pictureBox1.Top, pictureBox1.Right, pictureBox1.Bottom)

End Sub

注解

引发事件时,将通过委托调用事件处理程序。 有关详细信息,请参阅 处理和引发事件。

方法 OnPaint 还使派生类无需附加委托即可处理 事件。 这是在派生类中处理事件的首选技术。

继承者说明

在派生类中重写 OnPaint(PaintEventArgs) 时,一定要调用基类的 OnPaint(PaintEventArgs) 方法,以便已注册的委托对事件进行接收。

适用于

另请参阅

Paint