0
0

自作の高精度タイトルバー【C# .NET Framework】

Posted at

自作タイトルバーが追従するようにしたはなし

C#.NETでFormBorderStyleNoneにするとタイトルバーやその他諸々の余計な部分が消えます。
スタイリッシュになって、かっこいいけれどこのままではウィンドウを動かせません。
そこで、自作タイトルバーでウィンドウを動かす方法を調べました。
タイトルバーのないフォームを移動できるようにする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);
    }
}

こちらのコードは最初に押下したときにウィンドウの左上とマウスの相対位置を記録し、マウスを動かしたらその相対位置を用いてウィンドウの位置も調整するというコードです。
無題.png

余談

気になったので画面外にウィンドウが行った時に自動で画面内に戻すようなプログラムを作ってみましたが、マルチモニターの場合画面間移動ができないのでやめました。(あと最近のWindowsは優秀なのでそんな機能いらなかったのかもしれない)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0