首 页 网络编程
网页制作 图形图象 操作系统 冲浪宝典
软件教学 认证考试

网络安全 网络办公 行业资讯 评测对比
您当前位置:站长天空 -> 冲浪宝典-> 局域网
用C#创建可拖动窗体-.NET教程,C#语言
作者:网友供稿 点击:264
推荐
西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!可在线rar解压,自动数据恢复设置虚拟目录等.免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金
站内搜索
文章页数:[1] 
所谓“可拖动窗体”就是无需拖动标题栏就可以拖动的窗体,这在一个没有标题栏的窗体上是一种非常有用的技术。关于这一方面的技巧,网上已经有很多介绍,但都不是很详尽,有些实现也不够简洁。最主要的,这些介绍大多是大片大片的源代码,很少讲解;初学者学期来恐怕要费些力气(我在学习这个技巧的时候就很痛苦)。在这里,我对这个技巧进行了一个详细的讲解,相信各位初学者朋友可以学会如何制作可拖动窗体。

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

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


--------------------------------------------------------------------------------

图1 windows窗体构成




--------------------------------------------------------------------------------

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

图中还标明了各种窗体构造元素的尺寸的获得方法。对于用户区,system.windows.forms.form提供了实例属性clientsize,相信大家已经很熟悉了。而要想活棋一般性的窗体构造元素(如标题栏、边框等)的尺寸,我们可以使用.net类库中提供的一个类:system.windows.forms.systeminformation,这个类提供了一些静态属性如表示标题栏高度的captionheight。有关systeminformation类的信息可以在.net sdk文档目录“.net framework sdk -> 参考 -> 类库 -> system.windows.forms -> systeminformation 类”处找到(注:这里的超链接只在您安装了.net framework 1.1简体中文版并且安装了配套文档时才有效)。这是一个很有用的类,希望大家能够记住它(可能您早就知道了,可我是才知道的-_-汗~~)。

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


--------------------------------------------------------------------------------

图2 窗体的移动




--------------------------------------------------------------------------------

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

我们知道,在鼠标消息/事件处理中,只能得到鼠标相对于窗体的位置。那么,如何知道鼠标在屏幕中的位置呢?这里又要提到一个类:system.windows.forms.control类。也许你会很吃惊:这不是所有控件的基类么?呵呵~是这样di。不过,尽管是这样,control类却没有像其他广泛使用的基类那样被声明为抽象类,而且它提供了一个静态属性:mouseposition,通过这个属性可以得到鼠标相对于屏幕的位置。有关control类的信息可以在.net framework文档目录“.net framework sdk -> 参考 -> 类库 -> system.windows.forms -> control 类”处找到(注:这里的超链接只在您安装了.net framework 1.1简体中文版并且安装了配套文档时才有效)。

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

// 示例代码1
form.top = control.mouseposition.y - mouseposition.y;
form.left = control.mouseposition.x - mouseposition.x;

这样还不行,因为我们的mouseposition表示的是鼠标在窗体用户区内的相对坐标,但在移动窗体的时候还要考虑窗体标题栏和边框的尺寸。在上面的基础上,我们将代码修正为:

// 示例代码2
form.top = control.mouseposition.y - mouseposition.y
- systeminformation.framebordersize.height - systeminformation.captionheight;
form.left = control.mouseposition.y - mouseposition.y
- systeminformation.framebordersize.width;

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

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

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

private system.drawing.point mousepoint;

然后,为窗体添加鼠标按下事件处理方法(我这里是mainform_mousedown,别忘了将该方法链接到mainform.mousedown事件,这不用多说了吧?):

private void mainform_mousedown(object sender, system.windows.forms.mouseeventargs e) {
if(e.button == mousebuttons.left) {
this.mouseposition.x = e.x;
this.mouseposition.y = e.y;
}
}

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

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

private void mainform_mousemove(object sender, system.windows.forms.mouseeventargs e) {
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;
}
}

