-1
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)
        {

        }
    }
}

The problem is that I can drag the form only on it's top small bar area. But I want to be able to drag it from every place on the form.

Second problem I can't rsize the form since he is borderless.

And last how can I make that hooking a keys from example Ctrl+F will make new instances and will create each time a new form like this ?

This let me drag it from anywhere but now I can't resize the form from the left bottom corner like before:

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);
        }
Dubi Duboni
  • 813
  • 2
  • 17
  • 33
  • [this](https://stackoverflow.com/questions/1592876/make-a-borderless-form-movable) should help you – styx Dec 23 '18 at 11:58
  • https://stackoverflow.com/questions/2575216/how-to-move-and-resize-a-form-without-a-border/2575452#2575452 – Hans Passant Dec 23 '18 at 12:10
  • 1
    All these questions have been answered here multiple times. Always google before asking here!!! – TaW Dec 23 '18 at 12:13
  • So far none of them is working like I wanted. I want it to be borderless and moveable from any of the form area. Hans link can drag the form but only from the top small part bar. And in my code in my question I can drag the form from any area of the form but then can't resize. All the answers are either this or this. Can't make it moveable from any of the form area and also resizeable. – Dubi Duboni Dec 23 '18 at 12:21
  • 1
    You just need to handle the Form's MouseDown, MouseMove and MouseUp events, then. In the MouseDown event, store the current Mouse pointer position, in MouseMove event compare it with current and set the Form's position, in the MouseUp event, re-set the starting point value. – Jimi Dec 23 '18 at 15:14

1 Answers1

2

I have created a fairly simple class for you that will do everything you need. You can create shortcut keys, resize the form even if it does not have a border, and you can move it by clicking and dragging on any point inside the form. Hope this helps, I did my best to explain the code in the comments. If you need any more clarification just let me know!

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
        }
    }
}

To use this class, simply make your forms inherit from CustomForm rather then Form. You can add shortcut keys to the form by adding to the CustomForm's shortcut key dictionary like so: ShortcutKeys.Add(key, action); where key is a System.Windows.Forms.Keys, and action is an Action Delegate.

In your case, your code would look something similar to:

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();
    }
}
tottaka
  • 111
  • 2
  • 2
    Good answer. Just remember to Dispose of `mybrush` `OnFormClosed`. If the Form is opened/closed many time in the lifetime of the app, that's going to be a problem. You could also simply have `using (Brush mybrush = new SolidBrush()) { }` in the `OnPaint` event (this will also come in handy if the referenced color changes for some reason) – Jimi Dec 23 '18 at 23:04