我对GDI+不怎么熟悉,其实对GDI也不怎么熟悉.
目前遇到的问题是需要把winform应用程序客户区的内容保存到BMP图片中去,我知道可以新建一个与客户区一样大小的图片,然后再把客户区上的内容重新向图片里画一遍就OK了,可是那样的话当客户区的内容很多的时候就会慢了。有没有什么比较直接和快速的方法?
请各位高手指点!

解决方案 »

  1.   

    从codeproject上找到一篇解决我这个问题的文章,现在winform上的很多绘图问题看到好多人都是用gdi解决的,而不是用gdi+
      

  2.   

    private void ToBmp(Control control, string filename)
    {
    //创建显示器的DC
    IntPtr dc1 = CreateDC ( "DISPLAY" , null , null , ( IntPtr ) null ) ;
    //由一个指定设备的句柄创建一个新的Graphics对象
    Graphics g1 = Graphics.FromHdc ( dc1 ) ;
    //根据屏幕大小创建一个与之相同大小的Bitmap对象
    Bitmap MyImage = new Bitmap ( control.ClientSize.Width , control.ClientSize.Height, g1 ) ;
    //获得屏幕的句柄
    Graphics g2 = Graphics.FromImage ( MyImage ) ;
    //获得位图的句柄
    IntPtr dc3 = g1.GetHdc ( ) ;
    IntPtr dc2 = g2.GetHdc ( ) ;
    //把当前屏幕捕获到位图对象中 
    Point pos = control.PointToScreen(control.Location);
    pos.X -= control.Location.X;
    pos.Y -= control.Location.Y;
    BitBlt ( dc2 , 0 , 0 , control.ClientSize.Width , control.ClientSize.Height , dc3 , pos.X , pos.Y , 13369376 ) ;
    //释放屏幕句柄
    g1.ReleaseHdc ( dc3 ) ;
    //释放位图句柄
    g2.ReleaseHdc ( dc2 ) ;
    MyImage.Save ( filename , System.Drawing.Imaging.ImageFormat.Jpeg ) ;
    }[ System.Runtime.InteropServices.DllImportAttribute ( "gdi32.dll" ) ]
    private static extern IntPtr CreateDC (
    string lpszDriver , // 驱动名称
    string lpszDevice , // 设备名称
    string lpszOutput , // 无用,可以设定位"NULL"
    IntPtr lpInitData // 任意的打印机数据
    ) ;
    [ System.Runtime.InteropServices.DllImportAttribute ( "gdi32.dll" ) ]
    private static extern bool BitBlt (
    IntPtr hdcDest , // 目标设备的句柄
    int nXDest , // 目标对象的左上角的X坐标
    int nYDest , // 目标对象的左上角的X坐标
    int nWidth , // 目标对象的矩形的宽度
    int nHeight , // 目标对象的矩形的长度
    IntPtr hdcSrc , // 源设备的句柄
    int nXSrc , // 源对象的左上角的X坐标
    int nYSrc , // 源对象的左上角的X坐标
    System.Int32 dwRop // 光栅的操作值
    ) ;
    }
    // 测试
    private void button1_Click(object sender, System.EventArgs e)
    {
    ToBmp(button1, "c:\\button1.jpg");
    }