好记性不如烂笔头,生活、学习、工作、感悟,记于“笔下”,留于心间。任时光荏苒、世易时移,唯文字不改、记忆不散。

by:蚂蹄儿

winform将窗体或控件内容生成图片

分类:学无止境 - Winform

关键词: C#  winform  BitBlt  控件生成图片 

来源:蚂蹄儿(www.motyer.cn)

阅读:219发布时间:

  这里介绍两种如何将控件上的内容生成图片的方法,第一种就是利用Control类中的实例方法DrawToBitmap,第二种就是利用BitBlt这个Win32 API函数。

利用 DrawToBitmap

  首先来看这个函数的原型: 

public void DrawToBitmap(Bitmap bitmap, Rectangle targetBounds);


  这个函数的作用就是将控件上的内容绘制到指定的位图上面,第一个参数指定作为载体的位图,第二个参数指定将控件内容绘制到指定位图的哪个地方。凡是继承自Control类的控件均可以直接调用该方法。

利用 BitBlt  函数生成图片

  该方法还利用到了另外两个API函数 GetWindowDC,ReleaseDC ,三个函数在C#中声明如下:

[DllImport("gdi32.dll", EntryPoint = "BitBlt")]
public static extern bool BitBlt(IntPtr hdcDest, int nXDest, int nYDest, int wDest,int hDest,IntPtr hdcSource, int xSrc, int ySrc, CopyPixelOperation rop);
[DllImport("user32", EntryPoint = "GetWindowDC")]
public static extern IntPtr GetWindowDC(IntPtr hwnd);
[DllImport("user32", EntryPoint = "ReleaseDC")]
public static extern int ReleaseDC(IntPtr hwnd, IntPtr hdc);


  利用这三个方法,可以封装出一个函数:

/// <summary>
/// 绘制整个控件内容到Bitmap上。
/// </summary>
/// <param name="Control">要绘制的控件</param>
/// <returns>包含控件内容的Bitmap。</returns>
public Bitmap CreateBitmap(Control Control)
{
    IntPtr hWnd = Control.Handle;
    Bitmap bmpDrawed = new Bitmap(Control.Width, Control.Height);
    Graphics gDest = Graphics.FromImage(bmpDrawed);
    IntPtr hdcSrc = GetWindowDC(hWnd);
    IntPtr hdcDest = gDest.GetHdc();
    BitBlt(hdcDest, 0, 0, Control.Width, Control.Height, hdcSrc, 0, 0, CopyPixelOperation.SourceCopy);
    gDest.ReleaseHdc(hdcDest);
    ReleaseDC(hWnd, hdcSrc);
    return bmpDrawed;
}


实例演练

  在设计器中按如下设计:

  点击 DrawToBitmap 按钮,采用第一种方式,代码如下:

private void btnDrawToBitmap_Click(object sender, EventArgs e)
{
    var bitmap = new Bitmap(this.Width, this.Height);
    this.DrawToBitmap(bitmap, new Rectangle(0, 0, this.Width, this.Height));
    bitmap.Save(@"F:\draw_to_bitmap_test.png");
}


  生成的图片如下:

  点击 BitBlt 按钮,采用第二种方式,代码如下:




private void btnBitBlt_Click(object sender, EventArgs e)
{
    CreateBitmap(this).Save(@"F:\bitblt_test.png");
}




  可以看到,两种方法均可以实现将控件上的内容绘制到指定的位图上。但是二者又是有区的,我们清楚地看到,第二种生成的图片将窗体的 Areo 效果也绘制了,但是因此图片文件也比较大。

  对于一般控件(非窗体),可以采用第一种方法;对于窗体而言,采用第二种方式比较好。


桌面软件定制、中小型网站建设、移动APP开发请添加QQ/微信:773347113。

上一篇:

下一篇: