65.9K
CodeProject 正在变化。 阅读更多。
Home

将 DataGridView 转换为 Bitmap

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.41/5 (11投票s)

2006年10月26日

4分钟阅读

viewsIcon

99494

downloadIcon

1329

本文介绍了一种将 DataGridView 控件转换为 Bitmap 的简便方法。

引言

本文介绍了一种将 DataGridView 控件转换为 Bitmap 的简便方法。乍一看,这可能显得过于有趣,但实际上,我曾遇到过这种情况:在扩展第三方文档模型(用于 CAD 工作)时,无法将任何类型的网格控件嵌入到该专有文档格式中;然而,该文档类型允许添加位图内容。

在某个特定应用中,意图是在批处理过程中动态生成工程图,并且每张图纸都应包含材料清单。材料清单会随着批处理作业中每张图纸的生成而变化,因此,无法预先确定材料清单的内容。鉴于无法添加网格控件,也无法预先确定网格控件的内容,我选择了使用网格控件动态生成材料清单,将网格控件的内容导出为位图,然后将该位图嵌入到图纸的正确位置。

本文将介绍将网格控件转换为位图的方法。尽管本文侧重于使用 DataGridView 控件,但相同的方法也可应用于任何控件,甚至是容器,这样您就可以使用本例中应用于 DataGridView 控件的技术,将带有其包含控件的面板导出为位图。该方法基于 gdi32.dllBitBlt 函数以及 .NET 中提供的 GDI+ 功能,并且非常简单。

入门

要开始,请解压缩本文随附的示例代码和项目。在 Visual 2005 中打开解决方案,您应该会注意到该应用程序包含两个重要文件:frmMain.vbDataGrid2Bitmap.vb。解决方案中还有其他几个文件,但它们对本次讨论并不重要。frmMain.vb 类确实连接到我本地的 SQL Server 副本,您可能希望更新此连接字符串,或者只需为项目添加一个新连接并将网格绑定到该连接。您可能还想查看设置在网格上的属性,它被配置为不显示选择(这是通过更改默认单元格样式来实现的,使选定单元格的背景色属性与普通网格匹配,选定单元格的前景色属性与普通网格匹配。行可见标题属性也设置为 false,以移除左侧的行选择和行指针列。ScrollBars 属性也设置为 'None'。这些外观相关的设置仅仅是为了让网格在转换为位图时看起来更像静态表而不是控件。

代码

在代码窗口中打开 DataGrid2Bitmap.vb;该文件是一个代码模块,因此在使用它之前不需要实例化。DataGrid2Bitmap.vb 文件包含一个导入语句,它是

Imports System.Drawing.Imaging

处理位图需要此导入,并且对于此演示是必需的。在模块声明之后,您应该看到此代码

Private Declare Auto Function BitBlt Lib "gdi32.dll" _
    (ByVal pHdc As IntPtr, ByVal iX As Integer, _
    ByVal iY As Integer, ByVal iWidth As Integer, _
    ByVal iHeight As Integer, ByVal pHdcSource As IntPtr, _
    ByVal iXSource As Integer, ByVal iYSource As Integer, _
    ByVal dw As System.Int32) As Boolean

Private Const SRC As Integer = &HCC0020

该声明用于为应用程序提供对 gdi32.dllBitBlt 函数的直接访问。没有此代码块,就无法在应用程序中调用 BitBlt。在 BitBlt 声明之后,定义了一个整数常量并进行设置;此常量稍后将用于支持 BitBlt 函数。

在常量声明之后,您应该看到以下代码

Public Sub ConvertDG2BMP(ByVal dg As DataGridView, _
                         ByVal sFilePath As String)

    dg.Refresh()
    dg.Select()

    Dim g As Graphics = dg.CreateGraphics
    Dim ibitMap As New Bitmap(dg.ClientSize.Width, _
    dg.ClientSize.Height, g)
    Dim iBitMap_gr As Graphics = Graphics.FromImage(ibitMap)
    Dim iBitMap_hdc As IntPtr = iBitMap_gr.GetHdc
    Dim me_hdc As IntPtr = g.GetHdc

    BitBlt(iBitMap_hdc, 0, 0, dg.ClientSize.Width, _
    dg.ClientSize.Height, me_hdc, 0, 0, SRC)
    g.ReleaseHdc(me_hdc)
    iBitMap_gr.ReleaseHdc(iBitMap_hdc)

    If sFilePath = "" Then Exit Sub
    ibitMap.Save(sFilePath, ImageFormat.Bmp)

End Sub

此函数接受两个参数,第一个是要保存到位图的 DataGridView 控件。第二个参数用于提供一个文件路径,该路径随后用于定义当前保存请求的存储位置和文件名。

其余代码获取网格的图形上下文,创建与网格大小匹配的位图,设置并执行 BitBlt 调用,然后将图像以位图格式保存到提供的文件路径。该模块的介绍到此结束。

图 1:示例输出 – 来自网格的位图

frmMain.vb 类用作前面讨论的模块的测试平台。frmMain.vb 类有一个菜单,其中包含一个保存菜单选项。如果您打开保存菜单选项的处理程序,您将看到此代码

Try
    'Open a file dialog for saving map documents
    SaveFileDialog1.Title = "Save As BMP File"
    SaveFileDialog1.Filter = "Bitmap File (*.bmp)|*.bmp"

    If SaveFileDialog1.ShowDialog() =  _
    Windows.Forms.DialogResult.Cancel Then
        Exit Sub
    End If

Catch ex As Exception

    Exit Sub

End Try

'Exit if no map document is selected
Dim sFilePath As String
sFilePath = SaveFileDialog1.FileName
If sFilePath = "" Then
    Exit Sub
Else
    DataGrid2Bitmap.ConvertDG2BMP(DataGridView1, sFilePath)
End If

保存菜单项处理程序代码在将其设置为使用位图文件扩展名后,会打开一个标准的文件保存对话框。此函数收集的路径随后用于调用 DataGrid2BitmapConvertDG2BMP 子例程;它还将窗体的 DataGridView 控件和用于存储文件的文件路径传递进去。

摘要

这是一个简单的项目,唯一的目的是演示一种将 DataGridView 控件转换为位图的可行方法,这种方法可能在您需要动态生成的网格但需要其位图形式的情况下很有用。虽然本项目仅描述了将 DataGridView 转换为位图的过程;该方法可以应用于任何其他控件或容器对象。

将 DataGridView 转换为 Bitmap - CodeProject - 代码之家
© . All rights reserved.