2011年04月25日

WPF:マウスカーソルが、特定のコントロールの上にあるかどうかを知る

   このエントリーをはてなブックマークに追加 Clip to Evernote
WPFで、マウスカーソルが、特定のコントロールの上にあるかどうかを知る方法がわからなくてかなり悩みました。

MSDNライブラリでいろいろと調べて、VisualTreeHelper.HitTestを使えばよいことは分かったのですが、
何も表示されていないImageコントロール上に、マウスカーソルがあるかどうかをHitTestで調べようとしましたが、上手くいきません。
何も表示されていない=そこに存在していないと同じなのだから、
操作はできないということなのだと思います。

そういえば、前にも似たようなことで悩んだ記憶があります。

結局、Borderの子要素として、Imageを配置し、Borderの色をWhiteに設定すれば、
HitTesをが利用できることがわかりました。


でも、ちょっといまいちな方法だなー

それと、このメソッド Silverlightには無いんですね...
代わりに、FindElementsInHostCoordinates() メソッド が使えそうですが、 試していません。
FindElementsInHostCoordinates()メソッドは、WPFにはありません...   

Posted by gushwell at 23:00Comments(2)TrackBack(0)

2009年07月05日

[パズル]多角形の完全グラフ

   このエントリーをはてなブックマークに追加 Clip to Evernote
今回の問題は、前回の「[パズル](n*2+1)多角形の一筆書き」の続きです。

今度は、多角形の頂点の数が偶数のときでも、完全グラフが描けるようにするプログラムです。
でも、偶数のときは一筆書きはできないので、できるだけ、ペンの移動が少なくなうようにというもが問題なのですが、ペンの移動量については無視し、とりあえず、完全グラフが描かれるようにしました。
ただし、奇数のときには、一筆書きになるようになっています。

頂点の数が奇数か偶数かで処理を分岐させないで、これをやれるようにしています(SearchPathメソッド)。
でもちょっとややこしい再帰処理になってしまいました。
PerfectGraphクラスのほうは、LINQ使ってそれぞれのメソッドを簡潔に書けたと思います。

前回同様、WPFで、DoubleAnimationを使ってアニメーションさせています。この部分は、前回のコードと変わっていません。(多分)

PerfectGraph1PerfectGraph2

XAMLとC#のコードを張り付ければ、動くと思うので、興味ある方は動かしてみてください。

なお、今年初めから『ナノピコ教室・プログラミング問題集』(駒木悠二+有澤誠 編 共立出版株式会社)に掲載されている問題を解き、ここに掲載してきましたが、興味ある問題は、ほぼやり終えたので、いったん終了したいと思います。
頭の体操になったし、LINQの勉強にもなったし、再帰処理の勉強になったし、最後は、WPFにも挑戦できたしで、なかなか楽しかったですね。
『続・ナノピコ教室』も手元にあるので、こちらもいつか挑戦したいと思います。




※当記事に掲載したコードは、『ナノピコ教室・プログラミング問題集』(駒木悠二+有澤誠 編 共立出版株式会社)に掲載されている問題を一部変更し、GushwellがC#で解いたものです。  
Posted by gushwell at 22:35Comments(0)TrackBack(1)

2009年06月07日

[パズル](n*2+1)多角形の一筆書き

   このエントリーをはてなブックマークに追加 Clip to Evernote
問題
自然数 n を入力した時に、ノード数 n * 2 + 1 の完全グラフを一筆書きするようなプログラムを書いてください。スタートは画面上の一番上胃に位置する頂点とします。 完全グラフとはどの二つの頂点も一本の線で結ばれているグラフのことです。

------
この問題は、本当に一筆書きができているのかを目で確かめたかったのと、動きがあったほうが面白いので、WPFのアニメーションを使ってみました。

OneStroke01 OneStroke02


まずは、問題の本質部分である一筆書きを求めるクラス OneStrokeを作成します。
このコンストラクタで n を受け取り、そこから 正多角形になるように(n*2+1)個の座標を配列にセットします。コメントにも書きましたが、本当は、OneStrokeで扱う座標は、仮の座標であって、表示するときにこの座標から本来の表示座標に変換したいところですが、面倒なので、実際に表示する実座標を扱っています。

GetPointsメソッドが、一筆書きになるような座標のシーケンスを返す部分で、このプログラムの中心になる部分です。実際に動かしてから、このコードを読んでいただいたほうが、理解が早いと思います。
簡単に書くと、まずは左隣の点まで線を順に引いてゆきます。左隣の点までの線が引き終わっていたら、ひとつ置きの点まで線を引き、これを繰り返し、次に2つ置き... と続けてゆきます。
実際には、ここでは点のシーケンスを求めているだけです。

で、実際にWPFで描画しているのが、Window1クラスのほうです。XAML側ではアニメーションの指定は特にしていません。
すべてC#のコードでアニメーションを行っています。WPFについては素人なので、よくわからないんですが、点の数も入力値で決まるので、事前にXAMLで指定しておくことはできないのかな思います。
単に僕がXAMLの書き方を知らないってだけのような気もしますが... どなたかわかる方教えてください。

DrawAnimatedLineメソッドが一つの直線を引くアニメーションを担当しています。で、線が引き終わると、myStoryboard_Completed イベントハンドラが呼び出されるので、ここで、次の線を引くために、再度、DrawAnimatedLineを呼び出し、これを繰り返しています。
そういうことで、Storyboard と DoubleAnimation を使ったC#のサンプルコードとしても面白いものになったかなと思います。

以下、今回のプログラムコードです。



※当記事に掲載したコードは、『ナノピコ教室・プログラミング問題集』(駒木悠二+有澤誠 編 共立出版株式会社)に掲載されている問題を一部変更し、GushwellがC#で解いたものです。   
Posted by gushwell at 22:51Comments(0)TrackBack(0)

2009年05月06日

[パズル]凸多角形の外周

   このエントリーをはてなブックマークに追加 Clip to Evernote
問題
任意の数の点が与えられた時、点と点を結び凸多角形の外周を作ってください。 凸多角形の外側には点が存在しないようにします。

--------------

FrameLine01FrameLine02


この問題は、Consoleアプリケーションとして解いても面白みがないし、検証も厄介なので、WPFアプリとして作成してみました。
どうやって解くかは、C#のコードに挿入したコメントを読んでください。

今回もLINQを使っています。IEnumerableは、もう手放せませんね。
WPFの勉強になりました。

実は、この問題は、外周の中の点も結んで、線分が交差しない三角形の編み目を作るという問題の一部なのですが、 三角形の網目を作るアルゴリズムが思い浮かばなかったのでパスしています。

※当記事に掲載したコードは、『ナノピコ教室・プログラミング問題集』(駒木悠二+有澤誠 編 共立出版株式会社)に掲載されている問題を一部変更し、GushwellがC#で解いたものです。  
Posted by gushwell at 22:58Comments(0)TrackBack(0)