#freeze
[[.NET]]

wpfで、四角くないウインドウを作ってみたの。

ただ作るだけじゃ面白くないから以下でやってみたわ。

- 画像とりこみでなく、wpfな描画でやってみる。
- なんか勝手に動き回る。
- マウスの左ボタンか指でおさえてドラッグできる。
- 右クリックしてやると終了する。

ウインドウタイトルを削ったり、円を描くのは wpf レイアウト側でやるの。~
アナログ時計の時、Lineと Ellipse を使ったわよね。ちなみにネタ元は以下ね。

-  https://msdn.microsoft.com/ja-jp/library/ms747393(v=vs.110).aspx

Lineは線、Ellipse は円を作るのね。ここでは Ellipse を使うわ。

 <Window x:Class="circle1.MainWindow"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         Title="MainWindow" Height="245" Width="230" WindowStyle="None"  AllowsTransparency="True" Background="{x:Null}">
     <Grid>
         <Ellipse Fill="Plum" Height="200" Width="200" MouseLeftButtonDown="mover" MouseRightButtonUp="Ellipse_MouseRightButtonUp" />
     </Grid>
 </Window>

* ウインドウの属性の説明 [#u4376403]

: ウインドウタイトルなし | WindowStyle="None"

: 透明化 | AllowsTransparency="True"

: 背景を消す | Background="{x:Null}"

* Ellipseの属性の説明 [#vcfd438b]

: Fill="Plum" | 指定色で満たす(Fill)

: MouseLeftButtonDown="mover" | マウス左ボタン押下→ mover を呼びだせ

: MouseRightButtonUp="Ellipse_MouseRightButtonUp" | 右クリック→ Ellipse_MouseRightButtonUp を呼び出せ


* プログラム側 [#ka31a40f]

必須なのは、以下。読めばよかるけど重要なのは二行だけ。

        /// <summary>
        /// マウスでドラッグ
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void mover(object sender, MouseButtonEventArgs e)
        {
            this.DragMove();
        }
 
        /// <summary>
        /// 右クリックで終了
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Ellipse_MouseRightButtonUp(object sender, MouseButtonEventArgs e)
        {
            this.Close();
        }


必須でないのは、以下ね。ランダムに動かすやつ。

        Random cr292 = new System.Random();

        /// <summary>
        /// 指定時間ごとにランダムに移動させる。
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void dt_Tick(object sender, EventArgs e)
        {
            // 移動距離
            int k = cr292.Next(1, 4);
            // 0 以上 512 未満の乱数を取得する
            int ii = cr292.Next(0,8);  // 0:↑ 1:/ 2:→ 3:\ 4:↓ 5:/ 6:← 7:\
            switch (ii)
            {
                case 0: this.Top -= k; break;
                case 1: this.Top -= k;this.Left += k; break;
                case 2: this.Left += k; break;
                case 3: this.Top += k;this.Left += k; break;
                case 4: this.Top += k; break;
                case 5: this.Top += k;this.Left -= k; break;
                case 6: this.Left -= k; break;
                case 7: this.Top -= k; this.Left -= k; break;
                default: break;
            }
        }

このランダム移動の呼び出しは……初期化の後にでも以下を埋め込むといいわ。

            DispatcherTimer dt = new DispatcherTimer();
            dt.Interval = new TimeSpan(0, 0, 0,0,100);
            dt.Tick += new EventHandler(dt_Tick);
            dt.Start();

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS