这个colorPicker是继承control来写的。如果大家在写时候可以继承control 或usercontrol来写。

难度并不是很大,只要耐心一点就可认写出来。

用vb.net 写的,代码如下:

view plaincopy to clipboardprint?
Imports System.Drawing  
 
Imports System.Drawing.Drawing2D  
 
Imports System.Drawing.Imaging  
 
Imports System.Collections  
 
Imports System.ComponentModel  
 
Imports System.Collections.Generic  
 
Public Class ColorControl  
 
 
 
    Dim bit As New Bitmap(200, 230)  
 
    Dim isDraw As Boolean = False 
 
    Dim index As Integer = 0  
 
    Dim g As Graphics = Graphics.FromImage(bit)  
 
    Dim _NowColor As Color = Color.Transparent '现在颜色  
 
    Dim _CurrentColor As Color = Color.Transparent '当前颜前  
 
 
 
    '输出颜色  
 
    Public Event OutputColorEvent(ByVal NColor As Color, ByVal CColor As Color)  
 
 
 
    '触发事件  
 
    Sub OutcolorHander(ByVal nColor As Color, ByVal CColor As Color)  
 
        RaiseEvent OutputColorEvent(nColor, CColor)  
 
    End Sub 
 
 
 
    '颜色表  
 
    Dim ColorList() As Integer = {&HFF003366, &HFF336699, &HFF3366CC, &HFF003399, &HFF000099, &HFF0000CC, &HFF000066, _  
 
&HFF006666, &HFF006699, &HFF0099CC, &HFF0066CC, &HFF0033CC, &HFF0000FF, &HFF3333FF, &HFF333399, _  
 
&HFF008080, &HFF009999, &HFF33CCCC, &HFF00CCFF, &HFF0099FF, &HFF0066FF, &HFF3366FF, &HFF3333CC, &HFF666699, _  
 
&HFF339966, &HFF00CC99, &HFF00FFCC, &HFF00FFFF, &HFF33CCFF, &HFF3399FF, &HFF6699FF, &HFF6666FF, &HFF6600FF, &HFF6600CC, _  
 
&HFF339933, &HFF00CC66, &HFF00FF99, &HFF66FFCC, &HFF66FFFF, &HFF66CCFF, &HFF9999FF, &HFF9999FF, &HFF9966FF, &HFF9933FF, &HFF9900FF, _  
 
&HFF006600, &HFF00CC00, &HFF00FF00, &HFF66FF99, &HFF99FFCC, &HFFCCFFFF, &HFFCCECFF, &HFFCCCCFF, &HFFCC99FF, &HFFCC66FF, &HFFCC00FF, &HFF9900CC, _  
 
&HFF003300, &HFF008000, &HFF33CC33, &HFF66FF66, &HFF99FF99, &HFFCCFFCC, &HFFFFFFFF, &HFFFFCCFF, &HFFFF99FF, &HFFFF66FF, &HFFFF00FF, &HFFCC00CC, &HFF660066, _  
 
&HFF336600, &HFF009900, &HFF66FF33, &HFF99FF66, &HFFCCFF99, &HFFFFFFCC, &HFFFFCCCC, &HFFFF99CC, &HFFFF66CC, &HFFFF33CC, &HFFCC0099, &HFF800080, _  
 
&HFF333300, &HFF669900, &HFF99FF33, &HFFCCFF66, &HFFFFFF99, &HFFFFCC99, &HFFFF9999, &HFFFF6699, &HFFFF3399, &HFFCC3399, &HFF800080, _  
 
&HFF666633, &HFF99CC00, &HFFCCFF33, &HFFFFFF66, &HFFFFCC66, &HFFFF9966, &HFFFF7C80, &HFFFF0066, &HFFD60093, &HFF993366, _  
 
&HFF808000, &HFFCCCC00, &HFFFFFF00, &HFFFFCC00, &HFFFF9933, &HFFFF6600, &HFFFF5050, &HFFCC0066, &HFF660033, _  
 
&HFF996633, &HFFCC9900, &HFFFF9900, &HFFCC6600, &HFFFF3300, &HFFFF0000, &HFFCC0000, &HFF990033, _  
 
&HFF663300, &HFF996600, &HFFCC3300, &HFF993300, &HFF990000, &HFF800000, &HFFA50021, _  
 
&HFFFFFFFF, _  
 
&HFFF8F8F8, &HFFDDDDDD, &HFFB2B2B2, &HFF808080, &HFF5F5F5F, &HFF333333, &HFF1C1C1C, &HFF080808, _  
 
&HFFEAEAEA, &HFFC0C0C0, &HFF969696, &HFF777777, &HFF4D4D4D, &HFF292929, &HFF111111, _  
 
&HFF000000}  
 
 
 
    Sub New()  
 
        ' This call is required by the Windows Form Designer.  
 
        InitializeComponent()  
 
        ' Add any initialization after the InitializeComponent() call.  
 
        SetStyle(ControlStyles.AllPaintingInWmPaint, True)  
 
        SetStyle(ControlStyles.StandardDoubleClick, True)  
 
        SetStyle(ControlStyles.ResizeRedraw, True)  
 
        SetStyle(ControlStyles.UserPaint, True)  
 
        SetStyle(ControlStyles.OptimizedDoubleBuffer, True)  
 
        g.SmoothingMode = SmoothingMode.HighQuality  
 
    End Sub 
 
 
 
    <Description("现在颜色")> _  
 
    <Browsable(True)> _  
 
    Public Property NowColor() As Color  
 
        Get 
 
            Return _NowColor  
 
        End Get 
 
        Set(ByVal value As Color)  
 
            _NowColor = value  
 
        End Set 
 
    End Property 
 
 
 
    <Description("现在颜色")> _  
 
    <Browsable(True)> _  
 
    Public Property CurrentColor() As Color  
 
        Get 
 
            Return _CurrentColor  
 
        End Get 
 
        Set(ByVal value As Color)  
 
            _CurrentColor = value  
 
        End Set 
 
    End Property 
 
 
 
 
 
    ''' <summary>  
 
    '''绘制六角形上方   
  pdf
    ''' </summary>  
 
    ''' <param name="gridSize">绘制六角形的长宽</param>  
 
    ''' <param name="mapSize">绘制个数</param>  
 
    ''' <param name="e">绘制对象</param>  
 
    ''' <remarks></remarks>  
 
    Public Sub BulidHexes(ByVal gridSize As Size, ByVal mapSize As Size, ByVal e As PaintEventArgs)  
 
        If isDraw = True Then 
 
            e.Graphics.DrawImage(bit, 0, 0)  
 
            Exit Sub 
 
        End If 
 
        Dim lindes As List(Of PointF) = Nothing 
 
        '六角格的水平半径各垂直半径  
 
        Dim wRad As Single = gridSize.Width / 2  
 
        Dim HRad As Single = gridSize.Height / 2  
 
 
 
        '六角格的水平直线,垂直线  
 
        Dim WLine As Single = Math.Sqrt(Math.Pow(wRad, 2) - Math.Pow(wRad / 2, 2))  
 
        Dim hLine As Single = Math.Sqrt(Math.Pow(HRad, 2) - Math.Pow(HRad / 2, 2))  
 
        '进行蜂窝式切合所必要的位偏移量  
 
        Dim wSpce As Single = (wRad - WLine) * 2  
 
        Dim hspce As Single = (HRad - hLine) * 2  
 
        '六角格的中心点  
 
        Dim cx As Single 
 
        Dim cy As Single 
 
        Dim isCenter As Boolean = False 
 
        Dim result As GraphicsPath  
 
        For y As Integer = 0 To mapSize.Height - 1  
 
            If isCenter = False Then 
 
                mapSize.Width += 1  
 
            Else 
 
                mapSize.Width -= 1  
 
            End If 
 
 
 
            If y = 6 Then 
 
                isCenter = True 
 
            End If 
 
            For x As Integer = 0 To mapSize.Width - 1  
 
                '计当前六角格的中心点  
 
                cx = (gridSize.Width * (x + 1) - wRad) + 100  
 
                cy = (gridSize.Height * (y + 1) - HRad)  
 
                cx = cx - wSpce * x  
 
                cy = cy - hspce * y * 2  
 
 
 
                If isCenter = False Then 
 
                    cx = cx - WLine * mapSize.Width  
 
                Else 
 
                    cx = cx - WLine * mapSize.Width  
 
                End If 
 
 
 
                '保存六角格的六个角的位置  
 
                lindes = New List(Of PointF)(6)  
 
                '北  
 
                Dim start As New PointF(cx, cy - HRad)  
 
                lindes.Add(start)  
 
                '东北  
 
                lindes.Add(New PointF(cx + WLine, cy - HRad / 2))  
 
 
 
                '东南  
 
                lindes.Add(New PointF(cx + WLine, cy + HRad / 2))  
 
 
 
                '南  
 
                lindes.Add(New PointF(cx, cy + HRad))  
 
 
 
                '西南  
 
                lindes.Add(New Point(cx - WLine, cy + HRad / 2))  
 
 
 
                '西北  
 
                lindes.Add(New Point(cx - WLine, cy - HRad / 2))  
 
 
 
                '回到起点:北  
 
                lindes.Add(start)  
 
                result = New GraphicsPath()  
 
                result.AddLines(lindes.ToArray())  
 
                result.CloseFigure()  
 
                Dim solidB As SolidBrush  
 
                solidB = New SolidBrush(Color.FromArgb(ColorList(index)))  
 
                index += 1  
 
                g.FillPath(solidB, result)  
 
            Next 
 
        Next 
 
 
 
 
 
        '=======================  
 
        '下左  
 
        wRad = 31 / 2  
 
        HRad = 32 / 2  
 
        '六角格的水平直线,垂直线  
 
        WLine = Math.Sqrt(Math.Pow(wRad, 2) - Math.Pow(wRad / 2, 2))  
 
        hLine = Math.Sqrt(Math.Pow(HRad, 2) - Math.Pow(HRad / 2, 2))  
 
        '进行蜂窝式切合所必要的位偏移量  
 
        wSpce = (wRad - WLine) * 2  
 
        hspce = (HRad - hLine) * 2  
 
      
 
            '计当前六角格的中心点  
 
        cx = 32 - wRad + 10  
 
        cy = 32 - HRad + 190  
 
        cx = cx - wSpce  
 
        cy = cy - hspce * 2  
 
            '保存六角格的六个角的位置  
 
            lindes = New List(Of PointF)(6)  
 
        '北  
 
        Dim START1 As New PointF(cx, cy - HRad)  
 
        lindes.Add(START1)  
 
            '东北  
 
            lindes.Add(New PointF(cx + WLine, cy - HRad / 2))  
 
 
 
            '东南  
 
            lindes.Add(New PointF(cx + WLine, cy + HRad / 2))  
 
 
 
            '南  
 
            lindes.Add(New PointF(cx, cy + HRad))  
 
 
 
            '西南  
 
            lindes.Add(New Point(cx - WLine, cy + HRad / 2))  
 
 
 
            '西北  
 
            lindes.Add(New Point(cx - WLine, cy - HRad / 2))  
 
 
 
            '回到起点:北  
 
        lindes.Add(START1)  
 
            result = New GraphicsPath()  
 
            result.AddLines(lindes.ToArray())  
 
            result.CloseFigure()  
 
        Dim solidX As SolidBrush  
 
        solidX = New SolidBrush(Color.FromArgb(ColorList(index)))  
 
        index += 1  
 
        g.FillPath(solidX, result)  
 
 
 
 
 
        '================  
 
        '下中  
 
        wRad = gridSize.Width / 2  
 
        HRad = gridSize.Height / 2  
 
        '六角格的水平直线,垂直线  
 
        WLine = Math.Sqrt(Math.Pow(wRad, 2) - Math.Pow(wRad / 2, 2))  
 
        hLine = Math.Sqrt(Math.Pow(HRad, 2) - Math.Pow(HRad / 2, 2))  
 
        '进行蜂窝式切合所必要的位偏移量  
 
        wSpce = (wRad - WLine) * 2  
 
        hspce = (HRad - hLine) * 2  
 
 
 
        Dim len As Integer = 7  
 
        For y As Integer = 0 To 1  
 
            If y = 1 Then 
 
                len = 6  
 
            End If 
 
            For x As Integer = 0 To len  
 
                '计当前六角格的中心点  
 
                cx = (gridSize.Width * (x + 1) - wRad) + 45  
 
                cy = (gridSize.Height * (y + 1) - HRad) + 180  
 
                cx = cx - wSpce * x  
 
                cy = cy - hspce * y * 2  
 
                If y = 1 Then 
 
                    cx = cx + WLine  
 
                End If 
 
                '保存六角格的六个角的位置  
 
                lindes = New List(Of PointF)(6)  
 
                '北  
 
                Dim start As New PointF(cx, cy - HRad)  
 
                lindes.Add(start)  
 
                '东北  
 
                lindes.Add(New PointF(cx + WLine, cy - HRad / 2))  
 
 
 
                '东南  
 
                lindes.Add(New PointF(cx + WLine, cy + HRad / 2))  
 
 
 
                '南  
 
                lindes.Add(New PointF(cx, cy + HRad))  
 
 
 
                '西南   pdf
  
                lindes.Add(New Point(cx - WLine, cy + HRad / 2))  
 
 
 
                '西北  
 
                lindes.Add(New Point(cx - WLine, cy - HRad / 2))  
 
 
 
                '回到起点:北  
 
                lindes.Add(start)  
 
                result = New GraphicsPath()  
 
                result.AddLines(lindes.ToArray())  
 
                Dim solidY As SolidBrush  
 
                solidY = New SolidBrush(Color.FromArgb(ColorList(index)))  
 
                index += 1  
 
                g.FillPath(solidY, result)  
 
            Next 
 
        Next 
 
 
 
 
 
        '==============  
 
        '下右  
 
        wRad = 31 / 2  
 
        HRad = 32 / 2  
 
        '六角格的水平直线,垂直线  
 
        WLine = Math.Sqrt(Math.Pow(wRad, 2) - Math.Pow(wRad / 2, 2))  
 
        hLine = Math.Sqrt(Math.Pow(HRad, 2) - Math.Pow(HRad / 2, 2))  
 
        '进行蜂窝式切合所必要的位偏移量  
 
        wSpce = (wRad - WLine) * 2  
 
        hspce = (HRad - hLine) * 2  
 
 
 
        '计当前六角格的中心点  
 
        cx = 32 - wRad + 165  
 
        cy = 32 - HRad + 190  
 
        cx = cx - wSpce  
 
        cy = cy - hspce * 2  
 
        '保存六角格的六个角的位置  
 
        lindes = New List(Of PointF)(6)  
 
        '北  
 
        Dim START2 As New PointF(cx, cy - HRad)  
 
        lindes.Add(START2)  
 
        '东北  
 
        lindes.Add(New PointF(cx + WLine, cy - HRad / 2))  
 
 
 
        '东南  
 
        lindes.Add(New PointF(cx + WLine, cy + HRad / 2))  
 
 
 
        '南  
 
        lindes.Add(New PointF(cx, cy + HRad))  
 
 
 
        '西南  
 
        lindes.Add(New Point(cx - WLine, cy + HRad / 2))  
 
 
 
        '西北  
 
        lindes.Add(New Point(cx - WLine, cy - HRad / 2))  
 
 
 
        '回到起点:北  
 
        lindes.Add(START2)  
 
        result = New GraphicsPath()  
 
 
 
        result.AddLines(lindes.ToArray())  
 
        result.CloseFigure()  
 
        Dim solidE As SolidBrush  
 
 
 
        solidE = New SolidBrush(Color.Black)  
 
        g.FillPath(solidE, result)  
 
        e.Graphics.DrawImage(bit, 0, 0)  
 
        isDraw = True 
 
 
 
    End Sub 
 
 
 
 
 
    Dim _PenColor As Color = Color.White  
 
    Dim _penSize As Single = 2  
 
    <Description("移动外边六角形的颜色")> _  
 
    <Browsable(True)> _  
 
     Public Property PenColor() As Color  
 
        Get 
 
            Return _PenColor  
 
        End Get 
 
        Set(ByVal value As Color)  
 
            _PenColor = value  
 
        End Set 
 
    End Property 
 
 
 
    <Description("画笔的大小")> _  
 
    Public Property PenSize() As Single 
 
        Get 
 
            Return _penSize  
 
        End Get 
 
        Set(ByVal value As Single)  
 
            _penSize = value  
 
        End Set 
 
    End Property 
 
 
 
 
 
 
 
 
 
 
 
 
 
    ''' <summary>  
 
    ''' 重绘方法  
 
    ''' </summary>  
 
    ''' <param name="e"></param>  
 
    ''' <remarks></remarks>  
 
    Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)  
 
        MyBase.OnPaint(e)  
 
        BulidHexes(New Size(16, 17), New Size(6, 13), e)  
 
        If ISContent = True Then 
 
            Dim pen As New Pen(PenColor, PenSize)  
 
            Dim GContent As Graphics = e.Graphics  
 
            GContent.SmoothingMode = SmoothingMode.AntiAlias  
 
            GContent.DrawPolygon(pen, lindes.ToArray())  
 
            NowColor = Color.FromArgb(ColorList(index))  
 
            OutcolorHander(NowColor, CurrentColor)  
 
 
 
        End If 
 
    End Sub 
 
 
 
    Dim MovePoint As PointF  
 
    Dim ISContent As Boolean = False 
 
    Dim lindes As List(Of PointF) = Nothing 
 
    ''' <summary>  
 
    ''' 鼠标的移动  
 
    ''' </summary>  
 
    ''' <param name="e"></param>  
 
    ''' <remarks></remarks>  
 
    Protected Overrides Sub OnMouseMove(ByVal e As System.Windows.Forms.MouseEventArgs)  
 
        MyBase.OnMouseMove(e)  
 
        If e.Button = Windows.Forms.MouseButtons.Left Then 
 
            MovePoint.X = e.X  
 
            MovePoint.Y = e.Y  
 
            PointInContent(MovePoint)  
 
        End If 
 
    End Sub 
 
    ''' <summary>  
 
    ''' 鼠标的单击  
 
    ''' </summary>  
 
    ''' <param name="e"></param>  
 
    ''' <remarks></remarks>  
 
    Protected Overrides Sub OnMouseClick(ByVal e As System.Windows.Forms.MouseEventArgs)  
 
        MyBase.OnMouseClick(e)  
 
        If e.Button = Windows.Forms.MouseButtons.Left Then 
 
            MovePoint.X = e.X  
 
            MovePoint.Y = e.Y  
 
            PointInContent(MovePoint)  
 
        End If 
 
    End Sub 
 
 
 
 
 
    Protected Overrides Sub OnMouseDoubleClick(ByVal e As System.Windows.Forms.MouseEventArgs)  
 
        MyBase.OnMouseDoubleClick(e)  
 
        If e.Button = Windows.Forms.MouseButtons.Left Then 
 
            MovePoint.X = e.X  
 
            MovePoint.Y = e.Y  
 
            PointInContent(MovePoint)  
 
            If ISContent = True Then 
 
                CurrentColor = Color.FromArgb(ColorList(index))  
 
                OutcolorHander(NowColor, CurrentColor)  
 
            End If 
 
        End If 
 
    End Sub 
 
 
 
 
 
    ''' <summary>  
 
    ''' 判断当前点所在的六角形位置  
 
    ''' </summary>  
 
    ''' <param name="Mpoint"></param>  
 
    ''' <remarks></remarks>  
 
    Sub PointInContent(ByVal Mpoint As PointF)  
 
        index = 0  
 
        Dim gridsize As Size = New Size(16, 17)  
 
        Dim mapsize As Size = New Size(6, 13)  
 
        '六角格的水平半径各垂直半径  
 
 
 
        Dim wRad As Single = gridsize.Width / 2  
 
        Dim HRad As Single = gridsize.Height / 2  
 
        '六角格的水平直线,垂直线  
 
 
 
        Dim WLine As Single = Math.Sqrt(Math.Pow(wRad, 2) - Math.Pow(wRad / 2, 2))  
 
        Dim hLine As Single = Math.Sqrt(Math.Pow(HRad, 2) - Math.Pow(HRad / 2, 2))  
 
        '进行蜂窝式切合所必要的位偏移量  
 
 
 
        Dim wSpce As Single = (wRad - WLine) * 2  
 
        Dim hspce As Single = (HRad - hLine) * 2  
 
        '六角格的中心点  
 
        Dim cx As Single 
 
        Dim cy As Single 
 
        Dim boo As Boolean = False 
 
 
 
        For y As Integer = 0 To mapsize.Height - 1  
 
 
 
            If boo = False Then 
 
                mapsize.Width += 1  
 
            Else 
 
                mapsize.Width -= 1  
 
            End If 
 
 
 
            If y = 6 Then 
 
                boo = True 
 
            End If 
 
 
 
            For x As Integer = 0 To mapsize.Width - 1  
 
                '计当前六角格的中心点  
 
                cx = (gridsize.Width * (x + 1) - wRad) + 100  
 
                cy = (gridsize.Height * (y + 1) - HRad)  
 
                cx = cx - wSpce * x  
 
                cy = cy - hspce * y * 2  
 
                If boo = False Then 
 
 
 
                    cx = cx - WLine * mapsize.Width  
 
                Else 
 
                    cx = cx - WLine * mapsize.Width  
 
                End If 
 
                '保存六角格的六个角的位置  
 
                lindes = New List(Of PointF)(6)  
 
                '北  
 
                Dim start As New PointF(cx, cy - HRad)  
 
                lindes.Add(start)  
 
                '东北  
 
                lindes.Add(New PointF(cx + WLine, cy - HRad / 2))  
 
 
 
                '东南  
 
                lindes.Add(New PointF(cx + WLine, cy + HRad / 2))  
 
 
 
                '南  
 
                lindes.Add(New PointF(cx, cy + HRad))  
 
 
 
                '西南  
 
                lindes.Add(New Point(cx - WLine, cy + HRad / 2))  
 
 
 
                '西北  
 
                lindes.Add(New Point(cx - WLine, cy - HRad / 2))  
 
                '回到起点:北  
 
                lindes.Add(start)  
 
 
 
 
 
                '判断点  
 
                If Mpoint.Y > lindes(0).Y And Mpoint.X < lindes(1).X And Mpoint.Y < lindes(3).Y And Mpoint.X > lindes(4).X Then 
 
                    ISContent = True 
 
                    Me.Invalidate()  
 
                    Exit Sub 
 
                End If 
 
 
 
                index += 1  
 
            Next 
 
        Next 
 
 
 
        '=======================  
 
        '下左  
 
        wRad = 31 / 2  
 
        HRad = 32 / 2  
 
        '六角格的水平直线,垂直线  
 
        WLine = Math.Sqrt(Math.Pow(wRad, 2) - Math.Pow(wRad / 2, 2))  
 
        hLine = Math.Sqrt(Math.Pow(HRad, 2) - Math.Pow(HRad / 2, 2))  
 
        '进行蜂窝式切合所必要的位偏移量  
 
        wSpce = (wRad - WLine) * 2  
 
        hspce = (HRad - hLine) * 2  
 
 
 
        '计当前六角格的中心点  
 
        cx = 32 - wRad + 10  
 
        cy = 32 - HRad + 190  
 
        cx = cx - wSpce  
 
        cy = cy - hspce * 2  
 
        '保存六角格的六个角的位置  
 
        lindes = New List(Of PointF)(6)  
 
        '北  
 
        Dim START1 As New PointF(cx, cy - HRad)  
 
        lindes.Add(START1)  
 
        '东北  
 
        lindes.Add(New PointF(cx + WLine, cy - HRad / 2))  
 
 
 
        '东南  
 
        lindes.Add(New PointF(cx + WLine, cy + HRad / 2))  
 
 
 
        '南  
 
        lindes.Add(New PointF(cx, cy + HRad))  
 
 
 
        '西南  
 
        lindes.Add(New Point(cx - WLine, cy + HRad / 2))  
 
 
 
        '西北  
 
        lindes.Add(New Point(cx - WLine, cy - HRad / 2))  
 
 
 
        '回到起点:北  
 
        lindes.Add(START1)  
 
 
 
        '判断点  
 
        If Mpoint.Y > lindes(0).Y And Mpoint.X < lindes(1).X And Mpoint.Y < lindes(3).Y And Mpoint.X > lindes(4).X Then 
 
            ISContent = True 
 
            Me.Invalidate()  
 
            Exit Sub 
 
        End If 
 
        index += 1  
 
 
 
        '================  
 
        '下中  
 
        wRad = gridsize.Width / 2  
 
        HRad = gridsize.Height / 2  
 
        '六角格的水平直线,垂直线  
 
        WLine = Math.Sqrt(Math.Pow(wRad, 2) - Math.Pow(wRad / 2, 2))  
 
        hLine = Math.Sqrt(Math.Pow(HRad, 2) - Math.Pow(HRad / 2, 2))  
 
        '进行蜂窝式切合所必要的位偏移量  
 
        wSpce = (wRad - WLine) * 2  
 
        hspce = (HRad - hLine) * 2  
 
        Dim len As Integer = 7  
 
        For y As Integer = 0 To 1  
 
            If y = 1 Then 
 
                len = 6  
 
            End If 
 
            For x As Integer = 0 To len  
 
                '计当前六角格的中心点  
 
                cx = (gridsize.Width * (x + 1) - wRad) + 45  
 
                cy = (gridsize.Height * (y + 1) - HRad) + 180  
 
                cx = cx - wSpce * x  
 
                cy = cy - hspce * y * 2  
 
                If y = 1 Then 
 
 
 
                    cx = cx + WLine  
 
                End If 
 
                '保存六角格的六个角的位置  
 
                lindes = New List(Of PointF)(6)  
 
                '北  
 
                Dim start As New PointF(cx, cy - HRad)  
 
                lindes.Add(start)  
 
                '东北  
 
                lindes.Add(New PointF(cx + WLine, cy - HRad / 2))  
 
 
 
                '东南  
 
                lindes.Add(New PointF(cx + WLine, cy + HRad / 2))  
 
 
 
                '南  
 
                lindes.Add(New PointF(cx, cy + HRad))  
 
 
 
                '西南  
 
                lindes.Add(New Point(cx - WLine, cy + HRad / 2))  
 
 
 
                '西北  
 
                lindes.Add(New Point(cx - WLine, cy - HRad / 2))  
 
 
 
                '回到起点:北  
 
                lindes.Add(start)  
 
 
 
                '判断点  
 
                If Mpoint.Y > lindes(0).Y And Mpoint.X < lindes(1).X And Mpoint.Y < lindes(3).Y And Mpoint.X > lindes(4).X Then 
 
                    ISContent = True 
 
                    Me.Invalidate()  
 
                    Exit Sub 
 
                End If 
 
                index += 1  
 
            Next 
 
        Next 
 
 
 
 
 
        '==============  
 
        '下右  
 
        wRad = 31 / 2  
 
        HRad = 32 / 2  
 
        '六角格的水平直线,垂直线  
 
        WLine = Math.Sqrt(Math.Pow(wRad, 2) - Math.Pow(wRad / 2, 2))  
 
        hLine = Math.Sqrt(Math.Pow(HRad, 2) - Math.Pow(HRad / 2, 2))  
 
        '进行蜂窝式切合所必要的位偏移量  
 
        wSpce = (wRad - WLine) * 2  
 
        hspce = (HRad - hLine) * 2  
 
 
 
        '计当前六角格的中心点  
 
        cx = 32 - wRad + 165  
 
        cy = 32 - HRad + 190  
 
        cx = cx - wSpce  
 
        cy = cy - hspce * 2  
 
        '保存六角格的六个角的位置  
 
        lindes = New List(Of PointF)(6)  
 
        '北  
 
        Dim START2 As New PointF(cx, cy - HRad)  
 
        lindes.Add(START2)  
 
        '东北  
 
        lindes.Add(New PointF(cx + WLine, cy - HRad / 2))  
 
 
 
        '东南  
 
        lindes.Add(New PointF(cx + WLine, cy + HRad / 2))  
 
 
 
        '南  
 
        lindes.Add(New PointF(cx, cy + HRad))  
 
 
 
        '西南  
 
        lindes.Add(New Point(cx - WLine, cy + HRad / 2))  
 
 
 
        '西北  
 
        lindes.Add(New Point(cx - WLine, cy - HRad / 2))  
 
 
 
        '回到起点:北  
 
        lindes.Add(START2)  
 
 
 
 
 
        '判断点  
 
        If Mpoint.Y > lindes(0).Y And Mpoint.X < lindes(1).X And Mpoint.Y < lindes(3).Y And Mpoint.X > lindes(4).X Then 
 
            ISContent = True 
 
            Me.Invalidate()  
 
            Exit Sub 
 
        End If 
 
        
 
    End Sub 
 
 
 
End Class

Imports System.Drawing

Imports System.Drawing.Drawing2D

Imports System.Drawing.Imaging

Imports System.Collections

Imports System.ComponentModel

Imports System.Collections.Generic

Public Class ColorControl

Dim bit As New Bitmap(200, 230)

Dim isDraw As Boolean = False

Dim index As Integer = 0

Dim g As Graphics = Graphics.FromImage(bit)

Dim _NowColor As Color = Color.Transparent '现在颜色

Dim _CurrentColor As Color = Color.Transparent '当前颜前

'输出颜色

Public Event OutputColorEvent(ByVal NColor As Color, ByVal CColor As Color)

'触发事件

Sub OutcolorHander(ByVal nColor As Color, ByVal CColor As Color)

RaiseEvent OutputColorEvent(nColor, CColor)

End Sub

'颜色表

Dim ColorList() As Integer = {&HFF003366, &HFF336699, &HFF3366CC, &HFF003399, &HFF000099, &HFF0000CC, &HFF000066, _

&HFF006666, &HFF006699, &HFF0099CC, &HFF0066CC, &HFF0033CC, &HFF0000FF, &HFF3333FF, &HFF333399, _

&HFF008080, &HFF009999, &HFF33CCCC, &HFF00CCFF, &HFF0099FF, &HFF0066FF, &HFF3366FF, &HFF3333CC, &HFF666699, _

&HFF339966, &HFF00CC99, &HFF00FFCC, &HFF00FFFF, &HFF33CCFF, &HFF3399FF, &HFF6699FF, &HFF6666FF, &HFF6600FF, &HFF6600CC, _

&HFF339933, &HFF00CC66, &HFF00FF99, &HFF66FFCC, &HFF66FFFF, &HFF66CCFF, &HFF9999FF, &HFF9999FF, &HFF9966FF, &HFF9933FF, &HFF9900FF, _

&HFF006600, &HFF00CC00, &HFF00FF00, &HFF66FF99, &HFF99FFCC, &HFFCCFFFF, &HFFCCECFF, &HFFCCCCFF, &HFFCC99FF, &HFFCC66FF, &HFFCC00FF, &HFF9900CC, _

&HFF003300, &HFF008000, &HFF33CC33, &HFF66FF66, &HFF99FF99, &HFFCCFFCC, &HFFFFFFFF, &HFFFFCCFF, &HFFFF99FF, &HFFFF66FF, &HFFFF00FF, &HFFCC00CC, &HFF660066, _

&HFF336600, &HFF009900, &HFF66FF33, &HFF99FF66, &HFFCCFF99, &HFFFFFFCC, &HFFFFCCCC, &HFFFF99CC, &HFFFF66CC, &HFFFF33CC, &HFFCC0099, &HFF800080, _

&HFF333300, &HFF669900, &HFF99FF33, &HFFCCFF66, &HFFFFFF99, &HFFFFCC99, &HFFFF9999, &HFFFF6699, &HFFFF3399, &HFFCC3399, &HFF800080, _

&HFF666633, &HFF99CC00, &HFFCCFF33, &HFFFFFF66, &HFFFFCC66, &HFFFF9966, &HFFFF7C80, &HFFFF0066, &HFFD60093, &HFF993366, _

&HFF808000, &HFFCCCC00, &HFFFFFF00, &HFFFFCC00, &HFFFF9933, &HFFFF6600, &HFFFF5050, &HFFCC0066, &HFF660033, _

&HFF996633, &HFFCC9900, &HFFFF9900, &HFFCC6600, &HFFFF3300, &HFFFF0000, &HFFCC0000, &HFF990033, _

&HFF663300, &HFF996600, &HFFCC3300, &HFF993300, &HFF990000, &HFF800000, &HFFA50021, _

&HFFFFFFFF, _

&HFFF8F8F8, &HFFDDDDDD, &HFFB2B2B2, &HFF808080, &HFF5F5F5F, &HFF333333, &HFF1C1C1C, &HFF080808, _

&HFFEAEAEA, &HFFC0C0C0, &HFF969696, &HFF777777, &HFF4D4D4D, &HFF292929, &HFF111111, _

&HFF000000}

Sub New()

' This call is required by the Windows Form Designer.

InitializeComponent()

' Add any initialization after the InitializeComponent() call.

SetStyle(ControlStyles.AllPaintingInWmPaint, True)

SetStyle(ControlStyles.StandardDoubleClick, True)

SetStyle(ControlStyles.ResizeRedraw, True)

SetStyle(ControlStyles.UserPaint, True)

SetStyle(ControlStyles.OptimizedDoubleBuffer, True)

g.SmoothingMode = SmoothingMode.HighQuality

End Sub

<Description("现在颜色")> _

<Browsable(True)> _

Public Property NowColor() As Color

Get

Return _NowColor

End Get

Set(ByVal value As Color)

_NowColor = value

End Set

End Property

<Description("现在颜色")> _

<Browsable(True)> _

Public Property CurrentColor() As Color

Get

Return _CurrentColor

End Get

Set(ByVal value As Color)

_CurrentColor = value

End Set

End Property

''' <summary>

