Chinaunix首页 | 论坛 | 博客
  • 博客访问: 188605
  • 博文数量: 106
  • 博客积分: 3810
  • 博客等级: 中校
  • 技术积分: 1007
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-18 13:35
文章分类

全部博文(106)

文章存档

2014年(17)

2011年(5)

2010年(75)

2009年(9)

我的朋友

分类:

2010-04-27 08:39:54

 
Public Class DrawCurve

#Region "定义变量"

    
Const XOffset As Integer = 50, Yoffset As Integer = 20

    
Dim WithEvents PicCurve As PictureBox
    
Dim xStep As Single = 5, yStep As Single
    
Dim ValueArray As ArrayList
    
Dim ThresHold() As Single 'HIHI、HI、LO、LOLO
    Dim Name As String = "参数名"
    
Dim Unit As String = "单位"
#End Region


#Region "构造函数、析构函数"
    
Public Sub New(ByVal mPictureBox As PictureBox, ByVal mThresHold() As SingleByVal mName As String)
        ValueArray 
= New ArrayList
        PicCurve 
= mPictureBox
        ThresHold 
= mThresHold
        mPictureBox.BorderStyle 
= BorderStyle.None
        Name 
= mName
    
End Sub


    
Protected Overrides Sub Finalize()
        
MyBase.Finalize()
        ValueArray.Clear()
    
End Sub

#End Region


#Region "添加要绘制的点的信息"
    
Public Sub AddValue(ByVal Value As Single)
        
'Value = ThresHold(0) * Rnd() + ThresHold(3) '测试代码
        ValueArray.Add(Value)

        
Call DrawCurve(GetGraphics(PicCurve))
    
End Sub


    
Public Sub AddValues(ByVal Values() As SingleByVal G As Graphics)
        
For i As Integer = 0 To Values.Length - 1
            ValueArray.Add(Values(i))
        
Next
        
Call DrawCurve(G)
    
End Sub

#End Region


#Region "绘制点之间的连线"
    
Private Sub DrawCurve(ByVal G As Graphics, Optional ByVal mClear As Boolean = True)
        
If ValueArray.Count > 0 Then
            
If mClear Then G.Clear(Color.White)
            G.SmoothingMode 
= Drawing2D.SmoothingMode.HighQuality
            
