GVKun编程网logo

vb.net GDI+入门——使用Graphics对象绘制线图(vb.net picturebox画图)

6

如果您想了解vb.netGDI+入门——使用Graphics对象绘制线图和vb.netpicturebox画图的知识,那么本篇文章将是您的不二之选。我们将深入剖析vb.netGDI+入门——使用Gra

如果您想了解vb.net GDI+入门——使用Graphics对象绘制线图vb.net picturebox画图的知识,那么本篇文章将是您的不二之选。我们将深入剖析vb.net GDI+入门——使用Graphics对象绘制线图的各个方面,并为您解答vb.net picturebox画图的疑在这篇文章中,我们将为您介绍vb.net GDI+入门——使用Graphics对象绘制线图的相关知识,同时也会详细的解释vb.net picturebox画图的运用方法,并给出实际的案例分析,希望能帮助到您!

本文目录一览:

vb.net GDI+入门——使用Graphics对象绘制线图(vb.net picturebox画图)

vb.net GDI+入门——使用Graphics对象绘制线图(vb.net picturebox画图)

在实际应用中,很多图形是由点和线构成的,vb.net的Graphics 类提供了很多画线图的方法,我们可以使用这些重载了的方法组合出丰富的图案来。

下面我们就来了解下这些绘线图的方法。

一、DrawLine 方法

该方法绘制一条连接由坐标对指定的两个点的线条,所以我们需要指定这两个点的坐标,如下所示:

DrawLine(pen,x1,y1,x2,y2)或者DrawLine(pen,Point1,Point2)

下面示例将在PictureBox控件表面绘制一条直线:

Dim g As Graphics = Me.PictureBox1.CreateGraphics

Dim mpen As New Pen(Color.Red)

g.DrawLine(mpen,80,160)

也可以使用如下代码来实现一样的效果:

Dim g As Graphics = Me.PictureBox1.CreateGraphics

Dim mpen As New Pen(Color.Red)

Dim p1 As Point = New Point(0,80)

Dim p2 As Point = New Point(0,160)

g.DrawLine(mpen,p1,p2)

当然,我们也可以使用DrawLine方法画出更加复杂的图形,如下代码所示:

Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles Button1.Click

Dim g As Graphics = Me.PictureBox1.CreateGraphics

Dim mpen As New Pen(Color.Red)

Dim i As Integer

For i = 0 To 160 Step 10

g.DrawLine(mpen,i,0)

g.DrawLine(mpen,160,160 - i,0)

Next

End Sub

运行后效果如下图一所示:

二、DrawLines 方法

该方法绘制一系列连接一组 Point 结构的线段,它按顺序把每个点都连接起来,构成一段曲线,DrawLines的形式如下:

DrawLines(Pen,Point())

Point()参数就是一个由一系列的点构成的数组。

如下代码所示,我们要在PictureBox 控件中绘制一条由四个不同的坐标点构成的曲线:

Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles Button1.Click

Dim g As Graphics = Me.PictureBox1.CreateGraphics

Dim mpen As New Pen(Color.Red)

Dim Points As PointF() = {New PointF(0.0F,0.0F),New PointF(10.0F,15.0F),New PointF(20.0F,20.0F),New PointF(50.0F,100.0F)}

g.DrawLines(mpen,points)

End Sub

运行效果如下图二所示:

如图曲线的起点、两个折点、终点就是我们Pionts变量中指定的四个点。该方法比较适用于连接如股票的波动线等由大量的点构成的波动曲线。

三、DrawEllipse方法

使用 DrawEllipse 方法可以绘制一个由边框定义的椭圆,该边框是由椭圆的左上角坐标,高度以及宽度决定的。

DrawEllipse 方法的常用形式:DrawEllipse(x,y,width,height)

x,y为椭圆的左上角坐标点,width为椭圆的矩形宽,height为椭圆的矩形高

如下代码所示,我们在PictureBox控件中绘制一个红色的椭圆:

Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles Button1.Click

Dim g As Graphics = Me.PictureBox1.CreateGraphics

Dim mpen As New Pen(Color.Red)

