不规则形状的窗体






4.07/5 (17投票s)
2006年1月17日
2分钟阅读

73052

3766
如何自定义窗体形状以及根据需要控制控件形状。
引言
我厌倦了标准的窗体形状。我需要根据我的需要自定义窗体形状。不仅是窗体形状,还有任何控件的形状。比如拥有圆形按钮或三角形按钮?所有这些的实现将在本文中以简单的步骤描述。首先,我将从所需的技术开始。
GraphicPath(图形路径)
应用程序使用路径来绘制形状的轮廓,填充形状的内部以及创建裁剪区域。图形引擎在世界坐标系中维护路径中几何形状的坐标。路径可以由任意数量的图形(子路径)组成。每个图形要么由一系列连接的线条和曲线组成,要么由几何形状图元组成。图形的起始点是连接的线条和曲线序列中的第一个点。结束点是序列中的最后一个点。
要求
- 命名空间:
System.Drawing.Drawing2D
区域
区域是可缩放的,因为其坐标以世界坐标指定。但是,在绘图表面上,其内部取决于表示它的像素的大小和形状。应用程序可以使用区域来限制绘图操作的输出。窗口管理器使用区域来定义窗口的绘图区域。这些区域称为裁剪区域。应用程序还可以将区域用于击中测试操作,例如检查点或矩形是否与区域相交。应用程序可以使用 Brush
对象填充区域。
用法
只需启动应用程序,右键单击以选择窗体背景。选择正确的背景后,单击并选择“绘制路径”。开始在窗体上单击以绘制路径。最后,选择“重新绘制窗体”,你将获得你想要的窗体形状。
代码
绘制路径点
private void menuItem2_Click(object sender,
System.EventArgs e)
{
Start=true;
contextMenu1.MenuItems[1].Enabled=true;
}
private void Form1_MouseDown(object sender,
System.Windows.Forms.MouseEventArgs e)
{
//===================================================
// Select the path point
if(e.Button==MouseButtons.Left)
{
g= this.CreateGraphics();
p=new Pen(Color.Black);
Point pont=new Point(0,0);
if(Start==true)
{
g.DrawArc(p,e.X,e.Y,2,2,0,360);
pont.X=e.X;
pont.Y=e.Y;
pth[PontNum++]=pont;
for(int j=PontNum;j<1000;j++)
{
pth[j]=pont;
}
}
}
}
重新绘制窗体
private void menuItem3_Click(object sender, System.EventArgs e)
{
GraphicsPath NewPth=new GraphicsPath();
NewPth.AddClosedCurve(pth);
this.Region = new Region(NewPth);
this.Invalidate();
Start=false;
contextMenu1.MenuItems[1].Enabled=false;
}
移动窗体
private void Form1_MouseDown(object sender,
System.Windows.Forms.MouseEventArgs e)
{
if(e.Button==MouseButtons.Right)
{
mov=true;
this.Cursor=Cursors.SizeAll;
x0=e.X;
y0=e.Y;
}
}
private void Form1_MouseUp(object sender,
System.Windows.Forms.MouseEventArgs e)
{
if(e.Button==MouseButtons.Right)
{
mov=false;
this.Cursor=Cursors.Default;
}
}
private void Form1_MouseMove(object sender,
System.Windows.Forms.MouseEventArgs e)
{
if(e.Button==MouseButtons.Right)
{
this.Top+=e.Y-y0;
this.Left+=e.X-x0;
}
}
结论
我认为这是一个很好的基础,可以自定义应用程序中窗体形状和其他控件的形状。更实际的使用方法就像我们为按钮所做的那样。你可以使用此代码获取你的路径点,然后在应用程序的窗体加载时将其添加进去。希望对您有所帮助。欢迎对本文提出任何意见。