【问题标题】:How to create a non rectangular window form in c#?如何在 C# 中创建一个非矩形窗口窗体?
【发布时间】:2011-03-26 20:53:16
【问题描述】:

有没有办法在c#或.net中创建非矩形窗口形式,例如圆形或椭圆形?
我看到了这些独特的窗户形状,在我见过的几个装置中它们看起来非常整洁。

另外,将这种设计用于非标准形式,如可持续性、崩溃等有什么缺点吗?

【问题讨论】:

  • 这将如何改进您的应用程序?
  • 我猜想,以类似的方式,好的设计和图形可以改进任何应用程序。
  • 好的设计要求不使用圆形窗口。
  • @David 不一定。也许他想在屏幕上显示一个应该是圆形的时钟,并且没有理由占用更多的空间。或者,也许他想创建一个带圆角的矩形(顺便说一句,在 Windows XP 中,所有表格都有圆角)。请注意,即使是 Visual Studio 的欢迎屏幕,在加载时也有一个非常非标准的区域。

标签: c# .net winforms


【解决方案1】:

Form 具有 Region 属性,您可以在其中分配您创建的任何形状。 例如要创建椭圆形表单,您可以在Form1_Load() 表单方法中使用此代码:

 var path = new GraphicsPath();

 path.AddEllipse(0, 0, Width, Height);
 Region = new Region(path);

风险在于,当您创建非矩形表单并关闭时,最小化按钮会被区域截断,那么一些最终用户可能会在关闭您的应用程序时遇到问题。

【讨论】:

  • 注意:GraphicsPathRegion 都实现了IDisposable
【解决方案2】:

我曾使用过类似的东西。您可以覆盖OnPaint 方法。像这样的:

protected override void OnPaint( System.Windows.Forms.PaintEventArgs e )
{
    GraphicsPath wantedshape = new GraphicsPath();
    wantedshape.AddEllipse(0, 0, this.Width, this.Height);
    this.Region = new Region(wantedshape);
}

并将FormBorderStyle 属性设置为FormBorderStyle.None

而且使用非标准表格没有风险。只需创建用户想要的应用程序。 :)

【讨论】:

  • 不应该是wantedshape 而不是shape.AddEllipse(0, 0, this.Width, this.Height); 中的shape 吗?感谢您的回答!
  • 是的,它应该是想要的形状,我想让代码更容易理解。我会改变的。
【解决方案3】:

最简单的方法是制作一个没有边框和透明背景的窗口,并使用图像来定义实际形状。或者,您可以使用定义形状的自定义 Region 创建一个窗口。

【讨论】:

    【解决方案4】:

    使用region。您可以通过设置其 Region 属性使任何 Windows 窗体控件具有任何形状。区域可以是矩形、椭圆、多种形状的组合,甚至可以从位图生成。

    【讨论】:

      【解决方案5】:
      objGP = new System.Drawing.Drawing2D.GraphicsPath();
      
      objGP.AddEllipse(new Rectangle(0, 0, Width, Height));
      Region = new Region(objGP);
      
      var formGraphics  = CreateGraphics();
      string drawString = DtDaysRemaining;
      var drawFont  = new Font("Arial", 20);
      var drawBrush = new SolidBrush(Color.Black);
      
      float x = 20, y = 20;
      
      var drawFormat = new StringFormat();
      formGraphics.DrawString(drawString, drawFont, drawBrush, x, y, drawFormat);
      
      drawFont.Dispose();
      drawBrush.Dispose();
      formGraphics.Dispose();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-20
        • 1970-01-01
        相关资源
        最近更新 更多