KingDZ 变菜鸟,每日一个C#小实例之---C#变形窗体
这个问题可能是很古老的问题了,我之所以写一下,是因为需要整理一下相关资料,对于老鸟来说,创建一个不规则的窗体,确实是小菜一碟,可是这个问题对于一些新手来说,不得不是一个很有意思的话题。
我打算写的小实例中,怎么可以少了这个很有意思的实例呢,还请老鸟不要对偶滴文章拍砖啊,哈哈,新手朋友们,只有不断积累自己很小的实例,才可以在自己的编程之力,越走越远。
好了,我这回给大家带来的就是C#变形窗体,其实,这种事情很常见的就是,软件的美工了。一款有创意的窗体,最好不过了。
第一步当然是准备工作了
把程序中的标题栏去掉,否则整个界面将显得很不协调。当然你去掉了标题栏也就去掉了它的最大化、最小化、关闭、移动窗体等功能。为了使程序仍然具有这些功能,我们需在程序中添加一些代码,这样用户就仍然可以像以前一样和程序进行交互。 哈哈,这些属性我想大家都会设置吧。
哈哈,首先大家准备以后做那个位图文件,我的美术功底不好,自己画了一张。
好了,下面我们就用这张图片做一个不规则的窗体吧。
我们下面设置几个窗体的属性吧。
设置窗体的标题栏。
设置窗体的背景以及拉伸模式。
设置窗体的透明颜色
好了,完成了。
这个是最简单的模式了,呵呵,用一张图片,使其中的某些颜色透明,就达到我们的目的了,好了,当然,这种窗体需要我们实现窗体的功能,比如,最大化,关闭..什么的。
添加关闭事件
首先说一下
SystemInformation 类
提供当前系统环境的有关信息。
SystemInformation 类提供 static 属性,该属性可用于获取当前系统环境的有关信息。该类提供对信息(例如,Windows 显示元素大小、操作系统设置、网络可用性和系统上安装的硬件的功能)的访问。此类无法实例化。具体的每个成员代表什么,请参照 http://msdn.microsoft.com/zh-cn/library/system.windows.forms.systeminformation_members%28v=vs.80%29.aspx
Point mouseOffset; bool isMouseDown = false; private void Form1_MouseDown(object sender, MouseEventArgs e) { int xOffset; int yOffset; if (e.Button == MouseButtons.Left) { xOffset = -e.X - SystemInformation.FrameBorderSize.Width; yOffset = -e.Y - -SystemInformation.FrameBorderSize.Height; mouseOffset = new Point(xOffset, yOffset); isMouseDown = true; } } private void Form1_MouseMove(object sender, MouseEventArgs e) { if (isMouseDown) { Point mousePos = Control.MousePosition; mousePos.Offset(mouseOffset.X, mouseOffset.Y); Location = mousePos; } } private void Form1_MouseUp(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) isMouseDown = false; }
上面的三个事件代表了,按下鼠标,移动鼠标,释放鼠标的操作。总结起来就是网络上面常见的三步:
1.首先准备一张不规则的背景图片。
2.新建项目,将窗体FormBorderStyle设置为none,以去掉标题栏。设置BackgroundImage。
3.设置窗体的TransparencyKey属性为图片中圆角边框之外的颜色,窗体在遇到该颜色将显示为透明
通常这种做法是OK的,运行即可看到效果。
注意:
如果监视器的颜色深度设置大于 24 位,则不管 TransparencyKey 属性是如何设置的,窗体的非透明部分都会产生显示问题。
若要避免出现这种问题,请确保“显示”控制面板中的监视器颜色深度的设置小于 24 位。当开发具有这种透明功能的应用程序时,请牢记应使您的用户意识到此问题。
下面在介绍一种方式,就是自定义窗体,这个需要的就是我们自己绘制窗体了。
GraphicsPath
他的用法可以绘制我们想要的窗体
private void NewForm_Load(object sender, EventArgs e) { Bitmap image = (Bitmap)Image.FromFile(@"C:\te\1.bmp"); GraphicsPath path = new GraphicsPath(); int width = image.Width; int height = image.Height; Rectangle rect; Color tranColor = image.GetPixel(1,1); for (int i = 0; i < width-1; i++) { for (int j = 0; j < height-1; j++) { if (image.GetPixel(i, j) != tranColor) { rect = new Rectangle(i,j,1,1); path.AddRectangle(rect); } } } this.Region = new Region(path); }
当然你也可以在窗体的Paint事件里面写上自己的代码。
这个是文字窗体
private void NewForm_Paint(object sender, PaintEventArgs e) { GraphicsPath p = new GraphicsPath(); p.AddString("KingDZ", FontFamily.GenericMonospace, 0, 100f, new Point(10, 10), StringFormat.GenericDefault); this.Region = new Region(p); }
拖动不规程窗体分三个步骤:
1、响应窗体Mouse_Down事件,记录鼠标左键按下时的坐标
2、响应窗体的Mouse_Move事件,获取当前鼠标相对屏幕的坐标减去以上获得X,Y坐标,赋值给窗体Location
3、响应窗体的Mouse_Up事件,释放拖动操作
在上面的代码中,我们也已经涉及到了。
好了,这个例子先到这吧,有些匆忙。哈哈。
作者:KingDZ
出处:http://www.cnblogs.com/hihell/
关于作者:作者喜欢编程,擅长ASP.NET网站开发,喜欢MVC,SilverLight开发,喜欢交流,喜欢创新
我的QQ:860866679 MSN:wangdezhen@live.com 期待有共同志向者交流进步。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,如有问题
可以通过KingDZ's
Email 联系我,非常感谢。