@alexpoleha

C# Как изменить размер формы без рамки?

Нужно, чтобы размер формы менялся перетягиванием краев формы.
  • Вопрос задан
  • 4090 просмотров
Пригласить эксперта
Ответы на вопрос 3
Пример кода для перемещения и изменения размеры формы без рамки:
public partial class Form1 : Form {
    public Form1() {
      InitializeComponent();
      this.FormBorderStyle = FormBorderStyle.None;
      this.DoubleBuffered = true;
      this.SetStyle(ControlStyles.ResizeRedraw, true);
    }
    private const int cGrip = 16;      // Grip size
    private const int cCaption = 32;   // Caption bar height;

    protected override void OnPaint(PaintEventArgs e) {
      Rectangle rc = new Rectangle(this.ClientSize.Width - cGrip, this.ClientSize.Height - cGrip, cGrip, cGrip);
      ControlPaint.DrawSizeGrip(e.Graphics, this.BackColor, rc);
      rc = new Rectangle(0, 0, this.ClientSize.Width, cCaption);
      e.Graphics.FillRectangle(Brushes.DarkBlue, rc);
    }

    protected override void WndProc(ref Message m) {
      if (m.Msg == 0x84) {  // Trap WM_NCHITTEST
        Point pos = new Point(m.LParam.ToInt32() & 0xffff, m.LParam.ToInt32() >> 16);
        pos = this.PointToClient(pos);
        if (pos.Y < cCaption) {
          m.Result = (IntPtr)2;  // HTCAPTION
          return;
        }
        if (pos.X >= this.ClientSize.Width - cGrip && pos.Y >= this.ClientSize.Height - cGrip) {
          m.Result = (IntPtr)17; // HTBOTTOMRIGHT
          return;
        }
      }
      base.WndProc(ref m);
    }
  }

Взял со Stackoverflow. Вообще большинство вопросов хорошо гуглится на английском меньше чем за минуту. Первая ссылка по запросу c# resize form without border.
Ответ написан
Комментировать
@dmitryKovalskiy
программист средней руки
Изучайте свойства формы, которую вы создаете. Должно быть что-то с названием Resize или Vertical/Horizontal.
Ответ написан
Комментировать
@igor1603
Давно хотел применять в своих приложениях что-то подобное, но вот win32 как-то все не удается освоить...
И вот думаю: "Надо же когда-то начинать..." Пошел в Build desktop Windows apps using the Win32 API, потом в WM_NCHITTEST message... но это же бездна! И чтобы успокоиться, хоть какой-то прок поиметь и не забыть через месяц, взял за основу пример ответа, налепил на него то, что нашел и объяснил - как понял:
public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            this.FormBorderStyle = FormBorderStyle.None;
            this.DoubleBuffered = true;
            this.SetStyle(ControlStyles.ResizeRedraw, true);
        }

        // Внутри клиентской области окна создаем витруальную изменяемую рамку окна. 
        // Она состоит из 6 функциональных областей: заголовка, верхней, нижней, левой, правой рамок 
        // и области в правом нижнем углу, перетаскивание которой изменяет размеры окна по диагонали
        private const int ВысотаЗаголовка = 32;   
        private const int ВысотаВерхнейРамки = 5;
        private const int ВысотаНижнейРамки = 5; 
        private const int ШиринаПравойРамки = 5; 
        private const int ШиринаЛевойРамки = 5; 
        private const int СторонаКвадратаВПравомНижнемУглу = 16;

        protected override void OnPaint(PaintEventArgs e)
        {
            // Рисуем пиктограмму ручки изменения размеров окна по диагонали
            Rectangle rc = new Rectangle(ClientSize.Width - СторонаКвадратаВПравомНижнемУглу, 
                                         ClientSize.Height - СторонаКвадратаВПравомНижнемУглу, 
                                         СторонаКвадратаВПравомНижнемУглу, 
                                         СторонаКвадратаВПравомНижнемУглу);
            ControlPaint.DrawSizeGrip(e.Graphics, BackColor, rc);

            // Раскрашиваем заголовок
            //rc = new Rectangle(0, 0, this.ClientSize.Width, ВысотаЗаголовка);
            //e.Graphics.FillRectangle(Brushes.DarkBlue, rc);
        }
        protected override void WndProc(ref Message m)
        {
            if (m.Msg == 0x84) {  // Trap WM_NCHITTEST
                // Рассчитываем координаты курсора относительно клиентской области окна
                Point pos = new Point(m.LParam.ToInt32() & 0xffff, m.LParam.ToInt32() >> 16);
                pos = this.PointToClient(pos);
                // Назначаем нашу функциональность области окна в которой находится курсор
                // с тем, чтобы вызвавший произвел с окном соответствующие этой функциональности действия
                if (pos.Y <= ВысотаЗаголовка && pos.Y >= ВысотаВерхнейРамки) {
                    m.Result = (IntPtr)2;  // HTCAPTION - курсор в заголовке окна
                    return;
                }
                if (pos.Y <= ВысотаВерхнейРамки) {
                    m.Result = (IntPtr)12;  // HTTOP - курсор в верхней горизонтальной рамке окна
                    return;
                }
                if (pos.Y >= ClientSize.Height - ВысотаНижнейРамки && 
                    pos.X < ClientSize.Width - СторонаКвадратаВПравомНижнемУглу) {
                    m.Result = (IntPtr)15;  // HTBOTTOM - курсор в нижней горизонтальной рамке окна
                    return;
                }
                if (pos.X >= ClientSize.Width - ШиринаПравойРамки &&
                    pos.Y < ClientSize.Height - СторонаКвадратаВПравомНижнемУглу) {
                    m.Result = (IntPtr)11;  // HTRIGHT - курсор в правой вертикальной рамке окна
                    return;
                }
                if (pos.X <= ШиринаЛевойРамки) {
                    m.Result = (IntPtr)10;  // HTLEFT - курсор в левой вертикальной рамке окна
                    return;
                }
                if (pos.X >= ClientSize.Width - СторонаКвадратаВПравомНижнемУглу && 
                    pos.Y >= ClientSize.Height - СторонаКвадратаВПравомНижнемУглу) {
                    m.Result = (IntPtr)17; // HTBOTTOMRIGHT - курсор в пиктограмме ручки изменения размера окна по диагонали
                    return;
                }
            }
            base.WndProc(ref m);
        }
    }
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы