用C#创建可拖动窗体

王朝c#·作者佚名  2006-12-17
窄屏简体版  字體:   |    |    |  超大  

用C#创建可拖动窗体

(注:本文期望的读者是那些有一定用C#开发Windows程序基础但暂时还不会制作可拖动窗体的朋友。)

首先,我们来复习一下一个Windows窗体的组成。请看这张图:

图1 Windows窗体构成

这是一个形式化的标准Windows窗体。首先,窗体的顶部是一个标题栏,其余的部分是窗体的主体,包围在窗体主体外围的是一个边框,边框内不就是我们放置控件或绘制图形的用户区。

图中还标明了各种窗体构造元素的尺寸的获得方法。对于用户区,

接下来,我们来看看如何在在用户区拖动鼠标时移动窗体。请看下面这张图:

图2 窗体的移动

我们来观察鼠标在窗体内的位置和窗体的移动,很容易可以发现:在窗体被拖动的过程中,鼠标在窗体内的相对位置是始终不变的!那么,我们只要检测到鼠标在屏幕中的移动并修改窗体的位置就可以达到拖动窗体的目的!

我们知道,在鼠标消息/事件处理中,只能得到鼠标相对于窗体的位置。那么,如何知道鼠标在屏幕中的位置呢?这里又要提到一个类:

知道了如何获取这些信息之后,制作移动窗体实际上就成了一个很简单的问题了。基本过程是这样的:首先,在鼠标(左键或一个你喜欢的键)按下时,记录鼠标位置;由于在移动的过程中,鼠标的屏幕坐标发生变化但窗体相对坐标不变,我们可以推算出窗体位置的变化为(假设

Form.Top = Control.MousePosition.Y - mousePosition.Y;

Form.Left = Control.MousePosition.X - mousePosition.X;

这样还不行,因为我们的

Form.Top = Control.MousePosition.Y - mousePosition.Y

- SystemInformation.FrameBorderSize.Height - SystemInformation.CaptionHeight;

Form.Left = Control.MousePosition.Y - mousePosition.Y

- SystemInformation.FrameBorderSize.Width;

也就是说,在高度上(纵坐标)要减去标题栏的高度和边框的高度,而在宽度上(横坐标)要减去边框的宽度。然而,当制作一个既没有标题栏也没有边框的可拖动窗体时,使用“示例代码1”所示的代码就可以了。

上面的代码只是一个示范性代码。具体的操作如下:

首先,为窗体添加一个私有域:

然后,为窗体添加鼠标按下事件处理方法(我这里是

if(e.Button == MouseButtons.Left) {

this.mousePosition.X = e.X;

this.mousePosition.Y = e.Y;

}

}

在这里注意对鼠标按键进行筛选。

接下来,为窗体添加鼠标移动事件处理方法(我这里是

if(e.Button == MouseButtons.Left) {

Form.Top = Control.MousePosition.Y - mousePosition.Y

- SystemInformation.FrameBorderSize.Height - SystemInformation.CaptionHeight;

Form.Left = Control.MousePosition.Y - mousePosition.Y

- SystemInformation.FrameBorderSize.Width;

}

}

这里,如果窗体没有标题栏,可以去掉“

另外赠送小技巧三则:

如何制作不规则窗体 这个技巧我掌握的还不是很丰富,现在介绍一种最简单的方法——通过设置窗体的

gp.AddEllipse(0, 0, 120, 120);

Region r = new Region(gp);

this.Region = r;

将上述代码添加到窗体的构造函数中,我们就能够得到一个自定义的窗体了,这个窗体是一个直径为120像素的圆形(也是我的时钟的外观哦)。

如何生成没有边框的窗体 将窗体的如何生成有边框但没有标题栏的窗体 首先将窗体的

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航