05-10-12, 06:47 PM
الكود الخاص بالكونترول كاملا
كود :
Imports System.Windows.Forms
Imports System.Drawing
Imports System.Drawing.Drawing2D
Imports System.ComponentModel
<DefaultEvent("SelectedColorChanged")> _
Public Class ImageColorPicker
Inherits Control
#Region " Fields "
Private imageBorders As Integer = 5
Private colorSelected As Color = Color.Empty
Private selectedPoint As Point = New Point(-1, -1)
Private pickerImage As Bitmap = Nothing
Private internalImage As Bitmap = Nothing
#End Region
#Region " Constructor "
Public Sub New()
SetStyle(ControlStyles.SupportsTransparentBackColor, True)
SetStyle(ControlStyles.Opaque, False)
SetStyle(ControlStyles.DoubleBuffer, True)
SetStyle(ControlStyles.AllPaintingInWmPaint, True)
SetStyle(ControlStyles.UserPaint, True)
UpdateStyles()
End Sub
#End Region
#Region " Properties "
Public Property SelectedColor() As Color
Get
Return Me.colorSelected
End Get
Set(ByVal value As Color)
Me.colorSelected = value
Dim w As Integer = MyBase.Width - (2 * Me.imageBorders)
Dim h As Integer = MyBase.Height - (2 * Me.imageBorders)
Me.selectedPoint.X = ((255 - Me.SelectedColor.GetBrightness()) * w) / 255
Me.selectedPoint.Y = ((255 - Me.SelectedColor.GetSaturation) * h) / 255
Me.DrawPickerImage()
MyBase.Invalidate()
End Set
End Property
Public Property Image As Bitmap
Get
Return Me.pickerImage
End Get
Set(ByVal value As Bitmap)
Me.pickerImage = value
Me.DrawPickerImage()
Me.Invalidate()
End Set
End Property
Protected Overrides ReadOnly Property DefaultSize As System.Drawing.Size
Get
Return New Size(100, 100)
End Get
End Property
#End Region
#Region " Methods "
Private Sub CheckColorPoint(ByRef pt As Point)
If (pt.X - Me.imageBorders) < 0 Then
pt.X = Me.imageBorders
End If
If pt.X > ((MyBase.Width - Me.imageBorders) - 1) Then
pt.X = (MyBase.Width - Me.imageBorders) - 1
End If
If (pt.Y - Me.imageBorders) < 0 Then
pt.Y = Me.imageBorders
End If
If pt.Y > ((MyBase.Height - Me.imageBorders) - 1) Then
pt.Y = (MyBase.Height - Me.imageBorders) - 1
End If
End Sub
Private Function IsColorFromPoint(ByVal pt As Point) As Boolean
Me.CheckColorPoint(pt)
If Me.pickerImage IsNot Nothing Then
If (((pt.X - Me.imageBorders) >= 0) AndAlso ((pt.X - Me.imageBorders) < Me.internalImage.Width)) AndAlso (((pt.Y - Me.imageBorders) >= 0) AndAlso ((pt.Y - Me.imageBorders) < Me.internalImage.Height)) Then
Dim pixelColor As Color = Me.internalImage.GetPixel(pt.X - Me.imageBorders, pt.Y - Me.imageBorders)
If pixelColor.A > 0 Then
Me.colorSelected = pixelColor
Me.selectedPoint.X = pt.X - Me.imageBorders
Me.selectedPoint.Y = pt.Y - Me.imageBorders
Return True
End If
End If
End If
Return False
End Function
Protected Sub onSelectedcolorchanged(ByVal e As EventArgs)
Dim handler As EventHandler = CType(Me.Events("SelectedColorChangedEvent"), EventHandler)
If handler IsNot Nothing Then
handler.Invoke(Me, e)
End If
End Sub
Private Sub DrawPickerImage()
If MyBase.Width > 0 AndAlso Me.pickerImage IsNot Nothing Then
Me.internalImage = New Bitmap(MyBase.Width - (Me.imageBorders * 2), MyBase.Height - (Me.imageBorders * 2))
Dim g As Graphics = Graphics.FromImage(Me.internalImage)
Dim mode As SmoothingMode = g.SmoothingMode
g.SmoothingMode = SmoothingMode.AntiAlias
Dim rect As New Rectangle(0, 0, Me.internalImage.Width, Me.internalImage.Height)
g.DrawImage(pickerImage, rect)
g.SmoothingMode = mode
g.Dispose()
End If
End Sub
Protected Overrides Sub OnMouseDown(ByVal e As System.Windows.Forms.MouseEventArgs)
MyBase.OnMouseDown(e)
If Me.IsColorFromPoint(e.Location) Then
If Not Me.Focused Then
MyBase.Focus()
End If
MyBase.Invalidate()
Me.onSelectedcolorchanged(New EventArgs())
End If
End Sub
Protected Overrides Sub OnMouseMove(ByVal e As System.Windows.Forms.MouseEventArgs)
MyBase.OnMouseMove(e)
If (e.Button = MouseButtons.Left) AndAlso Me.IsColorFromPoint(e.Location) Then
MyBase.Invalidate()
Me.onSelectedcolorchanged(New EventArgs())
End If
End Sub
Protected Overrides Sub OnEnter(ByVal e As System.EventArgs)
MyBase.OnEnter(e)
MyBase.Invalidate()
End Sub
Protected Overrides Sub OnLeave(ByVal e As System.EventArgs)
MyBase.OnLeave(e)
MyBase.Invalidate()
End Sub
Protected Overrides Sub OnSizeChanged(ByVal e As System.EventArgs)
Me.DrawPickerImage()
MyBase.OnSizeChanged(e)
End Sub
Protected Overrides Sub OnResize(ByVal e As System.EventArgs)
Me.DrawPickerImage()
MyBase.OnResize(e)
End Sub
Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
MyBase.OnPaint(e)
Dim mode As SmoothingMode = e.Graphics.SmoothingMode
e.Graphics.SmoothingMode = SmoothingMode.AntiAlias
If Me.internalImage IsNot Nothing Then
Using lgb As New LinearGradientBrush(Me.ClientRectangle, Color.Black, Color.FromArgb(200, Color.Black), 90, False)
e.Graphics.FillRectangle(lgb, Me.ClientRectangle)
End Using
e.Graphics.DrawImage(Me.internalImage, Me.imageBorders, Me.imageBorders)
End If
If Me.selectedPoint.X > -1 Then
Dim r As New Rectangle((Me.imageBorders + Me.selectedPoint.X) - 5, (Me.imageBorders + Me.selectedPoint.Y) - 5, 10, 10)
Using sb As Brush = New SolidBrush(Me.colorSelected)
e.Graphics.FillEllipse(sb, r)
End Using
e.Graphics.DrawEllipse(Pens.White, r)
r.Inflate(1, 1)
e.Graphics.DrawEllipse(Pens.Black, r)
End If
e.Graphics.SmoothingMode = mode
End Sub
#End Region
#Region " Events "
Public Custom Event SelectedColorChanged As EventHandler
AddHandler(ByVal value As EventHandler)
Me.Events.AddHandler("SelectedColorChangedEvent", value)
End AddHandler
RemoveHandler(ByVal value As EventHandler)
Me.Events.RemoveHandler("SelectedColorChangedEvent", value)
End RemoveHandler
RaiseEvent(ByVal sender As Object, ByVal e As System.EventArgs)
CType(Me.Events("SelectedColorChangedEvent"), EventHandler).Invoke(sender, e)
End RaiseEvent
End Event
#End Region
End Class ' ImageColorPicker