'''绘制六角形上方

''' </summary>

''' <param name="gridSize">绘制六角形的长宽</param>

''' <param name="mapSize">绘制个数</param>

''' <param name="e">绘制对象</param>

''' <remarks></remarks>

Public Sub BulidHexes(ByVal gridSize As Size, ByVal mapSize As Size, ByVal e As PaintEventArgs)

If isDraw = True Then

e.Graphics.DrawImage(bit, 0, 0)

Exit Sub

End If

Dim lindes As List(Of PointF) = Nothing

'六角格的水平半径各垂直半径

Dim wRad As Single = gridSize.Width / 2

Dim HRad As Single = gridSize.Height / 2

'六角格的水平直线,垂直线

Dim WLine As Single = Math.Sqrt(Math.Pow(wRad, 2) - Math.Pow(wRad / 2, 2))

Dim hLine As Single = Math.Sqrt(Math.Pow(HRad, 2) - Math.Pow(HRad / 2, 2))

'进行蜂窝式切合所必要的位偏移量

Dim wSpce As Single = (wRad - WLine) * 2

Dim hspce As Single = (HRad - hLine) * 2

'六角格的中心点

Dim cx As Single

Dim cy As Single

Dim isCenter As Boolean = False

Dim result As GraphicsPath

For y As Integer = 0 To mapSize.Height - 1