g.DrawEllipse(mpen,150,150)

End Sub

运行效果如下图三所示:

在以上示例中,我们绘制出来的是一个正圆,正圆实际上就是椭圆的特殊表现。

四、DrawArc方法

用 DrawArc 方法可以一段椭圆弧,方法格式如下:

DrawArc(Pen,x,Swidth,height,StartAngle,SweepAngle)

x,height这四个参数指定了椭圆的结构

StartAngle为椭圆弧的起始角度,该角度是在指以椭圆的圆心为坐标原点、X轴向右为正方向的坐标系中,圆弧起点与X轴的夹角。

SweepAngle 为圆弧扫过的角度值,以StartAngle参数所指定的起点沿顺时针方向扫过的度数。

如下示例代码:

Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles Button1.Click

Dim g As Graphics = Me.PictureBox1.CreateGraphics

Dim mpen As New Pen(Color.Red)

g.DrawArc(mpen,0.0F,100.0F,270.0F)

End Sub

运行效果如下图四(一)所示。

我们把

g.DrawArc(mpen,270.0F)

改为

g.DrawArc(mpen,90.0F,270.0F)

运行后如下图四(二)所示:

对比以上两图,我们可以知道,决定圆弧的起始位置的参数为:StartAngle,而 SweepAngle 决定了圆弧扫过的度数。

五、DrawPie方法

DrawPie 方法画的是一个饼状图,它和DrawArc方法一样,先画一条椭圆弧,但是它还把两个端点与圆心连接起来,形成一个饼状图,它的格式与DrawArc方法一样,这里就不做说明了。

如下代码所示:

Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles Button1.Click

Dim g As Graphics = Me.PictureBox1.CreateGraphics

Dim mpen As New Pen(Color.Red)

g.DrawPie(mpen,270.0F)

End Sub

运行后效果如下图五所示:

六、Drawpolygon方法

我们可以使用Drawpolygon方法来绘制任意的多边形,该方法格式如下:

Drawpolygon(pen,Points())

Points()为坐标点数组,我们使用下面代码来演示通过Drawpolygon方法绘制一个不规则的四边形,代码如下所示:

Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles Button1.Click

Dim g As Graphics = Me.PictureBox1.CreateGraphics

Dim mpen As New Pen(Color.Red)

'定义四边形的四个顶点的坐标

Dim p(3) As Point

p(0).X = 100

p(0).Y = 15

p(1).X = 80

p(1).Y = 90

p(2).X = 90

p(2).Y = 120

p(3).X = 130

p(3).Y = 150

g.Drawpolygon(mpen,p)

End Sub

运行后效果如下图六所示:

七、DrawRectangle方法

DrawRectangle 方法可以绘制由坐标对、宽度和高度指定的矩形。它的格式如下:

DrawRectangle(pen,height)

其中X、Y为矩形的左上角的X\Y坐标点,width,height分别为矩形的宽和高。

下面示例代码是在PictureBox中绘制一个矩形:

Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles Button1.Click

Dim g As Graphics = Me.PictureBox1.CreateGraphics

Dim mpen As New Pen(Color.Red)

g.DrawRectangle(mpen,20,30,100,80)

End Sub

运行后效果如下图七所示:

八、DrawRectangles方法

DrawRectangles方法和DrawRectangle方法一样都是用于画矩形的,但是DrawRectangles方法是绘制一系列由 Rectangle 结构指定的矩形。其格式如下:

DrawRectangles(Pen,Rectangle())

如下代码所示,我们在PictureBox中绘制三个矩形:

Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles Button1.Click

Dim g As Graphics = Me.PictureBox1.CreateGraphics

Dim mpen As New Pen(Color.Red)

Dim rects As RectangleF() = {New RectangleF(10.0F,10.0F,140.0F,120.0F),New RectangleF(20.0F,20.0F,80.0F),New RectangleF(30.0F,30.0F,50.0F,40.0F)}

g.DrawRectangles(mpen,rects)

End Sub

运行效果如下图所示:

九、DrawBezier方法

DrawBezier 方法用于绘制由 4 个 Point 结构定义的贝塞尔曲线。它的格式如下:

