プログラム・コード(MainWindow.xaml.vb)

では、次にプログラム・コード(MainWindows.xaml.vbファイル)を見ていきましょう。

コードは4回のコードと似通っている部分については割愛します。4回のコード説明を参照してください。異なる部分のみ解説します。

名前空間の読み込み

「Imports Leap」と「System.Windows.Ink」名前空間の他に、今回はコード内でStoryboardを扱うため「System.Windows.Media.Animation」名前空間を読み込んでおきます。

メンバー変数の宣言

次にメンバー変数を宣言します。

今回もWin32 APIを使用するためにWin32 APIの宣言も行います。4回と同じWin32 APIを使用しています。Win32 APIに関しては4回と同じですが、定数メンバー変数は、

「Private Const MOUSEEVENTF_LEFTDOWN = &H2」
「Private Const MOUSEEVENTF_MOVE = &H1」

の2つを宣言します。

「leap」、「touchIndicator」、「touchPoint」、「windowWidth」、「windowHeight」、「tx」、「ty」、「x」、「y」、「FingersCount」等のメンバー変数については4回と同じのため、そちらの記事を参照してください。

これ以外に、XML要素を表すXElementクラス型のメンバー変数xmldocと、新しいStoryboardのインスタンスstrbメンバー変数を宣言します。また、Imageクラスのメンバー変数myImageも宣言しておきます(リスト3)。

リスト3 メンバー変数の宣言

・・・・コード略・・・
  Private xmldoc As XElement
  Private strb As New Storyboard
  Private myImage As Image
・・・コード略・・・・

MainWindow_Loadedメソッドの処理

XElemet.LoadメソッドでXML文書(forest.xml)を読み込みます。Descendantsメソッドで全ての子孫要素<画像名>の内容をresultに格納しながら、以下の処理を繰り返します。

新しいImageのインスタンスmyImageオブジェクトを作成し、Widthに320、Heightに240と指定します。Sourceプロパティに、”Images/”文字列と、<画像名>要素の値を連結して、指定します。

AddHandlerステートメントで、マウスポインターがmyImageオブジェクトの境界内に入った時に発生するMouseEnterイベントに、イベントハンドラを追加します。

イベントハンドラ内では以下の処理を行います。

myImageの情報を持っているmySenderオブジェクトをDirectcCastでImageにキャストして変数_myImageに格納しておきます。

新しいStoryboardのインスタンスmyStoryBoardを作成します。

2-D x-y座標系内のオブジェクトをスケーリングする新しいScaleTransformのインスタンスmyScaleオブジェクトを作成します。

RenderTransformOriginプロパティで、要素の境界に対する中心点を取得します。

_myImageオブジェクトの描画位置に影響する変換情報にmyScaleオブジェクトを指定します。

新しいDoubleAnimationのインスタンスmyDoubleAnimationオブジェクトを作成します。タイムラインの再生に要する時間に300ミリセカンドと指定します。

アニメーションの開始位置を指定する[From]プロパティに「1」を指定し、アニメーションの終了値を指定する[To]プロパティに「-1」を指定します。

AddメソッドでmySroryboardオブジェクトにmyDoubleAnimationを追加します。

Storyboard.SetTargetPropertyにmyDoubleAnimationとPropertyPathを("RenderTransform.ScaleX")で初期化した新しいインスタンスを指定します。PropertyPathクラスはオブジェクトのデータバインディングと、アニメーションのストーリーボードタイムラインに使用されるクラスです。

StoryBoard.SetTargetでmyDoubleAnimationオブジェクトと、_myImageオブジェクトを指定します。SetTargetは指定したタイムラインが、依存関係オブジェクトを対象にするよう指定します。

同じように、新しいDoubleAnimationのインスタンスmyDoubleAnimation2オブジェクトを作成します。タイムラインの再生に要する時間に1000ミリセカンドと指定します。

アニメーションの開始位置を指定する[From]プロパティに「-1」を指定し、アニメーションの終了値を指定する[To]プロパティに「1」を指定します。

AddメソッドでmySroryboardオブジェクトにmyDoubleAnimation2を追加します。

Storyboard.SetTargetPropertyにmyDoubleAnimation2とPropertyPathを("RenderTransform.ScaleX")で初期化した新しいインスタンスを指定します。PropertyPathクラスはオブジェクトのデータバインディングと、アニメーションのストーリーボードタイムラインに使用されるクラスです。

StoryBoard.SetTargetでmyDoubleAnimation2オブジェクトと、_myImageオブジェクトを指定します。SetTargetは指定したタイムラインが、依存関係オブジェクトを対象にするよう指定します。

BeginメソッドでmyStoryBoardを開始します。

ListBox1にmyImageオブジェクトを追加します。これで、ListBox内に画像が表示されます(リスト4)。

人気記事トップ10

人気記事ランキングをもっと見る

企画広告も役立つ情報バッチリ! Sponsored

ClickHouse Cloudが実現した広告運用SaaS「ATOM」のデータ基盤革新、パフォーマンスを向上しながら、運用負荷とコストを削減 11月11日 6:20 AIで開発が加速する時代、品質保証はどう変わる? Tricentisが示すAIエージェント活用の実像 11月9日 6:45 悪用までの猶予が「1分」に迫るフロンティアAI時代に開発と本番を貫く脆弱性管理が必要 10月29日 8:30 欧州CRA対応とSBOM運用。AI生成コードのOSS混入問題の対策とは ――スニペット単位で検出する「FossID」「Insignary Clarity」によるSBOM運用 9月16日 6:40 PostgreSQLからTiDBへ、稼働中SaaSで進める段階的DB移行の実践と再設計への展望 9月7日 6:30 機能安全開発におけるGoogleTestの活用を支援!「Parasoft C/C++test CT」で実現する効率化&AI連携 4月14日 6:30 【CNDW2025】Grafanaが明かす「オブザーバビリティの哲学」ー最小限の労力で実用的なインサイトを得るには 1月23日 6:30 【CNDW2025】プロダクト急増に備える基盤刷新 ーウェルスナビがECSからEKSへの移行で得た知見とは 1月15日 6:30 【CNDW2025】250環境を5人で運用、構築時間は30分に ーKINTOテクノロジーズが語るインフラ基盤組織の作り方 2025年12月18日 6:30 新たな自動化で熱視線! AIエージェントの「推論能力」を支える2つのコンポーネントとは? 2025年11月28日 6:30