Форма без полей и изменяемых размеров (C#)

Я нашел код в интернете и скопировал его, до сих пор я смог получить все правильно, за исключением одной вещи, которая заключается в том, что я хочу сделать форму (окно) полностью безграничной.

Я использую Visual Studio 2013, и этот вопрос касается только кода, который необходим для создания формы (окна) без границ. Проблема в том, что когда вы делаете его без границ, он больше не изменяется, но когда он имеет границу, его можно изменить.

Я знаю, используя некоторый код, это возможно переопределить и достичь обоих. Это то, что у меня есть до сих пор (скопировано с другого сайта). Это избавляет от верхней панели, которая имеет имя программы, делает форму подвижной, щелкая и перетаскивая форму, и она может быть изменена.

единственная проблема заключается в том, что граница все еще существует. Какой код я могу добавить к этому, чтобы граница исчезла? Я хочу сохранить этот текущий код, потому что он обслуживает пару функций, которые мне уже нужны.

кстати, я посмотрел на некоторые старые вопросы с похожими темами, но не нашли правильный код, который мне нужен.

для мод, который направил меня к другой теме: я попробовал код там, и это не совсем то, что я пытаюсь достичь, хотя это аналогичная проблема. Когда я пробовал этот код, я не мог щелкнуть нигде в форме (окне), чтобы переместить его. Кроме того, у него был один изменяемый угол в правом нижнем углу, который не то, что я ищу. Мне нужна функция resize на всех углах и сторонах, как обычно окно.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace BoxHider
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            //Next line doesn't seem to be working
            this.FormBorderStyle = FormBorderStyle.None;
        }
        const int WM_NCHITTEST = 0x0084;
        const int HTCLIENT = 1;
        const int HTCAPTION = 2;
        protected override void WndProc(ref Message m)
        {
            base.WndProc(ref m);
            switch (m.Msg)
            {
                case WM_NCHITTEST:
                    if (m.Result == (IntPtr)HTCLIENT)
                    {
                        m.Result = (IntPtr)HTCAPTION;
                    }
                    break;
            }
        }
        protected override CreateParams CreateParams
        {
            get
            {
                CreateParams cp = base.CreateParams;
                cp.Style |= 0x40000;
                return cp;
            }
        }               
    }
}

What I need

2 ответов


попробуйте это:

public Form1()
{
    InitializeComponent();
    this.FormBorderStyle = FormBorderStyle.None;
}

protected override void WndProc(ref Message m)
{
    const int RESIZE_HANDLE_SIZE = 10;

    switch (m.Msg)
    {
        case 0x0084/*NCHITTEST*/ :
            base.WndProc(ref m);

            if ((int)m.Result == 0x01/*HTCLIENT*/)
            {
                Point screenPoint = new Point(m.LParam.ToInt32());
                Point clientPoint = this.PointToClient(screenPoint);                        
                if (clientPoint.Y <= RESIZE_HANDLE_SIZE)
                {
                    if (clientPoint.X <= RESIZE_HANDLE_SIZE)
                        m.Result = (IntPtr) 13/*HTTOPLEFT*/ ;
                    else if (clientPoint.X < (Size.Width - RESIZE_HANDLE_SIZE))
                        m.Result = (IntPtr) 12/*HTTOP*/ ;
                    else
                        m.Result = (IntPtr) 14/*HTTOPRIGHT*/ ;
                }
                else if (clientPoint.Y <= (Size.Height - RESIZE_HANDLE_SIZE))
                {
                    if (clientPoint.X <= RESIZE_HANDLE_SIZE)
                        m.Result = (IntPtr) 10/*HTLEFT*/ ;
                    else if (clientPoint.X < (Size.Width - RESIZE_HANDLE_SIZE))
                        m.Result = (IntPtr) 2/*HTCAPTION*/ ;
                    else
                        m.Result = (IntPtr) 11/*HTRIGHT*/ ;
                }
                else
                {
                    if (clientPoint.X <= RESIZE_HANDLE_SIZE)
                        m.Result = (IntPtr) 16/*HTBOTTOMLEFT*/ ;
                    else if (clientPoint.X < (Size.Width - RESIZE_HANDLE_SIZE))
                        m.Result = (IntPtr) 15/*HTBOTTOM*/ ;
                    else
                        m.Result = (IntPtr)17/*HTBOTTOMRIGHT*/ ;
                }
            }
            return;
    }
    base.WndProc(ref m);
}

protected override CreateParams CreateParams
{
    get
    {
        CreateParams cp = base.CreateParams;
        cp.Style |= 0x20000; // <--- use 0x20000
        return cp;
    }
}

источники:


вы должны установить стиль границы после загрузки формы:

protected override void OnLoad(EventArgs e)
{
  base.OnLoad(e);
  this.FormBorderStyle = FormBorderStyle.None;
}