DrawBezier(Pen,y2,x3,y3,x4,y4)

x1,y1为起点,x2,y2和x3,y3为控制点,x4,y4为终点

下面代码示例使用DrawBezier方法:

Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles Button1.Click

Dim g As Graphics = Me.PictureBox1.CreateGraphics

Dim mpen As New Pen(Color.Red)

g.DrawBezier(mpen,10,60,70,130)

End Sub

十、DrawBeziers方法 

DrawBeziers方法用 Point 结构数组绘制一系列贝塞尔样条。

Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles Button1.Click

Dim g As Graphics = Me.PictureBox1.CreateGraphics

Dim mpen As New Pen(Color.Red)

'为第一条曲线创建起始点、结束点和两个控制点;为第二条曲线创建结束点和两个控制点。

Dim start As New PointF(10.0F,10.0F)

Dim control1 As New PointF(120.0F,10.0F)

Dim control2 As New PointF(150.0F,50.0F)

Dim end1 As New PointF(150.0F,10.0F)

Dim control3 As New PointF(60.0F,50.0F)

Dim control4 As New PointF(50.0F,20.0F)

Dim end2 As New PointF(50.0F,130.0F)

Dim bezierPoints As PointF() = {start,control1,control2,end1,control3,control4,end2}

g.DrawBeziers(mpen,bezierPoints)

End Sub

运行效果图如下:

注意:这里的两条曲线的起点是一样的。

本章我们主要是了解使用Graphics对象的方法来绘制线图,在所有绘制线图的方法中,我们都是需要创建笔对象Pen的。下一章我们就继续去了解如何使用Graphics对象来绘制填充图形。

C# GDI + 编程之 Graphics 类

C# GDI + 编程之 Graphics 类

  GDI + 是 GDI 的后继者,它是.NET Framework 为操作图形提供的应用程序编程接口,主要用在窗体上绘制各种图形图像,可以用于绘制各种数据图像、数学仿真等。

  Graphics 类是 GDI + 的核心,它提供将对象绘制到显式设备的方法。Graphics 类封装了绘制直线、曲线、圆形、图像和文本的方法,是一切 GDI + 操作的基础类。在绘图之前,必须在指定的窗体上创建一个 Graphics 对象,才能调用 Graphics 类的方法画图。

 

  一、创建 Graphics 类对象的的三种方法

    1.1 Paint 事件

    在窗体或控件的 Paint 事件中创建,将其作为 PaintEventArgs 的一部分。在为控件创建绘制代码时,通常会使用此方法。

    例如,在 Paint 事件中创建 Graphics 对象:

private void Form1_Paint(object sender, PaintEventArgs e)    //窗体的Paint事件
        {
            Graphics g = e.Graphics;    //创建Graphics对象
        }

 

    1.2 CreateGraphics 方法

    调用窗体或控件的 CreateGraphics 方法可以获取对 Graphics 对象的引用,该对象表示控件或窗体的绘图画面。如果在已存在的窗体或控件身上绘图,应该使用此方法

    例如,在窗体的 Load 事件中,通过 CreateGraphics 方法创建 Graphics 对象

private void Form1_Load(object sender, EventArgs e)    //窗体的Load事件
        {
            Graphics g;    //声明一个Graphics对象
            g = this.CreateGraphics();
        }

 

    1.3 Graphics.FromImage 方法

    由从 Image 继承的任何对象创建 Graphics 对象,调用 Graphics.FromImage 方法即可,该方法在需要更改已存在的图像时十分有用,例:

private void Form1_Load(object sender, EventArgs e)
        {
            Bitmap mbit = new Bitmap(@"C:\test.bmp");
            Graphics g = Graphics.FromImage(mbit);
        }

 

二、Graphics 类的属性

Clip

获取或设置 Region,它限定此 Graphics 的绘图区域。

ClipBounds

获取一个 RectangleF 结构,该结构限定此 Graphics 的剪辑区域。

CompositingMode

获取一个值,该值指定如何将合成图像绘制到此 Graphics。

CompositingQuality

