运行时调整控件大小的一个简单技巧
本文介绍了一种简单的方法来在运行时调整控件的大小。
摘要
本文介绍了一种简单的方法来在运行时调整控件的大小。它包含了即用型源代码和一个完整的示例演示应用程序。我们还将讨论 C# 扩展方法。
引言
在我的一个应用程序中,我需要一个可以运行时调整大小的控件。就像 MS Paint 中的画布一样,您可以在宿主窗口内调整它的大小。在网上快速搜索后,我注意到大多数解决方案都将这个简单的问题视为一个难题。一个“复杂实现”的例子可以在 EE Solution 中找到,这里。
使用 SendMessage
是一种直观的诱惑。我们可以尝试我在上一篇文章中描述的拖动窗体的方法——我们只需将鼠标移动传播到宿主窗体的标题栏。然而,调整大小消息的参数分布在八个方向,您需要计算每个方向的差值才能使其正常工作。这就是为什么代码往往会变得如此庞大的原因。
将 PictureBox 用作装饰
当一个控件可以运行时调整大小时,您肯定希望向用户提供一些视觉指示。您可以使用图形函数在控件上手动绘制一个“边缘”,并在鼠标移入控件边缘范围时手动更改光标类型。不难想象,需要大量的源代码才能使其平稳运行。我宁愿简单地使用一些控件组件来实现该功能。我的实现很简单
- 将三个
PictureBox
控件放置到您想要调整大小的目标控件中。 - 将一个 PictureBox 放置到目标控件的右边缘。它的高度应设置为目标控件的高度减去 3。并将其锚定样式设置为顶部、底部、右侧。
- 将第二个 PictureBox 放置到目标控件的底部边缘。它的宽度应设置为目标控件的宽度减去 3。并将其锚定样式设置为左侧、右侧、底部。
- 将第三个 PictureBox 放置到目标控件的右下角。其宽度和高度都应设置为 3。将其锚定样式设置为右侧、底部。
- 最后,订阅每个
PictureBox
的MouseMove
事件。将以下代码添加到事件处理程序中
if (e.Button == System.Windows.Forms.MouseButtons.Left)
{
controltobeResized.Width += e.X;
controltobeResized.Height += e.Y;
if (controltobeResized.Width < decoration)
{
controltobeResized.Width = decoration;
}
if (controltobeResized.Height < decoration)
{
controltobeResized.Height = decoration;
}
}
现在在运行时,当您将鼠标移到 PictureBox 上时,光标的形状会相应地改变。因此,这就是您的可见用户反馈。按下鼠标左键开始调整控件的大小。实际实现比听起来要容易(请参阅附件代码)。
重用代码
生活是美好的,而且可以变得更好。我将上述操作放在一个名为 TCResize
的单独类中,该类当然包含三个 PictureBox 和它们的事件钩子。您需要做的就是将该类包含在您的项目中,并添加一行代码以目标控件作为参数创建一个实例
TCResize resizabletreeView = new TCResize(this.treeView1);
TCResize
类源代码已附上。
扩展方法
在我的应用程序中,我需要知道目标控件的确切大小。由于装饰性 PictureBox 占用了目标控件的一小部分边缘区域,每次我请求尺寸信息时,都需要排除装饰组件的尺寸。在 C# 3.0(Visual Studio 2008)之前,您可能必须派生一个类来重写内置方法。然后它肯定会破坏简洁的重用方式。幸运的是,扩展方法的概念(在 C# 2.0 中引入,并在 C# 3.0 中得到完全支持)为扩展“旧”类的行为提供了极大的灵活性。
扩展方法的语法在互联网上广泛介绍。简而言之,您需要将其声明在一个顶级静态类中作为静态方法。使用 this
关键字前缀传递到方法的参数类型。简而言之:您可以扩展基类,所有派生类都会自动获取这些方法。最棒的是,您可以通过扩展它们的共同基类来同时改进所有派生类!
因此,我们向基类 Control
添加了一些 get 和 set 方法。以下代码片段是一个示例方法。扩展属性尚未得到支持。
public static int GetClientWidth(this Control theControl)
{
return theControl.Width - TCResize.Decoration;
}
扩展主题
附件中还有一个示例应用程序TCPaint.exe(在 .NET Framework 3.5 上运行)。它是为了演示已发布和即将发布的几个技巧而开发的。我最初只是想创建一个像 Windows mspaint.exe 这样真正简单的东西。经过几周的工作,它已经发展成为一个提供无限撤销和重做步骤、以及笔触编辑和屏幕截图的应用程序。开发工作仍在进行中。错误和疏漏是不可避免的。它只是附上,以在真实应用程序中展示缩放技巧。在画布上绘制形状后,您可以拖动一个圆点(句柄)来调整形状。还有 PictureBox。:) 对于 TCPaint 程序应该发展到哪里,任何评论都将受到热烈欢迎。
致谢
本文最初发表在 EE。EE 页面编辑器 DanRollins 对一些语法问题进行了重大修改。我想感谢他。