If isCenter = False Then

mapSize.Width += 1

Else

mapSize.Width -= 1

End If

If y = 6 Then

isCenter = True

End If

For x As Integer = 0 To mapSize.Width - 1

'计当前六角格的中心点

cx = (gridSize.Width * (x + 1) - wRad) + 100

cy = (gridSize.Height * (y + 1) - HRad)

cx = cx - wSpce * x

cy = cy - hspce * y * 2

If isCenter = False Then

cx = cx - WLine * mapSize.Width

Else

cx = cx - WLine * mapSize.Width

End If

'保存六角格的六个角的位置

lindes = New List(Of PointF)(6)

'北

Dim start As New PointF(cx, cy - HRad)

lindes.Add(start)

'东北

lindes.Add(New PointF(cx + WLine, cy - HRad / 2))

'东南

lindes.Add(New PointF(cx + WLine, cy + HRad / 2))

'南

lindes.Add(New PointF(cx, cy + HRad))

'西南

lindes.Add(New Point(cx - WLine, cy + HRad / 2))

'西北

lindes.Add(New Point(cx - WLine, cy - HRad / 2))

'回到起点:北

lindes.Add(start)

result = New GraphicsPath()

result.AddLines(lindes.ToArray())

result.CloseFigure()

Dim solidB As SolidBrush

solidB = New SolidBrush(Color.FromArgb(ColorList(index)))

index += 1

g.FillPath(solidB, result)

Next

Next

'=======================

'下左

wRad = 31 / 2

HRad = 32 / 2

'六角格的水平直线,垂直线

WLine = Math.Sqrt(Math.Pow(wRad, 2) - Math.Pow(wRad / 2, 2))

hLine = Math.Sqrt(Math.Pow(HRad, 2) - Math.Pow(HRad / 2, 2))

'进行蜂窝式切合所必要的位偏移量

wSpce = (wRad - WLine) * 2

hspce = (HRad - hLine) * 2

'计当前六角格的中心点

cx = 32 - wRad + 10

cy = 32 - HRad + 190

cx = cx - wSpce

cy = cy - hspce * 2

'保存六角格的六个角的位置

lindes = New List(Of PointF)(6)

'北

Dim START1 As New PointF(cx, cy - HRad)

lindes.Add(START1)

'东北

lindes.Add(New PointF(cx + WLine, cy - HRad / 2))

'东南

lindes.Add(New PointF(cx + WLine, cy + HRad / 2))

'南

lindes.Add(New PointF(cx, cy + HRad))

'西南

lindes.Add(New Point(cx - WLine, cy + HRad / 2))

'西北