获取或设置绘制到此 Graphics 的合成图像的呈现质量。

DpiX

获取此 Graphics 的水平分辨率。

DpiY

获取此 Graphics 的垂直分辨率。

InterpolationMode

获取或设置与此 Graphics 关联的插补模式。

IsClipEmpty

获取一个值,该值指示此 Graphics 的剪辑区域是否为空。

IsVisibleClipEmpty

获取一个值,该值指示此 Graphics 的可见剪辑区域是否为空。

PageScale

获取或设置此 Graphics 的世界单位和页单位之间的比例。

PageUnit

获取或设置用于此 Graphics 中的页坐标的度量单位。

PixelOffsetMode

获取或设置一个值,该值指定在呈现此 Graphics 的过程中像素如何偏移。

RenderingOrigin

为抵色处理和阴影画笔获取或设置此 Graphics 的呈现原点。

SmoothingMode

获取或设置此 Graphics 的呈现质量。

TextContrast

获取或设置呈现文本的灰度校正值。

TextRenderingHint

获取或设置与此 Graphics 关联的文本的呈现模式。

Transform

获取或设置此 Graphics 的几何世界转换的副本。

VisibleClipBounds

获取此 Graphics 的可见剪辑区域的边框。

                  注:详情参考 MSDN 对 Graphics 属性的说明

 

三、Graphics 类的常用方法及说明

方法 描述 Clear 清除整个绘图面并以指定背景色填充 Dispose 释放由此 Graphics 对象使用的所有资源 DrawArc 绘制一段弧线,它表示由一对坐标、宽高指定的椭圆部分 DrawBezier 绘制由四个 Point 结构定义的贝塞尔样条 DrawBeziers 从 Point 结构的数组绘制一系列贝塞尔样条 DrawCurve 绘制经过一组指定的 Point 结构的基数样条 DrawEllipse 绘制一个由一对坐标、宽度和高度指定的椭圆 DrawIcon 在指定坐标处绘制由指定的 Icon 对象表示的图像 DrawImage 在指定的位置并且按原始大小绘制指定的 Image 对象 DrawLine 绘制一条连接由坐标对象指定的两个点的线条 DrawLines 绘制一列连接一组 Point 结构的线段 DrawPath 绘制 GraphicsPath 对象 DrawPie 绘制一个扇形,该扇形由一个坐标对象,宽度和高度,以及两条射线所指定的椭圆指定 DrawPolygon 绘制由一组 Point 结构定义的多边形 DrawRectangle 绘制由坐标对。宽度和高度指定的矩形 DrawRectangles 绘制一系列由 Rectangle 结构指定的矩形 DrawString 在指定位置并且用指定的 Brush 和 Font 对象绘制指定的文本字符串 FillEllipse 填充边框所定义的椭圆内部,该边框由一对坐标、一个高度和一个宽度指定 FillPath 填充 GraphicsPath 对象的内部 FillPie 填充扇形内部 FillPolygon 填充多边形内部 FillRectangle 填充由一对坐标、一个宽度和一个高度指定的矩形内部 FillRectangles 填充由 Rectangle 结构指定的一些列矩阵的内部 FillRegion 填充 Region 对象的内部 FromImage 从指定的 Image 对象创建行的 Graphics 对象 Save 保存此 Graphics 对象的当前状态,并且 GraphicsState 对象标识保存的状态

                  注:完整的 Graphics 方法请查看 MSDN 对 Graphics 方法的说明

  由于时间有限,后续还会对 GDI+ 相关内容进行更新

  

 

原文出处:https://www.cnblogs.com/forever-Ys/p/10447617.html

C# GDI+之Graphics类 z

C# GDI+之Graphics类 z

GDI+是GDI的后继者,它是.NET Framework为操作图形提供的应用程序编程接口,主要用在窗体上绘制各种图形图像,可以用于绘制各种数据图像、数学仿真等。

  Graphics类是GDI+的核心,它提供将对象绘制到显式设备的方法。Graphics类封装了绘制直线、曲线、圆形、图像和文本的方法,是一切GDI+操作的基础类。在绘图之前,必须在指定的窗体上创建一个Graphics对象,才能调用Graphics类的方法画图。

 

  一、创建Graphics类对象的的三种方法

    1.1 Paint事件

    在窗体或控件的Paint事件中创建,将其作为PaintEventArgs的一部分。在为控件创建绘制代码时,通常会使用此方法。

    例如,在Paint事件中创建Graphics对象:

private void Form1_Paint(object sender, PaintEventArgs e)    //窗体的Paint事件  { Graphics g = e.Graphics; //创建Graphics对象 }

 

    1.2 CreateGraphics方法

    调用窗体或控件的CreateGraphics方法可以获取对Graphics对象的引用,该对象表示控件或窗体的绘图画面。如果在已存在的窗体或控件身上绘图,应该使用此方法

    例如,在窗体的Load事件中,通过CreateGraphics方法创建Graphics对象

private void Form1_Load(object sender, EventArgs e)    //窗体的Load事件  { Graphics g; //声明一个Graphics对象 g = this.CreateGraphics(); }

 

    1.3 Graphics.FromImage方法

    由从Image继承的任何对象创建Graphics对象,调用Graphics.FromImage方法即可,该方法在需要更改已存在的图像时十分有用,例:

private void Form1_Load(object sender, EventArgs e)
        {
            Bitmap mbit = new Bitmap(@"C:\test.bmp"); Graphics g = Graphics.FromImage(mbit); }

 

二、Graphics类的属性

Clip

获取或设置 Region,它限定此 Graphics 的绘图区域。

ClipBounds

获取一个 RectangleF 结构,该结构限定此 Graphics 的剪辑区域。

CompositingMode

获取一个值,该值指定如何将合成图像绘制到此 Graphics。

CompositingQuality

获取或设置绘制到此 Graphics 的合成图像的呈现质量。

DpiX

获取此 Graphics 的水平分辨率。

DpiY

获取此 Graphics 的垂直分辨率。

InterpolationMode

获取或设置与此 Graphics 关联的插补模式。

IsClipEmpty

获取一个值,该值指示此 Graphics 的剪辑区域是否为空。

IsVisibleClipEmpty

获取一个值,该值指示此 Graphics 的可见剪辑区域是否为空。

PageScale

获取或设置此 Graphics 的世界单位和页单位之间的比例。

PageUnit

获取或设置用于此 Graphics 中的页坐标的度量单位。

PixelOffsetMode

获取或设置一个值,该值指定在呈现此 Graphics 的过程中像素如何偏移。

RenderingOrigin

为抵色处理和阴影画笔获取或设置此 Graphics 的呈现原点。

SmoothingMode

获取或设置此 Graphics 的呈现质量。

TextContrast

获取或设置呈现文本的灰度校正值。

TextRenderingHint

获取或设置与此 Graphics 关联的文本的呈现模式。

Transform

获取或设置此 Graphics 的几何世界转换的副本。

VisibleClipBounds

获取此 Graphics 的可见剪辑区域的边框。

                  注:详情参考MSDN对Graphics属性的说明

 

三、Graphics类的常用方法及说明

方法 描述 Clear 清除整个绘图面并以指定背景色填充 Dispose 释放由此Graphics对象使用的所有资源 DrawArc 绘制一段弧线,它表示由一对坐标、宽高指定的椭圆部分 DrawBezier 绘制由四个Point结构定义的贝塞尔样条 DrawBeziers 从Point结构的数组绘制一系列贝塞尔样条 DrawCurve 绘制经过一组指定的Point结构的基数样条 DrawEllipse 绘制一个由一对坐标、宽度和高度指定的椭圆 DrawIcon 在指定坐标处绘制由指定的Icon对象表示的图像 DrawImage 在指定的位置并且按原始大小绘制指定的Image对象 DrawLine 绘制一条连接由坐标对象指定的两个点的线条 DrawLines 绘制一列连接一组Point结构的线段 DrawPath 绘制GraphicsPath对象 DrawPie 绘制一个扇形,该扇形由一个坐标对象,宽度和高度,以及两条射线所指定的椭圆指定 DrawPolygon 绘制由一组Point结构定义的多边形 DrawRectangle 绘制由坐标对。宽度和高度指定的矩形 DrawRectangles 绘制一系列由Rectangle结构指定的矩形 DrawString 在指定位置并且用指定的Brush和Font对象绘制指定的文本字符串 FillEllipse 填充边框所定义的椭圆内部,该边框由一对坐标、一个高度和一个宽度指定 FillPath 填充GraphicsPath对象的内部 FillPie 填充扇形内部 FillPolygon 填充多边形内部 FillRectangle 填充由一对坐标、一个宽度和一个高度指定的矩形内部 FillRectangles 填充由Rectangle结构指定的一些列矩阵的内部 FillRegion 填充Region对象的内部 FromImage 从指定的Image对象创建行的Graphics对象 Save 保存此Graphics对象的当前状态,并且GraphicsState对象标识保存的状态

                  注:完整的Graphics方法请查看MSDN对Graphics方法的说明

