自作タイトルバーが追従するようにしたはなし
C#.NETでFormBorderStyle
をNone
にするとタイトルバーやその他諸々の余計な部分が消えます。
スタイリッシュになって、かっこいいけれどこのままではウィンドウを動かせません。
そこで、自作タイトルバーでウィンドウを動かす方法を調べました。
タイトルバーのないフォームを移動できるようにするdobon.net
しばらくの間この方法を使っていたのですが、こちらの記事にある方法では高速でウィンドウを動かすと、マウスの位置に対して、ウィンドウがあらぬ方向まで行ってしまうことがありました。
今まで使ってきたコードをベースに安定性を高める
マウスの位置に対して、ウィンドウがあらぬ方向まで行ってしまう
という問題があったので、マウスの位置に対する相対位置を計算すればいいのでは?と思い、以下のコードを考え出したのでお勧めします。
※このコードを実行するためにはタイトルバーにMouseDownイベントとMouseMoveイベントを登録しておく必要があります。
private Point basePoint;
private void titleBar_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
basePoint = new Point(Control.MousePosition.X - Location.X, Control.MousePosition.Y - Location.Y);
}
}
private void titleBar_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
Location = new Point(Control.MousePosition.X - basePoint.X, Control.MousePosition.Y - basePoint.Y);
}
}
こちらのコードは最初に押下したときにウィンドウの左上とマウスの相対位置を記録し、マウスを動かしたらその相対位置を用いてウィンドウの位置も調整するというコードです。
余談
気になったので画面外にウィンドウが行った時に自動で画面内に戻すようなプログラムを作ってみましたが、マルチモニターの場合画面間移動ができないのでやめました。(あと最近のWindowsは優秀なのでそんな機能いらなかったのかもしれない)