当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > 使用Visual C#制作可伸缩个性化窗体
根据方位,将图片各部分命名为: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
评论 (0) All