c# – GDI:如何在背景线程上将Graphics对象渲染为位图?

c# – GDI:如何在背景线程上将Graphics对象渲染为位图?

我想使用GDI在后台线程上渲染图像.我找到了关于如何使用GDI旋转图像的 this example,这是我想要做的操作.

private void RotationMenu_Click(object sender,System.EventArgs e)
{
    Graphics g = this.CreateGraphics();
    g.Clear(this.BackColor);
    Bitmap curBitmap = new Bitmap(@"roses.jpg"); 
    g.DrawImage(curBitmap,200,200);  

    // Create a Matrix object,call its Rotate method,// and set it as Graphics.Transform
    Matrix X = new Matrix();
    X.Rotate(30);
    g.Transform = X;  

    // Draw image
    g.DrawImage(curBitmap,new Rectangle(205,200),curBitmap.Width,curBitmap.Height,GraphicsUnit.Pixel);  

    // dispose of objects
    curBitmap.dispose();
    g.dispose(); 
}

我的问题有两个部分:

>你将如何在后台线程上完成this.CreateGraphics()?可能吗?我的理解是在这个例子中是一个UI对象.因此,如果我在后台线程上进行此处理,我将如何创建图形对象?
>一旦我完成处理,我将如何从我正在使用的Graphics对象中提取位图?我无法找到一个如何做到这一点的好例子.

另外:格式化代码示例时,如何添加换行符?如果有人可以给我发表评论,说明我真的很感激.谢谢!

解决方法

要绘制位图,您不希望为UI控件创建Graphics对象.您可以使用FromImage方法为位图创建Graphics对象:

Graphics g = Graphics.FromImage(theImage);

Graphics对象不包含您绘制到它的图形,而只是它在另一个画布上绘制的工具,通常是屏幕,但它也可以是Bitmap对象.

因此,您不先绘制然后提取位图,首先创建位图,然后创建要在其上绘制的Graphics对象:

Bitmap destination = new Bitmap(200,200);
using (Graphics g = Graphics.FromImage(destination)) {
   Matrix rotation = new Matrix();
   rotation.Rotate(30);
   g.Transform = rotation;
   g.DrawImage(source,200);
}

c# – Graphic – DrawLine – 绘制线并移动它

c# – Graphic – DrawLine – 绘制线并移动它

在我的.net c#程序中,我使用文本框中的值绘制几行(我使用DrawLine函数).我想要通过clik移动其中的一条,并用鼠标移动这条线 – 是可能吗?

解决方法

public class LineMover : Form
{
  public LineMover()
  {

    this.DoubleBuffered = true;

    this.Paint += new PaintEventHandler(LineMover_Paint);
    this.MouseMove += new MouseEventHandler(LineMover_MouseMove);
    this.MouseDown += new MouseEventHandler(LineMover_MouseDown);
    this.MouseUp += new MouseEventHandler(LineMover_MouseUp);

    this.Lines = new List<GraphLine>()
    {
      new GraphLine (10,10,100,200),new GraphLine (10,150,120,40),};
  }

  void LineMover_MouseUp(object sender,MouseEventArgs e)
  {
    if (Moving != null)
    {
      this.Capture = false;
      Moving = null;
    }
    RefreshLineselection(e.Location);

  }

  void  LineMover_MouseDown(object sender,MouseEventArgs e)
  {
    RefreshLineselection(e.Location);
    if (this.SelectedLine != null && Moving == null)
    {
      this.Capture = true;
      Moving = new MoveInfo 
       {
          Line = this.SelectedLine,StartLinePoint = SelectedLine.StartPoint,EndLinePoint = SelectedLine.EndPoint,StartMoveMousePoint = e.Location 
       };
    }
    RefreshLineselection(e.Location);
  }

  void LineMover_Paint(object sender,PaintEventArgs e)
  {
    e.Graphics.InterpolationMode = System.Drawing.drawing2d.InterpolationMode.High;
    e.Graphics.SmoothingMode = System.Drawing.drawing2d.SmoothingMode.HighQuality;
    foreach (var line in Lines)
    {
      var color = line == SelectedLine ? Color.Red : Color.Black;
      var pen = new Pen(color,2);
      e.Graphics.DrawLine(pen,line.StartPoint,line.EndPoint);
    }
  }
  void LineMover_MouseMove(object sender,MouseEventArgs e)
  {
    if (Moving != null)
    {
      Moving.Line.StartPoint = new PointF(Moving.StartLinePoint.X + e.X - Moving.StartMoveMousePoint.X,Moving.StartLinePoint.Y + e.Y - Moving.StartMoveMousePoint.Y);
      Moving.Line.EndPoint = new PointF(Moving.EndLinePoint.X + e.X - Moving.StartMoveMousePoint.X,Moving.EndLinePoint.Y + e.Y - Moving.StartMoveMousePoint.Y);
    }
    RefreshLineselection(e.Location);
  }

  private void RefreshLineselection(Point point)
  {
    var selectedLine = FindLineByPoint(Lines,point);
    if (selectedLine != this.SelectedLine)
    {
      this.SelectedLine = selectedLine;
      this.Invalidate();
    }
    if (Moving != null)
      this.Invalidate();

    this.Cursor =
        Moving != null ? Cursors.Hand :
        SelectedLine != null ? Cursors.SizeAll :
          Cursors.Default;

  }



  public List<GraphLine> Lines = new List<GraphLine>();
  GraphLine SelectedLine = null;
  MoveInfo Moving = null;


  static GraphLine FindLineByPoint(List<GraphLine> lines,Point p)
  {
    var size = 10;
    var buffer = new Bitmap(size * 2,size * 2);
    foreach (var line in lines)
    {
      //draw each line on small region around current point p and check pixel in point p 

      using (var g = Graphics.FromImage(buffer))
      {
        g.Clear(Color.Black);
        g.DrawLine(new Pen(Color.Green,3),line.StartPoint.X - p.X + size,line.StartPoint.Y - p.Y + size,line.EndPoint.X - p.X + size,line.EndPoint.Y - p.Y + size);
      }

      if (buffer.GetPixel(size,size).ToArgb() != Color.Black.ToArgb())
        return line;
    }
    return null;
  }

  public static void Main()
  {
    Application.Run(new LineMover());
  }
}

public class MoveInfo
{
  public GraphLine Line;
  public PointF StartLinePoint;
  public PointF EndLinePoint;
  public Point StartMoveMousePoint;
}
public class GraphLine
{
  public GraphLine(float x1,float y1,float x2,float y2)
  {
    this.StartPoint = new PointF(x1,y1);
    this.EndPoint = new PointF(x2,y2);
  }
  public PointF StartPoint;
  public PointF EndPoint;
}

今天关于vb.net GDI+入门——使用Graphics对象绘制线图vb.net picturebox画图的分享就到这里,希望大家有所收获,若想了解更多关于C# GDI + 编程之 Graphics 类、C# GDI+之Graphics类 z、c# – GDI:如何在背景线程上将Graphics对象渲染为位图?、c# – Graphic – DrawLine – 绘制线并移动它等相关知识,可以在本站进行查询。

本文标签: