午後わてんのブログ

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

Pixtack紫陽花2.5.41.126_オリジナルカーソルに変更、ベジェ曲線の制御点(ハンドル)の角度連動

前回
 
 
制御点の角度だけ連動することができるようにした
編集開始時に制御点連動にチェックを自動で入れるのを廃止
制御点連動の時に反対側の制御点の座標表示が更新されていないのを修正
編集時のカーソルを独自のものに変更した、大きな十字から小さな点へ
 
グリッド移動のショートカットキーAltを押しながらドラッグした時の挙動をまともにした
ドラッグ中におした時もグリッドに移動するようにしたkeydownイベント

動作の様子
「角度連動」にチェックを入れて制御点を動かすと
反対側の制御点との角度だけ連動する
アンカーポイントとの距離は連動しない
「制御点連動」にチェックを入れると角度と距離を連動
頂点の表示の枠を白黒の点線にして見やすくした
 
チェックを入れていなくてもドラッグ中にショートカットキー押しながらで同じ効果
ベジェ曲線編集中のショートカットキーまとめ
制御点(ハンドル)をドラッグ中
Shiftキー押しながらで「角度連動」
Ctrlキー押しながらで「制御点連動」
Altキーを押しながらで「頂点移動グリッド」
 
アンカーポイントをドラッグ中
Shiftキーを押しながらで「連動移動」
Altキーを押しながら「頂点移動グリッド」
 
以前はShiftキーを押しながらで制御点連動になっていたけど
角度連動を追加したのでCtrlキーに変更した
これはエクセルの図形の編集時のCtrlキーを押しながらサイズ変更で
縦横比を変更しないという操作に習った
 
制御点の角度連動

f:id:gogowaten:20191016153635p:plain

いつものエクセル方眼紙
角度連動は適当に名前を付けたけど内容は
反対側の制御点との角度だけちょうど反対側の180度になるように連動して
反対側の制御点とアンカーポイントとの距離は変化させない動作のこと
動かしている制御点の座標はマウスの座標だからすぐわかるとして
反対側の制御点の座標はどう求めたらいいのか
また三角関数が関係するのかと考えてみたけどよくわからん
使えば効率良くできるのかもしれないけど使い方がわからないので
使わずに終わったw
動かしている制御点とアンカーポイントとの対辺、隣辺、斜辺を全て測って
対辺/斜辺でsin?これに反対側の制御点とアンカーポイントとの距離(斜辺)を
掛け算で対辺の長さ(y座標)
隣辺/斜辺でcos?これに反対側の制御点とアンカーポイントとの距離(斜辺)を
掛け算で隣辺の長さ(x座標)
これで期待通りに動くようになった
 
連動じゃないけど角度を変えずに長さだけ変えたい時があるけど
主なショートカットキーが埋まってしまったからどうしようか
 
カーソルの変更
イメージ 1
以前は大きくて邪魔だったので小さいのを作った
頂点表示用のマーカーラベルも番号とか表示しない時は透明にして
枠を白黒の点線の枠にした
 
カーソル作成に使ったアプリは

f:id:gogowaten:20191016153658p:plain

素晴らしいアプリ!
 
作ったカーソルを指定するのは簡単で
 Dim oc As Cursor
        oc = New Cursor("E:\オレ\アイコン\マウスカーソル\白黒点3.cur")
Label.Cursor = oc
 
vbでは白黒のカーソルしか対応していないらしく
色のついたカーソルやアニメーションするカーソルを使おうとすると難しくなって
ここみても難しそうだったのでパス
 
サイズ変更マーカーのカーソル変更
イメージ 3
手の形から矢印に変更した
これは元からVBに入っているカーソル
 
ドラッグで移動中にAltキー押した時にグリッドに移動

f:id:gogowaten:20191016154149p:plain

アンカーポイントや制御点はラベルで表示しているから
ラベルのKeyDownイベントにグリッドに移動するように書いていて
書き終わってからKeyDownイベントにくっつけようとしたらKeyDownイベントが
見当たらない!
よく見たらラベルにはKeyDownイベントはないみたい?
PreviewKeyDownってのがあったので試したけど期待通りに動いてくれない…
で思いついた(思い出した)のがKeyDownイベントが有る適当なコントロールオブジェクトにフォーカスを置いてそこから作動させるってこと
クリックしたラベルを記憶しておいてそれを対象にして動作をかけばいい
今回は目立たないところにおいてあるListBoxにフォーカスを置いてそのKeyDownイベントに
        '頂点ラベル移動中にaltキーが押されたらグリッドに移動
        If e.Alt And isLabelMoveNow Then
            Call 頂点座標の計算(ActLabel)
 
ActLabelにクリックしたラベルを入れて記憶しておく
isLabelMoveNowはフラグ用の変数、ラベルをドラッグ中ならTrue
 
ダウンロード先