lindes.Add(New Point(cx - WLine, cy - HRad / 2))

'回到起点:北

lindes.Add(START1)

result = New GraphicsPath()

result.AddLines(lindes.ToArray())

result.CloseFigure()

Dim solidX As SolidBrush

solidX = New SolidBrush(Color.FromArgb(ColorList(index)))

index += 1

g.FillPath(solidX, result)

'================

'下中

wRad = gridSize.Width / 2

HRad = gridSize.Height / 2

'六角格的水平直线,垂直线

WLine = Math.Sqrt(Math.Pow(wRad, 2) - Math.Pow(wRad / 2, 2))

hLine = Math.Sqrt(Math.Pow(HRad, 2) - Math.Pow(HRad / 2, 2))

'进行蜂窝式切合所必要的位偏移量

wSpce = (wRad - WLine) * 2

hspce = (HRad - hLine) * 2

Dim len As Integer = 7

For y As Integer = 0 To 1

If y = 1 Then

len = 6

End If

For x As Integer = 0 To len

'计当前六角格的中心点

cx = (gridSize.Width * (x + 1) - wRad) + 45

cy = (gridSize.Height * (y + 1) - HRad) + 180

cx = cx - wSpce * x

cy = cy - hspce * y * 2

If y = 1 Then

cx = cx + WLine

