Runtime Resizable Panel Control
C#, Component Development, Win Forms August 15th, 2006Below is a complete resizable panel the can be resized on the right and bottom. It uses the windows SysCommand message and some little know options to cause the window (control) to resize.
If you want to allow moving or resizing in other directions, then extend the mouse location check and call the appropriate syscommand values.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace YourAssembly
{
public partial class ResizablePanel : Panel
{
private Boolean _ResizeParent;
private class NativeCalls
{
[DllImport("USER32.DLL", EntryPoint = "SendMessage")]
public static extern int SendMessage(IntPtr hWnd, int msg, int wParam, ref int lParam);
[DllImport("user32")]
public static extern int ReleaseCapture(IntPtr hwnd);
public const int WM_SYSCOMMAND = 0×0112;
public const int SC_DRAGMOVE = 0xF012;
public const int SC_DRAGSIZE_N = 0xF003;
public const int SC_DRAGSIZE_S = 0xF006;
public const int SC_DRAGSIZE_E = 0xF002;
public const int SC_DRAGSIZE_W = 0xF001;
public const int SC_DRAGSIZE_NW = 0xF004;
public const int SC_DRAGSIZE_NE = 0xF005;
public const int SC_DRAGSIZE_SW = 0xF007;
public const int SC_DRAGSIZE_SE = 0xF008;
}
public Boolean ResizeParent
{
get { return _ResizeParent; }
set { _ResizeParent = value; }
}
public ResizablePanel()
{
InitializeComponent();
MinimumSize = new Size(50, 50);
Margin = new Padding(0, 0, 0, 0);
Padding = new Padding(0, 0, 3, 3);
BackColor = SystemColors.ControlLight;
}
private enum MousePos {NoWhere, Right, Bottom, BottomRight}
private MousePos GetMousePos(Point location)
{
MousePos result = MousePos.NoWhere;
Rectangle TestRect;
int RightSize = Padding.Right;
int BottomSize = Padding.Bottom;
// Resize right border
TestRect = new Rectangle(Width - RightSize, 0, Width - RightSize, Height - BottomSize);
if (TestRect.Contains(location)) result = MousePos.Right;
// Resize bottom border
TestRect = new Rectangle(0, Height - BottomSize, Width - RightSize, Height);
if (TestRect.Contains(location)) result = MousePos.Bottom;
// Resize bottom Corner
TestRect = new Rectangle(Width - RightSize, Height -BottomSize, Width, Height);
if (TestRect.Contains(location)) result = MousePos.BottomRight;
return result;
}
protected override void OnMouseDown(MouseEventArgs e)
{
base.OnMouseDown(e);
IntPtr hwnd = this.Handle;
if ((ResizeParent) && (this.Parent != null) && (this.Parent.IsHandleCreated))
{
hwnd = Parent.Handle;
}
int nul = 0;
MousePos mousePos = GetMousePos(e.Location);
switch (mousePos)
{
case MousePos.Right:
{
NativeCalls.ReleaseCapture(hwnd);
NativeCalls.SendMessage(hwnd, NativeCalls.WM_SYSCOMMAND, NativeCalls.SC_DRAGSIZE_E, ref nul);
} break;
case MousePos.Bottom:
{
NativeCalls.ReleaseCapture(hwnd);
NativeCalls.SendMessage(hwnd, NativeCalls.WM_SYSCOMMAND, NativeCalls.SC_DRAGSIZE_S, ref nul);
} break;
case MousePos.BottomRight:
{
NativeCalls.ReleaseCapture(hwnd);
NativeCalls.SendMessage(hwnd, NativeCalls.WM_SYSCOMMAND, NativeCalls.SC_DRAGSIZE_SE, ref nul);
} break;
}
}
protected override void OnMouseMove(MouseEventArgs e)
{
base.OnMouseMove(e);
MousePos mousePos = GetMousePos(e.Location);
switch (mousePos)
{
case MousePos.Right: Cursor = Cursors.SizeWE; break;
case MousePos.Bottom: Cursor = Cursors.SizeNS; break;
case MousePos.BottomRight: Cursor = Cursors.SizeNWSE; break;
default: Cursor = Cursors.Default; break;
}
}
protected override void OnResize(EventArgs eventargs)
{
base.OnResize(eventargs);
if (this.Width < this.MinimumSize.Width) this.Width = this.MinimumSize.Width;
if (this.Height < this.MinimumSize.Height) this.Height = this.MinimumSize.Height;
}
protected override void OnMouseLeave(EventArgs e)
{
base.OnMouseLeave(e);
Cursor = Cursors.Default;
}
}
}
Recent Comments