午後わてんのブログ

ベランダ菜園とWindows用アプリ作成(WPFとC#)

WPFとVB.NETでカラーピッカーその2、HSVとRGBで色指定のコード後半部分

このコードの記事は

gogowaten.hatenablog.com

 

WPFVB.NETでカラーピッカーその2、HSVとRGBで色指定 ( ガーデニング ) - 午後わてんのブログ - Yahoo!ブログ
http://blogs.yahoo.co.jp/gogowaten/14025927.html
このコードの前半部分は

gogowaten.hatenablog.com

 
WPFVB.NETでカラーピッカーその2、HSVとRGBで色指定のコード前半部分 - 午後わてんのブログ - Yahoo!ブログ
http://blogs.yahoo.co.jp/gogowaten/14025948.html
 
 
 
 
    'ここから下はイベント
    Private Sub MainWindow_Initialized(sender As Object, e As EventArgs) Handles Me.Initialized
        '色相バー作成
        Call AddHueBar()
        '透明用の市松模様画像作成
        Call CreateTransparentImage()

        'SVの最大値設定
        sldS.Maximum = MaxSV
        sldV.Maximum = MaxSV

        '初期SV画像作成、色相は0(赤)で作成
        Call ChangeImageSV(0)
        imgSV.Width = MaxSV + 1 '100%表示なら0から100なので101ピクセル必要、255表示なら256ピクセル必要なので+1
        imgSV.Height = MaxSV + 1
        canvasSV.Width = imgSV.Width
        canvasSV.Height = imgSV.Height

        imgTransparent.Width = MaxSV
        imgTransparent.Height = MaxSV
        Call cbTransparent_Click(cbTransparent, New RoutedEventArgs)
    End Sub

    Private Sub MainWindow_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded


        AddHandler sldHue.ValueChanged, AddressOf sldHue_ValueChanged
        AddHandler sldS.ValueChanged, AddressOf sldS_ValueChanged
        AddHandler sldV.ValueChanged, AddressOf sldV_ValueChanged

        AddHandler sldA.ValueChanged, AddressOf sldA_ValueChanged

        AddHandler sldR.ValueChanged, AddressOf sldRGB_ValueChanged
        AddHandler sldG.ValueChanged, AddressOf sldRGB_ValueChanged
        AddHandler sldB.ValueChanged, AddressOf sldRGB_ValueChanged

        '初期値設定
        sldHue.Value = 0
        sldS.Value = MaxSV
        sldV.Value = MaxSV
        sldA.Value = 255
        sldR.Value = 255

        AddHandler sldHue.MouseWheel, AddressOf Slider_MouseWheel
        AddHandler sldS.MouseWheel, AddressOf Slider_MouseWheel
        AddHandler sldV.MouseWheel, AddressOf Slider_MouseWheel
        AddHandler sldA.MouseWheel, AddressOf Slider_MouseWheel
        AddHandler sldR.MouseWheel, AddressOf Slider_MouseWheel
        AddHandler sldG.MouseWheel, AddressOf Slider_MouseWheel
        AddHandler sldB.MouseWheel, AddressOf Slider_MouseWheel

        AddHandler tbxH.MouseWheel, AddressOf TextBox_MouseWheel
        AddHandler tbxS.MouseWheel, AddressOf TextBox_MouseWheel
        AddHandler tbxV.MouseWheel, AddressOf TextBox_MouseWheel
        AddHandler tbxA.MouseWheel, AddressOf TextBox_MouseWheel
        AddHandler tbxR.MouseWheel, AddressOf TextBox_MouseWheel
        AddHandler tbxG.MouseWheel, AddressOf TextBox_MouseWheel
        AddHandler tbxB.MouseWheel, AddressOf TextBox_MouseWheel

        'ウィンドウの高さ調整
        Dim neko = spp.Height
        neko = spp.ActualHeight
        Height = neko

    End Sub


    Private Sub thumb1_DragCompleted(sender As Object, e As DragCompletedEventArgs) Handles thumb1.DragCompleted

        IsDrag = False

    End Sub

    'マーカードラッグ移動
    Private Sub thumb1_DragDelta(sender As Object, e As DragDeltaEventArgs) Handles thumb1.DragDelta
        IsDrag = True

        Dim x As Integer = e.HorizontalChange
        Dim y As Integer = e.VerticalChange
        Dim t As Thumb = DirectCast(sender, Thumb)
        Dim w As Integer = Math.Floor(t.ActualWidth / 2)
        Dim h As Integer = Math.Floor(t.ActualHeight / 2)

        Dim nx As Integer = x + Canvas.GetLeft(t)
        Dim ny As Integer = y + Canvas.GetTop(t)
        If nx < -w Then nx = -w
        If nx > MaxSV - w Then nx = MaxSV - w
        If ny < -h Then ny = -h
        If ny > MaxSV - h Then ny = MaxSV - h

        Canvas.SetLeft(t, nx)
        Canvas.SetTop(t, ny)

        Dim p As Point = New Point(nx + w, ny + h)

        'スライダー移動
        sldS.Value = p.X
        sldV.Value = p.Y

    End Sub


    'スライダー
    Private Sub sldS_ValueChanged(sender As Object, e As RoutedPropertyChangedEventArgs(Of Double))
        If IsChangeRGB Then Return

        IsChangeHSV = True
        Call MoveThumb(New Point(e.NewValue, sldV.Value))
        Call ValueChangedHSV()
        IsChangeHSV = False
    End Sub

    Private Sub sldV_ValueChanged(sender As Object, e As RoutedPropertyChangedEventArgs(Of Double))
        If IsChangeRGB Then Return

        IsChangeHSV = True
        Call MoveThumb(New Point(sldS.Value, e.NewValue))
        Call ValueChangedHSV()
        IsChangeHSV = False
    End Sub

    '色相スライダー変化でSV画像更新
    Private Sub sldHue_ValueChanged(sender As Object, e As RoutedPropertyChangedEventArgs(Of Double))
        If IsChangeRGB Then Return

        IsChangeHSV = True
        Call ChangeImageSV(e.NewValue)
        Call ValueChangedHSV()
        IsChangeHSV = False
    End Sub

    'RGBスライダー
    Private Sub sldRGB_ValueChanged(sender As Object, e As RoutedPropertyChangedEventArgs(Of Double))

        If IsChangeHSV Then Return

        IsChangeRGB = True
        Dim hsv As HSV = ChangeHSV()
        Call MoveThumb(New Point(hsv.S, hsv.V))
        Call ChangeImageSV(hsv.H)
        Call ChangeMihon(Color.FromArgb(sldA.Value, sldR.Value, sldG.Value, sldB.Value))

        IsChangeRGB = False
    End Sub

    'アルファスライダー
    Private Sub sldA_ValueChanged(sender As Object, e As RoutedPropertyChangedEventArgs(Of Double))
        Call ChangeMihon(Color.FromArgb(sldA.Value, sldR.Value, sldG.Value, sldB.Value))
    End Sub


    'SV画像クリック
    Private Sub imgSV_MouseLeftButtonDown(sender As Object, e As MouseButtonEventArgs) Handles imgSV.MouseLeftButtonDown
        Dim clickPoint As Point = e.GetPosition(imgSV)

        'マーカーを移動
        Call MoveThumb(clickPoint)
        'スライダー移動
        sldS.Value = clickPoint.X
        sldV.Value = clickPoint.Y

    End Sub

    'マウスホイール、スライダー
    Private Sub Slider_MouseWheel(sender As Slider, e As MouseWheelEventArgs)
        If e.Delta > 0 Then
            sender.Value += 1
        Else
            sender.Value -= 1
        End If
    End Sub
    'マウスホイール、textbox
    Private Sub TextBox_MouseWheel(sender As TextBox, e As MouseWheelEventArgs)
        If e.Delta > 0 Then
            sender.Text += 1
        Else
            sender.Text -= 1
        End If
    End Sub


    '市松模様のオンオフ
    Private Sub cbTransparent_Click(sender As Object, e As RoutedEventArgs) Handles cbTransparent.Click
        Dim cb As CheckBox = DirectCast(sender, CheckBox)
        With imgTransparent

            If cb.IsChecked Then
                .Width = rectMihon.Width
                .Height = rectMihon.Height
            Else
                .Width = 0
                .Height = 0
            End If
        End With
    End Sub


End Class