Introduction
Ever tried to find that object that allows Visual studio to move and resize controls?
Well, I didn't find it in C# but in C++. Well, here it is in C# :)
Background
The project I was working on required me to create forms in run-time, so I
needed something to edit controls - RectTracker.
In C++ there is an object called CRectTracker
, but in C# there isn't, so I tried
to clone it, it doesn't do what the Visual Studio Tracker does, but it does the
job on resizing and moving controls on a form.
Methodology
It's made of a UserControl
because doing it using the form graphics object
creates ordering problems (a control is "above" the tracker), so making it a
control itself, allows me to play with Z-Order and set the control to front.
I used Region Transparenting to create a place for the Control I want to
move/resize.
Using The Code
SomeControl.BringToFront();
SomeControl.Capture = false;
if(this.Controls.Contains(CSharpTracker))
this.Controls.Remove(CSharpTracker);
CSharpTracker = new RectTracker(SomeControl);
this.Controls.Add(CSharpTracker);
CSharpTracker.BringToFront();
CSharpTracker.Draw();
Control Moving
public void Mouse_Move(object sender,System.Windows.Forms.MouseEventArgs e)
{
if (currentControl.Height < 8)
{
currentControl.Height = 8;
return;
}
else if (currentControl.Width < 8)
{
currentControl.Width = 8;
return;
}
switch(this.CurrBorder)
{
case RESIZE_BORDER.RB_TOP:
currentControl.Height = currentControl.Height - e.Y + prevLeftClick.Y;
if (currentControl.Height > 8)
currentControl.Top = currentControl.Top + e.Y - prevLeftClick.Y;
break;
case RESIZE_BORDER.RB_TOPLEFT:
currentControl.Height = currentControl.Height - e.Y + prevLeftClick.Y;
if (currentControl.Height > 8)
currentControl.Top =currentControl.Top + e.Y - prevLeftClick.Y;
currentControl.Width = currentControl.Width - e.X + prevLeftClick.X;
if (currentControl.Width > 8)
currentControl.Left =currentControl.Left + e.X - prevLeftClick.X;
break;
case RESIZE_BORDER.RB_TOPRIGHT:
currentControl.Height = currentControl.Height - e.Y + prevLeftClick.Y;
if (currentControl.Height > 8)
currentControl.Top = currentControl.Top + e.Y - prevLeftClick.Y;
currentControl.Width = currentControl.Width + e.X - prevLeftClick.X;
break;
case RESIZE_BORDER.RB_RIGHT:
currentControl.Width = currentControl.Width + e.X - prevLeftClick.X;
break;
case RESIZE_BORDER.RB_BOTTOM:
currentControl.Height = currentControl.Height + e.Y - prevLeftClick.Y;
break;
case RESIZE_BORDER.RB_BOTTOMLEFT:
currentControl.Height = currentControl.Height + e.Y - prevLeftClick.Y;
currentControl.Width = currentControl.Width - e.X + prevLeftClick.X;
if (currentControl.Width > 8)
currentControl.Left = currentControl.Left + e.X - prevLeftClick.X;
break;
case RESIZE_BORDER.RB_BOTTOMRIGHT:
currentControl.Height = currentControl.Height + e.Y - prevLeftClick.Y;
currentControl.Width = currentControl.Width + e.X - prevLeftClick.X;
break;
case RESIZE_BORDER.RB_LEFT:
currentControl.Width = currentControl.Width - e.X + prevLeftClick.X;
if (currentControl.Width > 8)
currentControl.Left = currentControl.Left + e.X - prevLeftClick.X;
break;
case RESIZE_BORDER.RB_NONE:
currentControl.Location = new Point(currentControl.Location.X + e.X -
prevLeftClick.X, currentControl.Location.Y + e.Y - prevLeftClick.Y);
break;
}
}
Conclusion
This SharpRectTracker
control is a clone of the CRectTracker
, and it allows a
user to Move and Resize form objects (control) in run-time, this control can be
further enhanced to allow multiple object move/resize (using selection) and to
do selectable Resize (for an object that only the width can be changed).