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

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

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

好了,我这回给大家带来的就是C#变形窗体,其实,这种事情很常见的就是,软件的美工了。一款有创意的窗体,最好不过了。

第一步当然是准备工作了

把程序中的标题栏去掉,否则整个界面将显得很不协调。当然你去掉了标题栏也就去掉了它的最大化、最小化、关闭、移动窗体等功能。为了使程序仍然具有这些功能,我们需在程序中添加一些代码,这样用户就仍然可以像以前一样和程序进行交互。 哈哈,这些属性我想大家都会设置吧。

哈哈,首先大家准备以后做那个位图文件,我的美术功底不好,自己画了一张。

`

好了,下面我们就用这张图片做一个不规则的窗体吧。

我们下面设置几个窗体的属性吧。

设置窗体的标题栏。

12

设置窗体的背景以及拉伸模式。

33

设置窗体的透明颜色

222

好了,完成了。

231这个是最简单的模式了,呵呵,用一张图片,使其中的某些颜色透明,就达到我们的目的了,好了,当然,这种窗体需要我们实现窗体的功能,比如,最大化,关闭..什么的。

添加关闭事件

211,下面,添加移动窗体的事件。

首先说一下 

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事件里面写上自己的代码。

2221

这个是文字窗体

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事件,释放拖动操作

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

好了,这个例子先到这吧,有些匆忙。哈哈。惊讶

posted @ 2011-09-19 13:36  KingDZ  阅读(1483)  评论(1编辑  收藏  举报