当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > 使用Visual C#制作可伸缩个性化窗体

ASP.NET
asp.net Linq TO Sql 分页方法
asp.net 用XML生成放便扩展的自定义树
asp.ent下合并两个结构相同的DataTable
asp.net 遍历repeater中的控件的几种方式
asp.net 处理原文件中过长的viewstate代码
asp.net下遍历页面中所有的指定控件的代码
获取创建Membership的数据库创建脚本
asp.net AJAX注册类
asp.net 处理F5刷新页面重复提交页面的一个思路
ASP.NET 缓存分析和实践浅析提高运行效率
asp.net 读取并显示excel数据的实现代码
ASP.NET中常用的用来输出JS脚本的类
ASP.NET中内嵌页面代码的一个问题
asp.net(C#)操作excel(上路篇)
一个基于Asp.Net MVC的权限方案
ASP.NET实例教程:51job网站地区选择功能
ASP.NET教程:友好的Html和JS适合SEO
ASP.NET教程:使用.ashx文件去除重复内容
ASP.NET做SEO:制作架构清晰和更新及时的网站地图
ASP.NET优化:Sql注入和Html注入的黑帽SEO

ASP.NET 中的 使用Visual C#制作可伸缩个性化窗体


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-11-03   浏览: 50 ::
收藏到网摘: n/a

使用Visual C#制作可伸缩个性化窗体
卢彦 引言:谁都希望自己的应用程序能让人留下一个深刻的印象,让自己的程序窗体有一件与众不同的"外衣"是一个好办法。试想:在一大堆的普通窗口中突然跳出一个很酷的界面,一定能让人眼睛一亮进而产生兴趣的。在VB,VC中如何定制可伸缩个性化窗口早就不是什么秘密了,已经有了大量相关的文章进行介绍,无非都是如何调用系统API之类的方法,但是在.Net中调用API却相对比较麻烦,所以使用.Net制作个性化窗体的文章也有一些,一般都是使用透明背景加图片的方式,所以不能移动或者不能任意放大缩小窗体。那有没有不需要调用系统API的方法来实现可伸缩的个性化窗体的办法呢?当然有,.Net Framework提供了一套非常强大的系统类库,我们下面就要做一个使用"纯".Net打造的可伸缩个性化窗体。我们需要将窗体所有的"皮肤"全部换成我们自己定义的,包括标题栏,边框和系统按纽等,所以我们首先需要定做一套自己的皮肤图形文件。因为窗体是可伸缩的,所以我们不能简单的取一整幅图片来作为窗体皮肤,而是根据需要先将图片切割为不同的部分,一般来说,有以下图示几大部分(红线为切割线):根据方位,将图片各部分命名为:Bottom_Left,Bottom_Middle,Bottom_Right,Middle_Left,Middle_Right,Top_Left,Top_Middle,Top_Right,SysButton_Min,SysButton_Max,SysButton_Close,SysButton_Restore等。注意,有些图片是可以伸缩的地方,比如Middle_Left,Bottom_Middle等处的图片可以只是一小块,以后需要进行重复贴图。而有些固定大小的图片,比如Bottom_Left,Top_Left等以后只用贴一次,实际应用的时候要注意区分。采用以上原则,你便可以制作皮肤图片,图示如下:然后可以将这些图片放到ImageList控件或资源文件中供程序调用。(关于如何制作资源文件请参考:Visual C#资源文件编程--创建资源文件)接下来,我们使用Visual Studio .Net新建一个Windows应用程序的项目,在窗体的属性设置中,将窗体的FormBorderStyle属性设置为None(无边框样式),如下图所示:定义一个资源管理器:private ResourceManager rm ;然后使用以下的方法在Form的构造函数中将图片取出来(资源文件名为Skin.resources):rm = new ResourceManager("SkinWindow.Skin", Assembly.GetExecutingAssembly());Bottom_Left = (Bitmap)rm.GetObject("Bottom_Left");…(其它的图片也按照此方法取)重载Form的OnPaint事件:Graphics g = e.Graphics;//手工画窗体的各个部分DrawMiddle_Left(e.Graphics);//画左边框DrawBottom_Middle(e.Graphics);//画下边框DrawMiddle_Right(e.Graphics);//画右边框DrawBottom_Left(e.Graphics);//画左下角DrawBottom_Right(e.Graphics);//画右下角DrawTop_Left(e.Graphics);//画标题栏左边DrawTop_Right(e.Graphics);//画标题栏右边DrawTop_Middle(e.Graphics);//画标题栏中间DrawSys_Button(e.Graphics);//画系统按纽以下是上述画皮肤方法的具体实现部分,我只举一个画左边框的代码示例,其它的部分请读者举一返三:private void DrawMiddle_Left(Graphics g){ Brush brush = new TextureBrush(Middle_Left, new Rectangle(0, 0, Middle_Left.Width, Middle_Left.Height)); g.FillRectangle(brush, 0, TITLE_WIDTH, Middle_Left.Width, Height - Bottom_Middle.Height - TITLE_WIDTH);}衣服穿上了,现在我们的程序就有了不同的外观:看上去已经很酷了,不过只是花架子,因为边框,标题栏,系统按纽都是我们自己画上去的假的边框,标题栏和系统按纽,所以这个窗体既不能移动也不能自由的放大缩小,点关闭都没用。以前我们写程序从来都不需要关心这个的,这些都是窗体的基本功能呀?没有从来都没有想到这个竟然还会是个问题吧?怎么办呢?答案就是我们自己来做,不过会比较麻烦,因为取消掉了边框,所以Windows不会帮你发出系统事件,你捕捉不到系统发生了什么事情的话,就没有办法写下响应代码,所以我们要自己检测鼠标的坐标,并根据鼠标的动作,自己来发出事件消息,然后进行响应。首先我们先定义出一些响应事件的代码,我定义了一个抽象的基类MouseAction,用来表示所有的鼠标事件,它有一个抽象方法Action:public abstract class MouseAction{public abstract void Action(int ScreenX, int ScreenY, System.Windows.Forms.Form form);}然后再来定义出它的各个派生类来表示出具体每个鼠标事件响应的代码。下面是一个向右拉伸窗口事件的代码响应:public class MouseSizeRight : MouseAction { private int lx; public MouseSizeRight(int LocationX) { lx = Loc