博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

C# Rect Tracker

Posted on 2010-10-27 08:39  gczhao  阅读(1359)  评论(0编辑  收藏  举报

本文转自http://www.codeproject.com/KB/miscctrl/CSharpRectTracker.aspx

 

Sample image

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

Collapse | Copy 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

Collapse | Copy Code
public void Mouse_Move(object sender,System.Windows.Forms.MouseEventArgs e)
    {
//minimum size for the control is 8x8
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).

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here