详解使用C#制作不规则窗体的方法
5、为窗体的Load事件编写程序
双击窗体,程序默认是为窗体的Load事件添加处理程序,然后在光标处书写下面的代码:
BitmapRegion BitmapRegion = new BitmapRegion();//此为生成不规则窗体和控件的类
BitmapRegion.CreateControlRegion(this, new Bitmap("xyt.bmp"));
6、使窗体能够最大化、最小化和关闭
在程序相应位置添加三个按钮控件,主要是为了实现最大化、最小化和关闭功能,并且将三个按钮的文本分别设置为“口,—,X”,或者自己使用比较漂亮的图片按钮会更好,如果你借用按钮的鼠标滑过、按下、放下等事件实现更高级的效果那会更炫。
(1)双击最大化按钮,程序自动添加按钮的单击事件处理程序,编写代码如下:
if (this.WindowState == FormWindowState.Maximized)//如果已经最大化
this.WindowState = FormWindowState.Normal;//窗口正常大小
else
this.WindowState = FormWindowState.Maximized; //窗口最大化
(2)用同样的方法为最小化按钮添加如下程序代码:
this.WindowState = FormWindowState.Minimized;//窗口最小化
(3)用同样的方法为关闭按钮添加如下程序代码:
this.Close();
7、实现窗体的拖拽功能
首先为该窗体添加两个成员变量:双击窗体界面,找到如下代码:
public Form1()
{
InitializeComponent();
}
在该代码前添加如下两个变量成员:
private Point mouseOffset; //记录鼠标指针的坐标
private bool isMouseDown = false; //记录鼠标按键是否按下
回到设计界面,在右侧属性窗口中找到事件图标(类似闪电的图标),单击该按钮,转换到窗体的事件界面,接下来为其添加相关事件处理程序。
(1)找到MouseDown事件,双击该事件,在光标处添加如下代码:
int xOffset;
int yOffset;
if (e.Button == MouseButtons.Left)
{
xOffset = -e.X - SystemInformation.FrameBorderSize.Width;
yOffset = -e.Y - SystemInformation.CaptionHeight - SystemInformation.FrameBorderSize.Height;
mouseOffset = new Point(xOffset, yOffset);
isMouseDown = true;
}
(2)找到MouseMove事件,双击该事件后,为其添加如下代码:
if (isMouseDown)
{
Point mousePos = Control.MousePosition;
mousePos.Offset(mouseOffset.X, mouseOffset.Y);
Location = mousePos;
}
(3)找到MouseUp事件,双击该事件后为其添加如下代码:
// 修改鼠标状态isMouseDown的值
// 确保只有鼠标左键按下并移动时,才移动窗体
if (e.Button == MouseButtons.Left)
{
isMouseDown = false;
}
8、程序运行效果
按下F5键就可以看一下程序的运行效果了,本例的运行效果如下所示:
9、本方法的优劣势
使用此方法制作的不规则窗体,相对API来说编写的代码较少,对于复杂的不规则窗体来说较好,但是执行效率较低,应为程序运行起来后,他调用BitmapRegion类的相关方法把你设置的底色一点点的去掉,因此速度相对较慢,如果机器运行较慢的话,会看到这个过程。
10、说明
本文在撰写过程中参考了网上的相关内容,在此表示感谢。
本例源代码下载:点击下载此文件
本文源自:翔宇亭——IT乐园(http://www.biye5u.com),转载请保留此信息!
微信搜索“优雅的代码”关注本站的公众号,或直接使用微信扫描下面二维码关注本站公众号,以获取最新内容。
个人成长离不开各位的关注,你的关注就是我继续前行的动力。
评论内容只代表网友观点,与本站立场无关!
[回复] 6 楼 11 打分:100分 发表时间:2011-11-21
· good
[回复] 5 楼 Oldtiger 打分:100分 发表时间:2010-10-27
· 刚刚测试,在2008下可以运行,效果也还不错,只是除了速度慢之外,边界也比较粗糙,有些地方好像未能完全透明
[回复] 4 楼 admin 打分:100分 发表时间:2010-08-20
· 回复 2 楼(wenwen):给出的是VS2005中的例子,所以在2003下无法运行,你要做适当转换修改。
[回复] 3 楼 常州议事 打分:85分 发表时间:2010-08-18
· 运行速度有点慢
[回复] 2 楼 wenwen 打分:85分 发表时间:2010-08-17
· 你给的那个源代码好像有点问题,在2003中无法运行啊
[回复] 1 楼 bucuo 打分:100分 发表时间:2010-08-16
· 哈哈,创建的那个类的问题终于知道了,
比网上的要详细,谢谢啦。