Dim mPoints(ValueArray.Count - 1As Point, Position As Integer = XOffset

            
For i As Integer = ValueArray.Count - 1 To 0 Step -1
                
Dim ThisValue As Single = CType(ValueArray(i), Single)
                
'If Position < PicCurve.Width Then Position += xStep Else Exit For
                Position += xStep
                mPoints(i) 
= New Point(Position, (ThresHold(0- ThisValue) * yStep + Yoffset)
            
Next
            G.DrawCurve(Pens.Blue, mPoints)

            mPoints 
= Nothing
        
End If
    
End Sub

#End Region


#Region "绘制坐标系统"
    
Private Sub DrawReferenceFrame(ByVal G As Graphics)
        
Dim mPoint1 As New Point, mPoint2 As New Point
        
'定义绘图画笔
        Dim MyPen As New Pen(Color.Black, 3)
        
Dim MyStringFormat As New System.Drawing.StringFormat
        MyStringFormat.Alignment 
= StringAlignment.Center
        
Dim mSize As New SizeF

        MyPen.SetLineCap(Drawing2D.LineCap.NoAnchor, Drawing2D.LineCap.ArrowAnchor, Drawing2D.DashCap.Flat)
        
Dim mFont As Font = New Font(FontFamily.GenericSansSerif, 12.0F, FontStyle.Bold)

        
'绘制Y轴
        MyPen.Color = Color.Black
        mPoint1 
= New Point(XOffset, PicCurve.Height)
        mPoint2 
= New Point(XOffset, 0)
        G.DrawLine(MyPen, mPoint1, mPoint2)
        
'绘制X轴
        MyPen.Color = Color.LightGreen
        mPoint1 
= New Point(XOffset, PicCurve.Height / 2)
        mPoint2 
= New Point(PicCurve.Width, PicCurve.Height / 2)
        G.DrawLine(MyPen, mPoint1, mPoint2)
        
'绘制参数名
        MyStringFormat.FormatFlags = StringFormatFlags.DirectionVertical
        mSize 
= G.MeasureString(Name, mFont)
        mPoint1.Offset(
-mSize.Height, 0)
        G.DrawString(Name, mFont, Brushes.Black, mPoint1, MyStringFormat)

        
'绘制参数各门限
        MyPen.DashStyle = Drawing2D.DashStyle.Dash : MyPen.Width = 2
        MyPen.SetLineCap(Drawing2D.LineCap.NoAnchor, Drawing2D.LineCap.NoAnchor, Drawing2D.DashCap.Round)
        
'HI
        If ThresHold(1<> ThresHold(0Then
            MyPen.Color 
= Color.Yellow
            mPoint1 
= New Point(XOffset, (ThresHold(0- ThresHold(1)) * yStep + Yoffset)
            mPoint2 
= New Point(PicCurve.Width, (ThresHold(0- ThresHold(1)) * yStep + Yoffset)
            G.DrawLine(MyPen, mPoint1, mPoint2)
            mSize 
= G.MeasureString(ThresHold(1).ToString, mFont)
            mPoint1.Offset(
-mSize.Width, -mSize.Height / 2)
            G.DrawString(ThresHold(
1).ToString, mFont, Brushes.Yellow, mPoint1)
        
End If
        
'LO
        If ThresHold(2<> ThresHold(3Then
            mPoint1 
= New Point(XOffset, (ThresHold(0- ThresHold(2)) * yStep + Yoffset)
            mPoint2 
= New Point(PicCurve.Width, (ThresHold(0- ThresHold(2)) * yStep + Yoffset)
            G.DrawLine(MyPen, mPoint1, mPoint2)
            mSize 
= G.MeasureString(ThresHold(2).ToString, mFont)
            mPoint1.Offset(
-mSize.Width, -mSize.Height / 2)
            G.DrawString(ThresHold(
2).ToString, mFont, Brushes.Yellow, mPoint1)
        
End If
        
'HIHI
        MyPen.Color = Color.Red
        mPoint1 
= New Point(XOffset, Yoffset)
        mPoint2 
= New Point(PicCurve.Width, Yoffset)
        G.DrawLine(MyPen, mPoint1, mPoint2)
        mSize 
= G.MeasureString(ThresHold(0).ToString, mFont)
        mPoint1.Offset(
-mSize.Width, -mSize.Height / 2)
        G.DrawString(ThresHold(
0).ToString, mFont, Brushes.Red, mPoint1)
        
'LOLO
        mPoint1 = New Point(XOffset, PicCurve.Height - Yoffset)
        mPoint2 
= New Point(PicCurve.Width, PicCurve.Height - Yoffset)
        G.DrawLine(MyPen, mPoint1, mPoint2)
        mSize 
= G.MeasureString(ThresHold(3).ToString, mFont)
        mPoint1.Offset(
-mSize.Width, -mSize.Height / 2)
        G.DrawString(ThresHold(
3).ToString, mFont, Brushes.Red, mPoint1)

        MyPen.Dispose()
        mFont.Dispose()
    
End Sub

#End Region


#Region "要在其上绘制的控件事件"
    
Private Sub PicCurve_Paint(ByVal sender As ObjectByVal e As System.Windows.Forms.PaintEventArgs) Handles PicCurve.Paint
        
Call DrawReferenceFrame(e.Graphics)
    
End Sub


    
Private Sub PicCurve_Resize(ByVal sender As ObjectByVal e As System.EventArgs) Handles PicCurve.Resize
        
On Error Resume Next
        xStep 
= 5
        yStep 
= (PicCurve.Height - 2 * Yoffset) / (ThresHold(0- ThresHold(3))
    
End Sub

#End Region


#Region "绘制永久图像"
    
Function GetGraphics(ByRef pic As PictureBox) As Graphics
        
Dim bmp As Bitmap = New Bitmap(pic.Width, pic.Height)
        pic.Image 
= bmp

        
Dim g As System.Drawing.Graphics = Graphics.FromImage(bmp)
        
Return g
    
End Function

#End Region


#Region "保存图形"
    
Public Sub SaveCurve(ByVal FileName As String)
        
Dim bmp As New Bitmap(PicCurve.Width, PicCurve.Height)
        
Dim g As Graphics = Graphics.FromImage(bmp)
        
Call DrawReferenceFrame(g)
        
Call DrawCurve(g, False)

        bmp.Save(FileName)
    
End Sub

#End Region


End Class
 
阅读(4278) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~