Как я могу перетащить форму без полей на всю ее площадь?Как изменить размер без полей? - PullRequest
0 голосов
/ 23 декабря 2018
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;

namespace Draw_Form
{
    public partial class Form1 : Form
    {
        SolidBrush mybrush;

        public Form1()
        {
            InitializeComponent();

            mybrush = new SolidBrush(this.BackColor);

            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(mybrush, rc);
        }

        protected override void WndProc(ref Message m)
        {
            if (m.Msg == 0x84)
            {  // Trap WM_NCHITTEST
                Point pos = new Point(m.LParam.ToInt32());
                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);
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void Form1_Paint(object sender, PaintEventArgs e)
        {

        }
    }
}

Проблема в том, что я могу перетащить форму только на верхнюю маленькую панель.Но я хочу иметь возможность перетаскивать его из любого места в форме.

Вторая проблема: я не могу изменить размер формы, так как он без полей.

И последнее, как я могу сделать эту перехват?клавиши из примера Ctrl + F создадут новые экземпляры и будут каждый раз создавать новую форму, подобную этой?

Это позволило мне перетащить ее из любого места, но теперь я не могу изменить размер формы из левого нижнего угла, какдо:

protected override void WndProc(ref Message m)
        {
            switch (m.Msg)
            {
                case 0x84:
                    base.WndProc(ref m);
                    if ((int)m.Result == 0x1)
                        m.Result = (IntPtr)0x2;
                    return;
            }

            base.WndProc(ref m);
        }

1 Ответ

0 голосов
/ 23 декабря 2018

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

CustomForm.cs :

public class CustomForm : Form
{
    /// <summary>
    /// How close your cursor must be to any of the sides/corners of the form to be able to resize
    /// </summary>
    public int GrabSize = 8;

    /// <summary>
    /// The shortcut keys for this form
    /// </summary>
    public Dictionary<Keys, Action> ShortcutKeys = new Dictionary<Keys, Action>();

    private bool Drag = false;
    private Point DragOrigin;
    private const int HT_LEFT = 10;
    private const int HT_RIGHT = 11;
    private const int HT_TOP = 12;
    private const int HT_BOTTOM = 15;
    private const int HT_TOPLEFT = 13;
    private const int HT_TOPRIGHT = 14;
    private const int HT_BOTTOMLEFT = 16;
    private const int HT_BOTTOMRIGHT = 17;

    protected override void OnMouseDown(MouseEventArgs e)
    {
        base.OnMouseDown(e);

        // If hold left click on the form, then start the dragging operation
        if (e.Button == MouseButtons.Left)
        {
            // Only start dragging operation if cursor position is NOT within the resize regions
            if (e.X > GrabSize && e.X < Width - GrabSize && e.Y > GrabSize && e.Y < Height - GrabSize)
            {
                DragOrigin = e.Location;
                Drag = true;
            }
        }
    }

    protected override void OnMouseUp(MouseEventArgs e)
    {
        base.OnMouseUp(e);

        // If let go of left click while dragging the form, then stop the dragging operation
        if (e.Button == MouseButtons.Left && Drag)
            Drag = false;
    }

    protected override void OnMouseMove(MouseEventArgs e)
    {
        base.OnMouseMove(e);

        // Move the form location based on where the cursor has moved relative to where the cursor position was when we first started the dragging operation
        if (Drag)
            Location = new Point(Location.X + (e.Location.X - DragOrigin.X), Location.Y + (e.Location.Y - DragOrigin.Y));
    }

    /// <summary>
    /// Invokes any shortcut keys that have been added to this form
    /// </summary>
    protected override bool ProcessCmdKey(ref Message msg, Keys key)
    {
        Action action;
        if(ShortcutKeys.TryGetValue(key, out action))
        {
            action.Invoke();
            return true;
        }
        return base.ProcessCmdKey(ref msg, key);
    }

    /// <summary>
    /// Handles resizing of a borderless control/winform
    /// </summary>
    protected override void WndProc(ref Message m)
    {
        base.WndProc(ref m);
        if(FormBorderStyle == FormBorderStyle.None && m.Msg == 0x84)
        {
            Point CursorLocation = PointToClient(new Point(m.LParam.ToInt32()));
            if (CursorLocation.X <= GrabSize)
            {
                if (CursorLocation.Y <= GrabSize) // TOP LEFT
                    m.Result = new IntPtr(HT_TOPLEFT);
                else if (CursorLocation.Y >= ClientSize.Height - GrabSize) // BOTTOM LEFT
                    m.Result = new IntPtr(HT_BOTTOMLEFT);
                else
                    m.Result = new IntPtr(HT_LEFT); // RESIZE LEFT
            }
            else if (CursorLocation.X >= ClientSize.Width - GrabSize)
            {
                if (CursorLocation.Y <= GrabSize)
                    m.Result = new IntPtr(HT_TOPRIGHT); // RESIZE TOP RIGHT
                else if (CursorLocation.Y >= ClientSize.Height - GrabSize)
                    m.Result = new IntPtr(HT_BOTTOMRIGHT); // RESIZE BOTTOM RIGHT
                else
                    m.Result = new IntPtr(HT_RIGHT); // RESIZE RIGHT
            }
            else if (CursorLocation.Y <= GrabSize)
                m.Result = new IntPtr(HT_TOP); // RESIZE TOP
            else if (CursorLocation.Y >= ClientSize.Height - GrabSize)
                m.Result = new IntPtr(HT_BOTTOM); // RESIZE BOTTOM
        }
    }
}

Чтобы использовать этот класс, просто сделайте ваши формы наследуемыми от CustomFormа не Form.Вы можете добавить сочетания клавиш в форму, добавив в словарь сочетаний клавиш CustomForm, например, ShortcutKeys.Add(key, action);, где key - это System.Windows.Forms.Keys , а action - Action Delegate .

В вашем случае ваш код будет выглядеть примерно так:

public partial class Form1 : CustomForm
{
    SolidBrush mybrush;
    private const int cGrip = 16;      // Grip size
    private const int cCaption = 32;   // Caption bar height

    public Form1()
    {
        InitializeComponent();

        mybrush = new SolidBrush(this.BackColor);

        // Adds a new shortcut key that will invoke CreateNewForm every time Ctrl+F is pressed
        ShortcutKeys.Add(Keys.Control | Keys.F, CreateNewForm);

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

    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(mybrush, rc);
    }

    private void Form1_Load(object sender, EventArgs e)
    {

    }

    private void Form1_Paint(object sender, PaintEventArgs e)
    {

    }

    /// <summary>
    /// Create a new instance of this form
    /// </summary>
    private void CreateNewForm()
    {
        new Form1().Show();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...