End If

'保存六角格的六个角的位置

lindes = New List(Of PointF)(6)

'北

Dim start As New PointF(cx, cy - HRad)

lindes.Add(start)

'东北

lindes.Add(New PointF(cx + WLine, cy - HRad / 2))

'东南

lindes.Add(New PointF(cx + WLine, cy + HRad / 2))

'南

lindes.Add(New PointF(cx, cy + HRad))

'西南

lindes.Add(New Point(cx - WLine, cy + HRad / 2))

'西北

lindes.Add(New Point(cx - WLine, cy - HRad / 2))

'回到起点:北

lindes.Add(start)

result = New GraphicsPath()

result.AddLines(lindes.ToArray())

Dim solidY As SolidBrush

solidY = New SolidBrush(Color.FromArgb(ColorList(index)))

index += 1

g.FillPath(solidY, result)

Next

Next

'==============

'下右

wRad = 31 / 2

HRad = 32 / 2

'六角格的水平直线,垂直线

WLine = Math.Sqrt(Math.Pow(wRad, 2) - Math.Pow(wRad / 2, 2))

hLine = Math.Sqrt(Math.Pow(HRad, 2) - Math.Pow(HRad / 2, 2))

'进行蜂窝式切合所必要的位偏移量

wSpce = (wRad - WLine) * 2

hspce = (HRad - hLine) * 2

'计当前六角格的中心点

cx = 32 - wRad + 165

cy = 32 - HRad + 190

cx = cx - wSpce

cy = cy - hspce * 2

'保存六角格的六个角的位置

lindes = New List(Of PointF)(6)

'北

Dim START2 As New PointF(cx, cy - HRad)

lindes.Add(START2)

'东北

lindes.Add(New PointF(cx + WLine, cy - HRad / 2))

'东南

lindes.Add(New PointF(cx + WLine, cy + HRad / 2))

'南

lindes.Add(New PointF(cx, cy + HRad))

'西南

lindes.Add(New Point(cx - WLine, cy + HRad / 2))

'西北

lindes.Add(New Point(cx - WLine, cy - HRad / 2))

'回到起点:北

lindes.Add(START2)

result = New GraphicsPath()

result.AddLines(lindes.ToArray())

result.CloseFigure()

Dim solidE As SolidBrush

solidE = New SolidBrush(Color.Black)

g.FillPath(solidE, result)

e.Graphics.DrawImage(bit, 0, 0)

isDraw = True

End Sub

Dim _PenColor As Color = Color.White

Dim _penSize As Single = 2

<Description("移动外边六角形的颜色")> _

<Browsable(True)> _

Public Property PenColor() As Color

Get

Return _PenColor

End Get

Set(ByVal value As Color)

_PenColor = value

End Set

End Property

<Description("画笔的大小")> _

Public Property PenSize() As Single

Get

Return _penSize

End Get

Set(ByVal value As Single)

_penSize = value

End Set

End Property

''' <summary>

''' 重绘方法

''' </summary>

''' <param name="e"></param>

''' <remarks></remarks>

Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)

MyBase.OnPaint(e)

BulidHexes(New Size(16, 17), New Size(6, 13), e)

If ISContent = True Then

Dim pen As New Pen(PenColor, PenSize)

Dim GContent As Graphics = e.Graphics

GContent.SmoothingMode = SmoothingMode.AntiAlias

GContent.DrawPolygon(pen, lindes.ToArray())

NowColor = Color.FromArgb(ColorList(index))

OutcolorHander(NowColor, CurrentColor)

End If

End Sub

Dim MovePoint As PointF

Dim ISContent As Boolean = False

Dim lindes As List(Of PointF) = Nothing

''' <summary>

