65.9K
CodeProject 正在变化。 阅读更多。
Home

C# Rect Tracker

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.56/5 (23投票s)

2004年11月10日

1分钟阅读

viewsIcon

165686

downloadIcon

3370

C# Rect 跟踪器(类似于 C++ 中的 CRectTracker)。

Sample image

引言

你有没有尝试过寻找 Visual Studio 用于移动和调整控件大小的对象? 我在 C# 中没有找到,但在 C++ 中找到了。 好了,这里是 C# 版本:)

背景

我正在进行的项目需要在运行时创建表单,所以我需要一个可以编辑控件的东西 - RectTracker。

在 C++ 中,有一个名为 CRectTracker 的对象,但在 C# 中没有,所以我尝试克隆它。 它不像 Visual Studio 跟踪器那样功能完善,但它可以完成在表单上调整控件大小和移动控件的任务。

方法论

它由一个 UserControl 组成,因为使用表单图形对象进行操作会产生顺序问题(一个控件会“位于”跟踪器之上),所以将其制作成一个控件本身,可以让我玩转 Z-Order 并将控件设置在最前面。

我使用了 Region 透明化来创建用于移动/调整大小的控件的位置。

使用代码

    
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();
    

控件移动

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

}
    

结论

这个 SharpRectTracker 控件是 CRectTracker 的克隆,它允许用户在运行时移动和调整表单对象(控件)的大小。 此控件可以进一步增强,以允许移动/调整多个对象的大小(使用选择)并进行可选择的调整大小(例如,对于只能更改宽度才能的对象)。

© . All rights reserved.