0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

[.NET] 実行中にFormBorderStyle=Noneに切り替えても簡易的にサイズ変更できるようにしてみた。

Posted at

Windowsのタイトルバーを表示させない方法はいろいろありますが、実行中にタイトルバーを消したり出したり切り替えたい場合(そんなことあるのか?)、

  • CreateParamsをオーバーライドするスマートな方法は文字通りForm作成時にしか参照されないので実行中に切り替えるのには使えない
  • ControlBox=FalseでText=String.Emptyはタスクバーも名無しになるのが不自然(元からタスクバーに表示させないつもりならこれで)
  • 仕方がないのでFormBorderStyle=Noneを使うのですが、そのままではサイズ変更ができない困りもの

なので疑似的にFormBorderStyle=Noneでもサイズ変更できるようにしてみました。あくまでも簡易的にね。その割にちょっと長いけど。

Form1.cs
private bool inFormSizeChange;

private void Form1_MouseDown(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
        mousePoint = new Point(e.X, e.Y);
    if (this.Cursor != Cursors.Default)
        inFormSizeChange = true;    //マウスカーソルが変わっていればサイズ変更開始
    else
        inFormSizeChange = false;
}

private void Form1_MouseMove(object sender, MouseEventArgs e)
{
    int minWidth = 128;    // ここらは適当に設定
    int minHeight = 64; 

    if (e.Button == MouseButtons.Left)
    {
        if (this.Cursor == Cursors.SizeWE)    // マウスカーソルが左右矢印に変わってたら
        {
            if (e.X < this.Width / 2)    // フォームの左半分(適当)で動いているなら左へ伸ばしてる
            {
                this.Width -= e.X - mousePoint.X;
                if (this.Width < minWidth) this.Width = minWidth;
                else this.Left += e.X - mousePoint.X;    // 左に動いているならフォームの原点自体も移動
            }
            else    //じゃなかったら右へ動いてる
            {
                this.Width += (e.X - mousePoint.X) / 5;    // ÷5は適当にスピード調整
                if (this.Width < minWidth) this.Width = minWidth;    // 右へ伸ばしてる場合は原点の移動は無い
            }
        }
        else if (this.Cursor == Cursors.SizeNS)    // マウスカーソルが上下矢印に変わってたら
        {
            if (e.Y < this.Height / 2)
            {
                this.Height -= e.Y - mousePoint.Y;
                if (this.Height < minHeight) this.Height = minHeight;
                else this.Top += e.Y - mousePoint.Y;
            }
            else
            {
                this.Height += (e.Y - mousePoint.Y) / 5;
                if (this.Height < minHeight) this.Height = minHeight;
            }
        }
    }
    if (form2.HideTitleCheckBox.Checked)    //タイトルバーを隠す設定になっていたら
    {
        if (e.X < 8 || e.X > this.Width - 8)    // 8は元のフォーム枠のサイズ 摘まみにくかったら要調整
            this.Cursor = Cursors.SizeWE;       // 大きくしすぎるとカーソルがDefaultに戻りづらい(Formのサイズに依る)
        else if (e.Y < 8 || e.Y > this.Height - 8)
            this.Cursor = Cursors.SizeNS;
        else if (!inFormSizeChange)    // これが無いと移動中にカーソルが範囲外に出ると戻っちゃう
            this.Cursor = Cursors.Default;
    }
}

private void Form1_MouseHover(object sender, EventArgs e)
{
    inFormSizeChange = false;    // ボタンの押されていないカーソルがフォームにもどってきたらサイズ変更終了
    this.Cursor = Cursors.Default;    //変えたカーソルを戻す
}

ただやるべきことちまちまと書いてるだけです。
フォームの内側を摘まむ必要があったり、マウスカーソルがフォームの外に出てしまうとイベントで捕まえられなくなってしまうので、ちょっとマウス捌きにコツが要りますが(特に右方向、下方向)、なんとなく趣味の範囲ではこれで実用になってます。
車輪の再発明? なにか別のもっといい方法があったら教えてください。

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?