''' 鼠标的移动

''' </summary>

''' <param name="e"></param>

''' <remarks></remarks>

Protected Overrides Sub OnMouseMove(ByVal e As System.Windows.Forms.MouseEventArgs)

MyBase.OnMouseMove(e)

If e.Button = Windows.Forms.MouseButtons.Left Then

MovePoint.X = e.X

MovePoint.Y = e.Y

PointInContent(MovePoint)

End If

End Sub

''' <summary>

''' 鼠标的单击

''' </summary>

''' <param name="e"></param>

''' <remarks></remarks>

Protected Overrides Sub OnMouseClick(ByVal e As System.Windows.Forms.MouseEventArgs)

MyBase.OnMouseClick(e)

If e.Button = Windows.Forms.MouseButtons.Left Then

MovePoint.X = e.X

MovePoint.Y = e.Y

PointInContent(MovePoint)

End If

End Sub

Protected Overrides Sub OnMouseDoubleClick(ByVal e As System.Windows.Forms.MouseEventArgs)

MyBase.OnMouseDoubleClick(e)

If e.Button = Windows.Forms.MouseButtons.Left Then

MovePoint.X = e.X

MovePoint.Y = e.Y

PointInContent(MovePoint)

If ISContent = True Then

CurrentColor = Color.FromArgb(ColorList(index))

OutcolorHander(NowColor, CurrentColor)

End If

End If

End Sub

''' <summary>

''' 判断当前点所在的六角形位置

''' </summary>

''' <param name="Mpoint"></param>

''' <remarks></remarks>

Sub PointInContent(ByVal Mpoint As PointF)

index = 0

Dim gridsize As Size = New Size(16, 17)

Dim mapsize As Size = New Size(6, 13)

'六角格的水平半径各垂直半径

Dim wRad As Single = gridsize.Width / 2

Dim HRad As Single = gridsize.Height / 2

'六角格的水平直线,垂直线

Dim WLine As Single = Math.Sqrt(Math.Pow(wRad, 2) - Math.Pow(wRad / 2, 2))

Dim hLine As Single = Math.Sqrt(Math.Pow(HRad, 2) - Math.Pow(HRad / 2, 2))

'进行蜂窝式切合所必要的位偏移量

Dim wSpce As Single = (wRad - WLine) * 2

Dim hspce As Single = (HRad - hLine) * 2

'六角格的中心点

Dim cx As Single

Dim cy As Single

Dim boo As Boolean = False

For y As Integer = 0 To mapsize.Height - 1

If boo = False Then

mapsize.Width += 1

Else

mapsize.Width -= 1

End If

If y = 6 Then

boo = True

End If

For x As Integer = 0 To mapsize.Width - 1

'计当前六角格的中心点

cx = (gridsize.Width * (x + 1) - wRad) + 100

cy = (gridsize.Height * (y + 1) - HRad)

cx = cx - wSpce * x

cy = cy - hspce * y * 2

If boo = False Then

cx = cx - WLine * mapsize.Width

Else

cx = cx - WLine * mapsize.Width

End If

'保存六角格的六个角的位置

lindes = New List(Of PointF)(6)

'北

Dim start As New PointF(cx, cy - HRad)

lindes.Add(start)

'东北

lindes.Add(New PointF(cx + WLine, cy - HRad / 2))

'东南

lindes.Add(New PointF(cx + WLine, cy + HRad / 2))

'南

lindes.Add(New PointF(cx, cy + HRad))

'西南

lindes.Add(New Point(cx - WLine, cy + HRad / 2))

'西北

lindes.Add(New Point(cx - WLine, cy - HRad / 2))

'回到起点:北

lindes.Add(start)

'判断点

If Mpoint.Y > lindes(0).Y And Mpoint.X < lindes(1).X And Mpoint.Y < lindes(3).Y And Mpoint.X > lindes(4).X Then

ISContent = True

Me.Invalidate()

Exit Sub

End If

index += 1

Next

Next

'=======================

'下左

wRad = 31 / 2

HRad = 32 / 2

'六角格的水平直线,垂直线

WLine = Math.Sqrt(Math.Pow(wRad, 2) - Math.Pow(wRad / 2, 2))

hLine = Math.Sqrt(Math.Pow(HRad, 2) - Math.Pow(HRad / 2, 2))

'进行蜂窝式切合所必要的位偏移量

wSpce = (wRad - WLine) * 2

hspce = (HRad - hLine) * 2

'计当前六角格的中心点

cx = 32 - wRad + 10

cy = 32 - HRad + 190

cx = cx - wSpce

cy = cy - hspce * 2

'保存六角格的六个角的位置

lindes = New List(Of PointF)(6)

'北

Dim START1 As New PointF(cx, cy - HRad)

lindes.Add(START1)

'东北

lindes.Add(New PointF(cx + WLine, cy - HRad / 2))

'东南

lindes.Add(New PointF(cx + WLine, cy + HRad / 2))

'南

lindes.Add(New PointF(cx, cy + HRad))

'西南

lindes.Add(New Point(cx - WLine, cy + HRad / 2))

'西北

lindes.Add(New Point(cx - WLine, cy - HRad / 2))

'回到起点:北

lindes.Add(START1)

'判断点

If Mpoint.Y > lindes(0).Y And Mpoint.X < lindes(1).X And Mpoint.Y < lindes(3).Y And Mpoint.X > lindes(4).X Then

ISContent = True

Me.Invalidate()

Exit Sub

End If

index += 1

'================

'下中

wRad = gridsize.Width / 2

HRad = gridsize.Height / 2

'六角格的水平直线,垂直线

WLine = Math.Sqrt(Math.Pow(wRad, 2) - Math.Pow(wRad / 2, 2))

hLine = Math.Sqrt(Math.Pow(HRad, 2) - Math.Pow(HRad / 2, 2))

'进行蜂窝式切合所必要的位偏移量

wSpce = (wRad - WLine) * 2

hspce = (HRad - hLine) * 2

Dim len As Integer = 7

For y As Integer = 0 To 1

If y = 1 Then

len = 6

End If

For x As Integer = 0 To len

'计当前六角格的中心点

cx = (gridsize.Width * (x + 1) - wRad) + 45

cy = (gridsize.Height * (y + 1) - HRad) + 180

cx = cx - wSpce * x

cy = cy - hspce * y * 2

If y = 1 Then

cx = cx + WLine

End If

'保存六角格的六个角的位置

lindes = New List(Of PointF)(6)

'北

Dim start As New PointF(cx, cy - HRad)

lindes.Add(start)

'东北

lindes.Add(New PointF(cx + WLine, cy - HRad / 2))

'东南

lindes.Add(New PointF(cx + WLine, cy + HRad / 2))

'南

lindes.Add(New PointF(cx, cy + HRad))

'西南

lindes.Add(New Point(cx - WLine, cy + HRad / 2))

'西北

lindes.Add(New Point(cx - WLine, cy - HRad / 2))

'回到起点:北

lindes.Add(start)

'判断点

