WPFとVB.NETでカラーピッカーその2、HSVとRGBで色指定
前回からの続き
WPFとVB.NETでカラーピッカーその1 ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ
http://blogs.yahoo.co.jp/gogowaten/14018045.html
http://blogs.yahoo.co.jp/gogowaten/14018045.html
HSVだけからだったのをRGBからも色を選べるようにした
デザイン画面、XAML
色の選択のマーカー
ControlTemplateを使って見た目を変更したThumb
透明色を指定したGridの中に黒と白のEllipseを描いただけのもの
Ellipseの中心が選択した色になるのでEllipseの大きさは中心ができるように
奇数
UpdateSourceTrigger
テキストを入力中にもスライダーに反映させるときは
BindingのUpdateSourceTriggerをPropertyChangedに指定する
前回からの変更や追加したところ
横の色相画像の作成
前回は縦だったけど横のほうがいいかなって
作るのは縦のほうがラクなので縦で作ったのを
TransformBitmapクラスっていうBitmap画像を回転させる便利なのがあったので
これを使って270度回転させて横向き画像にした
例の透明画像
どれだけ透明なのかわかるようによくある市松模様を真似してみた
この市松模様画像も画像を用意しておくのではなくて
アプリ起動時に作成するようにしてみた
最初の
Dim grid As Integer = imgTransparent.Height / 10でマスの大きさを指定している、ここでは画像の大きさの1/10にしている
これはこれで問題なさそうなんだけど、4にすると
こんなふうに崩れてしまうのは
ここが間違っているんだろうけどよくわからん
Sliderを動かした時の処理
HSVとARGBの各値はそれぞれのSliderとtextboxで変更と表示をする
Sliderの値とtextboxのTextはBindingで同期
HSVどれかの値が変更されたらRGBの値も変更する
RGBどれかの値が変更されたらHSVの値も変更する
このままだと処理が無限ループするのでそれぞれフラグ(目印)をつける
HSVの値が変更中ならIsChangeHSVをTrueにしておいて
変更終了したらFalseに戻す
RGBも同様で
↓RGBのSliderのValueChangedイベントの時の処理
最初にHSVの処理中かどうかの判定をして処理中ならなにもしないで終了
If IsChangeHSV Then Return
HSVの処理中ではなかったらRGBの処理中をTrueにして処理続行
IsChangeRGB = True
いろいろ処理して終わったら最後にRGBの処理中フラグをFalseにする
IsChangeRGB = False
これで無限ループしないようにしているけど不格好な気がする
もっとまともな方法があるはずだけどわからん
SV画像クリックしたとき
SV画像ってのは適当につけた名前で
↑だと大きな緑の四角画像のこと
これをクリックした時にクリックした場所に○マーカーをその場所に移動させる処理
SV画像をクリックしたとき
imgSVがSV画像を表示しているImageコントロール
e.GetPositionでクリックした位置(Point)を取得して設置
SとVのスライダーの値も変更、SV画像の大きさとSVスライダーの最大値は
同じにしてあるからクリック位置そのままの値を指定している
○マーカーを移動させる処理、moveThumb
IsDragはマーカーの移動中フラグ、ドラッグ移動中ならここからの処理は必要ない
Dim t As Thumb = thumb1
これほとんど意味ないなw
ConvertThumbPointに位置を渡してマーカーの左上の位置を受け取って
SetLeftとSetTopで位置指定完了
ConvertThumbPoint
クリックした位置がマーカーの中心になるように設置する位置は
クリックした位置の左上にする
クリックした位置と設置する位置の差はマーカーになるEllipseの半径だから直径/2を切り捨て
うーん、MoveThumbとこれをThumbPointは1つにまとめてもいい気がする
なんで分けたんだろ
Sliderとtextboxの上でマウスホイールを回転した時の処理
MouseWheelイベントで
上回転で値を+1、下回転で-1市松模様画像の表示非表示切り替え処理
非表示っていうプロパティが見当たらなかったので
サイズを0x0にして非表示に見せかけているだけ
マーカーの移動時の処理
マウスの動きに合わせてマーカーを移動させているだけ
ドラッグ移動中フラグのIsDragをTrue
マウスカーソルとマーカーの位置のズレがwとhで直径の半分とかは
さっきと同じで、あとは画像からはみ出ないように規制しているのが
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
横縦が0以下にならないように、SとVの最大値を超えないようにしている
ドラッグ終了時
ドラッグ移動中フラグをFalse
マーカーの移動時の処理はSV画像クリック時の処理とほとんど同じで冗長だなあ
不満なのはSV画像クリックしてマーカーを動かしてそのままドラッグ移動できなくて、もう1回クリックする必要があること
処理がもたつく、SV画像が100なら気にならないけど255とかにして
スライダーを動かすと気になる
マーカーの表示と移動だけかな、ほんとはDataContextとか使いたかったけど
まだよくわからん
今回の説明画像で使ったフォント
コード貼り付けようとしたら文字数制限に引っかかったので分割
WPFとVB.NETでカラーピッカーその2、HSVとRGBで色指定のコード後半部分 ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ
http://blogs.yahoo.co.jp/gogowaten/14025951.html
http://blogs.yahoo.co.jp/gogowaten/14025951.html
WPFとVB.NETでカラーピッカーその2、HSVとRGBで色指定のコード前半部分 - 午後わてんのブログ - Yahoo!ブログ
http://blogs.yahoo.co.jp/gogowaten/14025948.html
http://blogs.yahoo.co.jp/gogowaten/14025948.html
コード全体?
この記事の続き
WPFとVB.NETでカラーピッカーその3、元の色の明るさ(輝度)に合わせた別の色(色相)を選びたい ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ
http://blogs.yahoo.co.jp/gogowaten/14039932.html
http://blogs.yahoo.co.jp/gogowaten/14039932.html