这里,如果窗体没有标题栏,可以去掉“-systeminformation.captionheight”;如果窗体没有边框,还可以去掉“-systeminformation.framebordersize.height”和“-systeminformation.framebordersize.width”。

现在,您是不是已经很清楚地明白如何用c#制作可拖动窗口了?祝贺您!最后,送您一个小礼物——桌面时钟。很简洁、很有意思哦~~~

另外赠送小技巧三则:

如何制作不规则窗体
这个技巧我掌握的还不是很丰富,现在介绍一种最简单的方法——通过设置窗体的region属性。首先,声明一个system.drawing.drawing2d.graphicspath变量,在这个变量中添加您期望作为窗体轮廓的形状组合;之后,从这个变量生成一个system.drawing.region实例,并赋给窗体的region属性即可。如:

graphicspath gp = new graphicspath();
gp.addellipse(0, 0, 120, 120);
region r = new region(gp);
this.region = r;

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

如何生成没有边框的窗体
将窗体的formborderstyle设置为none即可。这很简单事么?那么

如何生成有边框但没有标题栏的窗体
首先将窗体的controlbox属性设置为false,也就是不要控制按钮(窗体图标、最大最小化按钮和关闭按钮)。按说这时就不应该有标题栏了,但我们还能看到它很烦人地待在那里,因此,我们要把窗体的text属性设置为空(注意是string.empty,而不是null)。


文章整理:站长天空 网址:http://www.z6688.com/
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

文章页数:[1] 


放大字体显示 缩小字体显示 打印文章 推荐给朋友
热门文章
·Java串行端口技术协议-JSP教程,Java技巧及代码
·VB6中水晶报表(Crystal Report 4.6)的使用经验-.NET教程,报表/图形/Office
·一种全新的软件界面设计方法(摘)-.NET教程,Asp.Net开发
·RSA加密算法在VB中的实现-.NET教程,VB.Net语言
·ubb代码转化html代码-ASP教程,脚本编码
·用C#创建可拖动窗体-.NET教程,C#语言
·ASP技术访问WEB数据库-ASP教程,数据库相关
·浅谈基站蓄电池的维护与保养
·VB中枚举指定目录下所有文件的方法-.NET教程,评论及其它
·ADO.NET 2.0 Dataset和Datatable 新功能新特性-.NET教程,Asp.Net开发
最新文章
·解决局域网遭遇盗用mac地址上网的问题_局域网教程
·photoshop将照片处理为艺术插画特效_photoshop教程
·狂人!用日ip不到500的站一年赚了10万元_网赚技巧
·李治国:急躁公司做不了分类信息_站长访谈
·李彦宏教你创业实用的七大招_站长心得
·新站如何被百度快速的收录_站长心得
·影响搜索排名的77种因素_站长心得
·网站站长把你懂的东西卖给不懂的人,才能赚钱_站长心得
·个人站点提高访问量谋略1_站长心得
·做adsense的一些经验_google推广
相关主题
  • 用C#创建Windows(NT)服务-.NET教程,C#语言
  • 用C#创建COM对象-.NET教程,C#语言
  • 用C#创建Web应用程序-.NET教程,C#语言
  • 用C#创建Windows(NT)服务(转)-.NET教程,Windows开发
  • 用C#创建COM对象-.NET教程,Windows开发
  • 西部数码虚拟主机

    友情链接
    CNNIC 西部数码
    万网 自助建站
    虚拟主机 asp空间
    域名注册 域名
    域名申请 主页空间
    论坛空间 网站空间
    国际域名 虚拟空间
    空间租用 DDOS防火墙
    成都主机托管 四川主机托管
    主机租用 服务器租用
    网站目录 自助建站
    虚拟主机 网址大全
    软件下载
    自助链接
    虚拟主机资讯 特价虚拟主机
    版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
    关于我们:站长天空:专业提供最新的站长资讯、在线教程、虚拟主机权威评测、虚拟主机性能对比、网站制作教程,开发教程,站长工具。包括网页制作教程、冲浪宝典、编程参考、操作系统、软件教学、行业动态等。
    特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
    发表评论 打印  刷新     关闭