#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();