タイトルバーのないフォームを移動できるようにする

どぼんさんのところの記事で、タイトルバーのないフォームを移動できるようにする記事がある。タイトルバーなしのウィンドゥを作りたいことは良くあることなので、結構、この記事を参考にしている人が多いと思うのだけど、この実装が見事に間違っている。



//マウスのクリック位置を記憶
private Point mousePoint;

//マウスのボタンが押されたとき
private void Form1_MouseDown(object sender,
System.Windows.Forms.MouseEventArgs e)
{
if ((e.Button & MouseButtons.Left) == MouseButtons.Left)
{
//位置を記憶する
mousePoint = new Point(-e.X, -e.Y);
}
}

//マウスが動いたとき
private void Form1_MouseMove(object sender,
System.Windows.Forms.MouseEventArgs e)
{
if ((e.Button & MouseButtons.Left) == MouseButtons.Left)
{
this.SetDesktopLocation(
this.Left + mousePoint.X + e.X,
this.Top + mousePoint.Y + e.Y);
}
}

SetDesktopLocationは、どぼんさんがフォームの位置と大きさを変更するで書いている通り、


Locationプロパティは画面座標で指定しますが、次のようにSetDesktopLocationメソッドを使うと、
デスクトップ座標(タスクバーを除外した画面の作業領域に基づいた座標)で指定できます。
タスクバーが画面の上や左にあるときに役に立ちます。

である。要するに、タスクバーが上に配置されてたりすると( this.Left、this.Top ) で与えられる座標とは異なるのよね。だもんでSetDesktopLocationを用いるのは誤り。ここは単にLocationプロパティで良い。


SetDesktopLocationについては理解しているはずのどぼんさんが何故こんな誤りを犯したのか考えてたのだけど、Googleで検索してるとタイトルバー以外をドラッグしてアプリを移動させる方法についてとかMicrosoft公式の記事もSetDesktopLocationが使ってある。これを参考にしたのかな?


そんなわけでGoogleで検索してると、そこらかしこでSetDesktopLocationを使ったバグのあるプログラムを見かける。こういう誤謬ごびゅうがちまたに氾濫していることがわかる。自分の書いたプログラムでSetDesktopLocationを使っていないかチェックしてみよう。


SetDesktopLocationを使っていいのはタスクバーを考慮して(MSNメッセンジャーの通知ウィンドゥのような)popup windowを出すときぐらいだと思うのだけども…。