If Mpoint.Y > lindes(0).Y And Mpoint.X < lindes(1).X And Mpoint.Y < lindes(3).Y And Mpoint.X > lindes(4).X Then

ISContent = True

Me.Invalidate()

Exit Sub

End If

index += 1

Next

Next

'==============

'下右

wRad = 31 / 2

HRad = 32 / 2

'六角格的水平直线,垂直线

WLine = Math.Sqrt(Math.Pow(wRad, 2) - Math.Pow(wRad / 2, 2))

hLine = Math.Sqrt(Math.Pow(HRad, 2) - Math.Pow(HRad / 2, 2))

'进行蜂窝式切合所必要的位偏移量

wSpce = (wRad - WLine) * 2

hspce = (HRad - hLine) * 2

'计当前六角格的中心点

cx = 32 - wRad + 165

cy = 32 - HRad + 190

cx = cx - wSpce

cy = cy - hspce * 2

'保存六角格的六个角的位置

lindes = New List(Of PointF)(6)

'北

Dim START2 As New PointF(cx, cy - HRad)

lindes.Add(START2)

'东北

lindes.Add(New PointF(cx + WLine, cy - HRad / 2))

'东南

lindes.Add(New PointF(cx + WLine, cy + HRad / 2))

'南

lindes.Add(New PointF(cx, cy + HRad))

'西南

lindes.Add(New Point(cx - WLine, cy + HRad / 2))

'西北

lindes.Add(New Point(cx - WLine, cy - HRad / 2))

'回到起点:北

lindes.Add(START2)

'判断点

If Mpoint.Y > lindes(0).Y And Mpoint.X < lindes(1).X And Mpoint.Y < lindes(3).Y And Mpoint.X > lindes(4).X Then

ISContent = True

Me.Invalidate()

Exit Sub

End If

End Sub

End Classview plaincopy to clipboardprint?

view plaincopy to pdf clipboardprint?
<FONT size=4>在窗体是使用这个控件</FONT>

在窗体是使用这个控件view plaincopy to clipboardprint?
<FONT size=2>效果如下图:</FONT>

效果如下图:

只要处理一个事件(OutcolorEvnet)IC交易网就可以取得当前颜色与新增颜色.

下面是我的代码。大家在修改颜色时根据自己具体的设置修改一个就行了。使用起来挺方便的

view plaincopy to clipboardprint?
Private Sub ColorControl1_OutputColorEvent(ByVal NColor As System.Drawing.Color, ByVal CColor As System.Drawing.Color) Handles ColorControl1.OutputColorEvent  
 
       Panel1.BackColor = NColor  
 
       Panel2.BackColor = CColor  
 
   End Sub

Private Sub ColorControl1_OutputColorEvent(ByVal NColor As System.Drawing.Color, ByVal CColor As System.Drawing.Color) Handles ColorControl1.OutputColorEvent

Panel1.BackColor = NColor

Panel2.BackColor = CColor

End Sub

转载于:https://www.cnblogs.com/aspxnets/archive/2011/06/29/2093811.html

VB.NET 开发ColorPicker例子相关推荐

  1. 用VB.net开发.NET Micro Framework

    .NET Micro Framework从4.2版本开始就支持VB.net,这对VB爱好者是一个福音,想当年,我也是用VB6开发工控项目,开发了若干年呀,对VB还是比较有感情的,不过后来转到.NET平 ...

  2. VB.net开发微信、支付宝扫码支付源码

    扫码消费机介绍:https://item.taobao.com/item.htm?spm=a1z10.1-c.w4004-21914722028.2.2b826baawDkx32&id=170 ...

  3. 【搬家】VB.NET开发全功能串口调试助手

    VB.NET开发全功能串口调试助手 By Nightmare 2011-07-16 @Xinxiang 小记:VB.NET的串口通信用了很长时间了,也只用Write和Read这样的方法,以前都是用这种 ...

  4. qt5.9开发指南 例子

    qt5.9开发指南 例子 painter.setWindow(-100,-100,200,200); void QPainter::setWindow(int x, int y, int width, ...

  5. vb+flash 开发常见问题之--保存时出现错误:“系统错误H80004005(-2147467259),未指定的错误”

    这个错误是因为:       FLASH 不断升级导致 组件插件 在VB项目开发中保存出现:"系统错误&H80004005(-2147467259),未指定的错误". 解决 ...

  6. 自己用VB.net开发的小型ERP系统,作为开发ERP系统的 一个参考

    自己用VB.net开发的小型ERP系统,作为开发ERP系统的 一个参考.每一行代码都是自己写的,提供源代码.数据库mysql数据库,可以上云

  7. 使用vb.net开发简单的socket通信

    使用vb.net开发简单的socket通信(环境是visual stdio 2019) 说明 参考文章 实现功能 效果展示 代码 服务端 客户端 总结 说明 之前用vb6编程时都是用的winsock控 ...

  8. AutoCAD 开发文档,AutoLISP 教程,.Net AutoCAD开发教程,VB AutoCAD开发教程,ObjectARX 开发指南,VBA AutoCAD开发教程,ActiveX 开发指南

    AutoCAD 开发文档, CAD开发者社区 - AutoCAD二次开发文档,CAD二次开发,CAD插件开发,中文CAD文档 - 中文CAD开发文档,CAD二次开发问题交流,优秀插件分享 AutoLI ...

  9. C#开发Visio例子

    C#开发Visio例子 [实例简介]C#改变Visio阀门的开关 [实例截图] [核心代码] using System; using System.Collections.Generic; using ...

最新文章

  1. 如何解决2012年7月1日增加闰秒后引起linux系统重启问题
  2. SpringBoot 使用(三): 配置文件详解
  3. 特性,物料特性,批次特性(转自SAPNow)
  4. syslinux引导GRUB4DOS
  5. python画海绵宝宝_脑洞大开的万圣节,10招带你和宝宝花式玩南瓜
  6. 红帽Openshift:入门–云中的Java EE6
  7. 如果我用你待我的方式来待你 恐怕你早已离去
  8. 6月20日云栖精选夜读丨国内首家!阿里云宣布全面提供IPv6服务
  9. python机器学习库sklearn——决策树
  10. java ojdbc7_ojdbc7 / ojdbc8中的charset问题与ojdbc6
  11. JAR包自动启动脚本
  12. VueH5页面跳转高德地图导航
  13. 使用 HTML/CSS 实现 Educoder 顶部导航栏
  14. 工资条: EmailSender部分
  15. Linux c — void类型变量和指针
  16. 基于区块链技术的信息服务新架构探讨
  17. 一款简单的本地音乐播放器,界面美观、包括主题切换、歌单管理等等
  18. socket网络编程第一讲
  19. LIN总线:主动进气栅格系统执行器(AGS/AGM)
  20. 英语发音规则---I字母

热门文章

  1. SQL 关于地图两个坐标点之间的距离运算
  2. Centos7 更新gcc版本
  3. Class文件结构(更新中)
  4. mysql四种修改密码的方式
  5. jquery.cookie 使用方法
  6. Python: Convert rst to html
  7. windows程序快速启动的方式:WIN键+R
  8. iOS Xcode4.2代码管理工具的使用
  9. MVC3 Razor 视图引擎的基础语法
  10. Git 命令大全整理