您的位置:首页 > 编程语言 > C#

KingDZ 变菜鸟,每日一个C#小实例之---C#变形窗体

2011-09-19 13:36 477 查看
这个问题可能是很古老的问题了,我之所以写一下,是因为需要整理一下相关资料,对于老鸟来说,创建一个不规则的窗体,确实是小菜一碟,可是这个问题对于一些新手来说,不得不是一个很有意思的话题。

我打算写的小实例中,怎么可以少了这个很有意思的实例呢,还请老鸟不要对偶滴文章拍砖啊,哈哈,新手朋友们,只有不断积累自己很小的实例,才可以在自己的编程之力,越走越远。

好了,我这回给大家带来的就是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事件,释放拖动操作

在上面的代码中,我们也已经涉及到了。

好了,这个例子先到这吧,有些匆忙。哈哈。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: