利用C#更专业的实现运行时调整控件大小和位置

本文介绍了如何利用C#在运行时实现控件大小和位置的调整,通过自定义控件CRectControl,捕获鼠标事件,动态修改控件的location和size属性,提供类似Visual Studio的调整体验。文章详细讲解了CRectControl的创建、绘制过程及其与子控件的关系,以及鼠标移动和点击事件的处理,帮助开发者生成动态的报表或窗体布局。
摘要由CSDN通过智能技术生成
        Delphi VB 到现在的 Visual Studio .Net 可视化的控件式编程越来越简化我们的开发过程,对于控件的可视化操作必不可少。在 Visual Studio .Net IDE 中开发桌面应用程序时我们可以在设计时从控件工具栏拖拽若干个控件放置到窗体上,随意移动和调整控件大小,稍加布置后我们就会得到一个非常满意的 UI 。若是运行时也能够移动和调整控件则会给我们带来更多的好处,譬如在 .Net 下运行时拖动控件可以应用于自定义窗体打印,这样就能动态的更改窗体上的控件布局和大小,打印出更加美观的报表来。本文就将利用 C# 演示在运行时显示一个操作边框利用它来拖动和调整控件,程序运行界面如下:
bb bb

一、技术要点

运行时调整控件大小和位置很简单,在.Net下只需修改控件的locationsize属性即可,动态调整时再捕获MouseDownMouseMoveMouseUp事件来实时修改上述两个属性就可以实现。但是我们会发现在Visual Studio.Net的开发环境中设计窗体布局时,选择了控件后总会有一个可以调整其大小和位置的边框出现以方便用户进行操作。在VC6MFC曾经为我们提供了CRectTracker类来完成这项工作,但是C#里我却没有发现相关类。运行时可以调整控件位置和大小在某些情况下非常有用,譬如.Net提供了窗体打印功能,若能够在运行时调整控件大小和位置我们将会动态的生成非常漂亮和规整的报表来。借鉴CRectTracker类我们发现它实际上就相当于一个父控件,然后传递给它不同类的指针进行附着。在C#下我们以另外一种思维来考虑这个问题,当在设计时的窗体上放置一个Panel控件,然后再往该Panel控件上放置一个子控件并填充之,那么在设计时调整Panel大小和位置时其子控件都会随之改变,我们就利用这个原理在运行时捕获获得焦点的子控件,然后让其成为类似于前述Panel父控件的子控件,并且在父控件周围利用.Net GDI+画上用于调整的边框和锚点,当鼠标在特定位置按下并拖动时激活MouseMove事件进行响应。实现的关键就是针对于类似Panel控件的操作,直接使用Panel控件进行上述操作也未尝不可,但是我们将会创建一个专门用于运行时动态调整控件大小和位置的自定义控件,我们把它命名为:CRectControl

二、程序实现

启动Visual Studio .Net 2005,首先创建C#类库。要想创建一个可以包容其它控件的容器控件,那么控件基类必须从System.Windows.Forms.UserControl继承,代码如下:

public class CRectControl : System.Windows.Forms.UserControl

{

……

}

    新建类库时默认引用不包括System.Windows.FormsSystem.Drawing,我们必须手动将上述程序集添加到项目引用中。System.Windows.Forms为我们提供了丰富的创建界面的功能和方法,System.Drawing 提供了对 GDI+ 基本图形功能的访问,我们还需要导入 System.Drawing.Drawing2D ,该命名空间 提供高级的二维和矢量图形功能,代码如下:

using System;

using System.Drawing;

using System.Windows.Forms;

using System.Drawing.Drawing2D;

CRectControl创建时传递需要调整的控件实例,根据控件大小及位置手动绘制CRectControl的边框,包括8个用于调整大小的锚点都是需要手动绘制的,代码如下:

public Rectangle Rect

{

    get { return baseRect; }

    set

    {

        int X = Square.Width;

        int

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值