Winforms 如何使用C#将Windows窗体面板作为位图获取?

Winforms 如何使用C#将Windows窗体面板作为位图获取?,winforms,bitmap,panel,screenshot,Winforms,Bitmap,Panel,Screenshot,我有一个Windows窗体,它有一个面板,上面有几个控件。面板不占用所有的窗体空间,但只占一小部分。我想知道的是,是否有某种方法可以将面板(包含所有子控件)的显示检索为位图。就像一个截图,但只是裁剪到面板上 我没有查看屏幕截图,因为面板位于可滚动控件(DevX控件)内,所以有时它可能不完全可见,我需要它的可视表示,无论是否可见 这可能吗 编辑: 好吧,现在看来这正是我所担心的。建议使用DrawToBitmap()的解决方案仅绘制控件可见的部分。我使用DisplayRectangle来检索完整控件

我有一个Windows窗体,它有一个面板,上面有几个控件。面板不占用所有的窗体空间,但只占一小部分。我想知道的是,是否有某种方法可以将面板(包含所有子控件)的显示检索为位图。就像一个截图,但只是裁剪到面板上

我没有查看屏幕截图,因为面板位于可滚动控件(DevX控件)内,所以有时它可能不完全可见,我需要它的可视表示,无论是否可见

这可能吗

编辑:

好吧,现在看来这正是我所担心的。建议使用DrawToBitmap()的解决方案仅绘制控件可见的部分。我使用DisplayRectangle来检索完整控件的大小。矩形是正常的,现在位图是整个控件的大小,但是控件不可见的部分在位图上是透明的,不显示控件不可见部分上的控件


是否有可能完全渲染此内容?

当然,只需使用面板的DrawToBitmap()方法即可。它不是100%可靠,面板上可能有不支持它的控件。像RichTextBox、WebBrowser或某种第三方ActiveX控件

    private static Image PanelToBitmap(Control pnl) {
        var bmp = new Bitmap(pnl.Width, pnl.Height);
        pnl.DrawToBitmap(bmp, new Rectangle(0, 0, bmp.Width, bmp.Height));
        return bmp;
    }

哦,亲爱的,我以前怎么没注意到这个方法:(我想没有必要…非常感谢。我希望它能适用于所有使用的控件(主要是编辑框、复选框、组等)。再次感谢。对于非滚动表单,它工作得非常好。当使用滚动控件(DevX)时正如我在编辑中所描述的。我没有想象你希望如何将100磅的猪塞进20磅的戳中。控件是否应该能够绘制其项目,即使它们当前不在视图中?它们没有隐藏(其可见设置为false),它们在屏幕上根本不可见,因为滚动条被设置到了某个位置。或者我错过了你评论的要点了吗?@kornelijepetak:创建新位图时,尝试使用而不是
pnl.Width/Height
pnl.DisplayRectangle.Width/Height
。请参阅我对答案的评论。