65.9K
CodeProject 正在变化。 阅读更多。
Home

不规则形状的窗体

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.07/5 (17投票s)

2006年1月17日

2分钟阅读

viewsIcon

73052

downloadIcon

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;
    }
}

结论

我认为这是一个很好的基础,可以自定义应用程序中窗体形状和其他控件的形状。更实际的使用方法就像我们为按钮所做的那样。你可以使用此代码获取你的路径点,然后在应用程序的窗体加载时将其添加进去。希望对您有所帮助。欢迎对本文提出任何意见。

© . All rights reserved.