.NET基础示例系列之十:不规则窗体

.NET中制做不规则形状的窗体有两种方法,一种是重写onpaint函数,另一种比较简单的方法是使用不规则的图片做背景,然后设置相关的属性。这里介绍的是后者,以及使用这种方法的一些细节问题:

 

1.首先准备一张不规则的背景图片,例如一张圆角边框的图片

 

2.新建项目,将窗体FormBorderStyle设置为none,以去掉标题栏。设置BackgroundImage

 

3.设置窗体的TransparencyKey属性为图片中圆角边框之外的颜色,窗体在遇到该颜色将显示为透明

通常这种做法是OK的,运行即可看到效果

 

但是有几个值得注意的问题:

1.所使用的背景图片,圆角边框之外的颜色最好不要使用透明、白色、或黑色。举个例子,使用白色,则TransparencyKey将设置为白色,如果你的窗体上有checkbox一类的控件,你会发现你点不中小框了,因为小框的白色部分此时变为透明。透明、黑色原因相同。在下面的例子中,我用的是黄色。

 

2.如果你的显示器显示设置高于24位色,会发现TransparencyKey设置不起作用了。这是微软的一个bug,有一种解决办法是,先将背景图片添加到资源文件,然后在窗体构造时为窗体设置背景图片:

Bitmap bmp = AppResource.bg01;

bmp.MakeTransparent(Color.Yellow);

this.BackColor = Color.Yellow;

this.BackgroundImage = bmp;

this.TransparencyKey = Color.Yellow;

 

3.背景图片最好使用位图,试了试jpg,好像有问题。

 

以下是代码,包括添加鼠标事件以便可以拖动窗体:

private bool isMouseDown = false;

private Point position;

 

public MainForm()

{

    InitializeComponent();

    Bitmap bmp = AppResource.bg01;

    bmp.MakeTransparent(Color.Yellow);

    this.BackColor = Color.Yellow;

    this.BackgroundImage = bmp;

    this.TransparencyKey = Color.Yellow;

}

 

private void btnExit_Click(object sender, EventArgs e)

{

    this.Close();

}

 

private void MainForm_MouseDown(object sender, MouseEventArgs e)

{

    if (e.Button == MouseButtons.Left)

    {

        int x = -e.X;

        int y = -e.Y;

        position = new Point(x, y);

        isMouseDown = true;

    }

}

 

private void MainForm_MouseMove(object sender, MouseEventArgs e)

{

    if (isMouseDown)

    {

        Point newPosition = Control.MousePosition;

        newPosition.Offset(position);

        this.Location = newPosition;

    }

}

 

private void MainForm_MouseUp(object sender, MouseEventArgs e)

{

    if (e.Button == MouseButtons.Left)

    {

        isMouseDown = false;

    }

}

 

posted @ 2006-10-02 13:07  后厂村思维导图馆  阅读(1922)  评论(2编辑  收藏  举报