【问题标题】:How to get a screen capture of a .Net WinForms control programmatically?如何以编程方式获取 .Net WinForms 控件的屏幕截图?
【发布时间】:2010-09-20 22:26:39
【问题描述】:

如何以编程方式获取 .Net 控件的图片?

【问题讨论】:

  • 这有点太模糊了,试着解释一下你想做什么。不要在投票中徘徊。
  • 没有闲逛?我认为意思很清楚。他想获得一个控件的位图表示。
  • 我同意威尔的观点。这是一个简单明了的问题。
  • 我希望你不介意我稍微改写了这个问题。这是一个很好的问题,Will 的回答也很好。

标签: c# .net image winforms capture


【解决方案1】:

每个控件都有一个名为DrawToBitmap 的方法。您无需 p/invoke 即可执行此操作。

Control c = new TextBox();
System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(c.Width, c.Height);
c.DrawToBitmap(bmp, c.ClientRectangle);

【讨论】:

    【解决方案2】:

    对于支持它的WinForms控件,System.Windows.Forms.Control类中有一个方法:

    public void DrawToBitmap(Bitmap bitmap, Rectangle targetBounds);
    

    但是,这不适用于所有控件。第三方组件供应商有更全面的解决方案。

    【讨论】:

      【解决方案3】:

      您可以使用从 .NET 2.0 开始的 Control 类的 DrawToBitmap 方法以编程方式轻松获取 .NET 控件的图片

      这是VB中的一个示例

          Dim formImage As New Bitmap("C:\File.bmp")
          Me.DrawToBitmap(formImage, Me.Bounds)
      

      这里是 C#:

       Bitmap formImage = New Bitmap("C:\File.bmp")
       this.DrawToBitmap(formImage, this.Bounds)
      

      【讨论】:

        【解决方案4】:

        如果它不在您想要做的控件上,您通常可以将其转换为基本 Control 类并在那里调用 DrawToBitmap 方法。

        【讨论】:

          【解决方案5】:

          Control.DrawToBitmap 可以让您将大多数控件绘制到位图上。这不适用于 RichTextBox 和其他一些。

          如果您想捕获这些或具有其中之一的控件,那么您需要像此 CodeProject 文章中所述执行 PInvoke:Image Capture

          请注意,其中一些方法会捕获屏幕上的任何内容,因此如果您有另一个窗口覆盖您的控件,您将获得它。

          【讨论】:

          • 对于 WebBrowser,我只是投射到 Control 并在那里调用它。我已经做到了,并且知道它有效。不确定 RichTextBox
          【解决方案6】:
          Panel1.Dock = DockStyle.None ' If Panel Dockstyle is in Fill mode
          Panel1.Width = 5000  ' Original Size without scrollbar
          Panel1.Height = 5000 ' Original Size without scrollbar
          
          Dim bmp As New Bitmap(Me.Panel1.Width, Me.Panel1.Height)
          Me.Panel1.DrawToBitmap(bmp, New Rectangle(0, 0, Me.Panel1.Width, Me.Panel1.Height))
          'Me.Panel1.DrawToBitmap(bmp, Panel1.ClientRectangle)
          bmp.Save("C:\panel.jpg", System.Drawing.Imaging.ImageFormat.Jpeg)
          
          Panel1.Dock = DockStyle.Fill
          

          注意:它工作正常

          【讨论】:

            【解决方案7】:

            这是整个Form的做法,而不仅仅是客户区(没有标题栏和其他装饰)

                    Rectangle r = this.Bounds;
                    r.Offset(-r.X,-r.Y);
                    Bitmap bitmap = new Bitmap(r.Width,r.Height);
                    this.DrawToBitmap(bitmap, r);
                    Clipboard.SetImage(bitmap);
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2011-04-06
              • 1970-01-01
              • 2017-11-15
              • 1970-01-01
              • 1970-01-01
              • 2016-03-18
              • 2011-01-13
              相关资源
              最近更新 更多