Rss & SiteMap

Foxtable(狐表) http://www.foxtable.com

新一代数据库软件,完美融合Access、Foxpro、Excel、vb.net之优势,人人都能掌握的快速软件开发工具!
共26 条记录, 每页显示 10 条, 页签: [1] [2][3]
[浏览完整版]

标题:请高手指点:如何在PICTUREBOX中显示*.dwg图形文件

1楼
唐尸三摆手 发表于:2010/11/18 11:48:00

如题

[此贴子已经被作者于2010-11-18 11:48:42编辑过]
2楼
唐尸三摆手 发表于:2010/11/18 14:13:00

在网上搜到这么一段:

为了找一个合适的预览DWG文件的控件,不知道搜索了多少次,都没有满意的结果,R2002自带的控件无法预览R2004格式的文件,最近花了几天时间,终于解决了这个困扰好久了难题,直接从DWG文件中提取位图放在PictureBox中预览。唯一留下的遗憾是当文件被其它进程打开时,会导致程序返回速度太慢,不知道各位是否有好的方法解决这一问题(或是有什么办法可以强行打开正被其它进程打开的文件)。现将代码及注释贴出来,要知道我是刚学VB.Net的,而且纯属业余爱好。

    Private Structure BITMAPFILEHEADER
        Dim bfType As Short
        Dim bfSize As Integer
        Dim bfReserved1 As Short
        Dim bfReserved2 As Short
        Dim bfOffBits As Integer
    End Structure

Public Function GetDwgImage(ByVal FileName As String) As Image
        If Not File.Exists(FileName) Then Exit Function
        Dim DwgF As FileStream    '文件流
        Dim PosSentinel As Integer  '文件描述块的位置
        Dim br As BinaryReader  '读取二进制文件
        Dim TypePreview As Integer '缩略图格式
        Dim PosBMP As Integer '缩略图位置
        Dim LenBMP As Integer '缩略图大小
        Dim biBitCount As Short '缩略图比特深度
        Dim biH As BITMAPFILEHEADER 'BMP文件头,DWG文件中不包含位图文件头,要自行加上去
        Dim BMPInfo() As Byte  '包含在DWG文件中的BMP文件体
        Dim BMPF As New MemoryStream  '保存位图的内存文件流
        Dim bmpr As New BinaryWriter(BMPF) '写二进制文件类
        Dim myImg As Image
        Try
            DwgF = New FileStream(FileName, FileMode.Open, FileAccess.Read)    '文件流
            br = New BinaryReader(DwgF)
            DwgF.Seek(13, SeekOrigin.Begin) '从第十三字节开始读取
            PosSentinel = br.ReadInt32 '第13到17字节指示缩略图描述块的位置
            DwgF.Seek(PosSentinel + 30, SeekOrigin.Begin) '将指针移到缩略图描述块的第31字节

            TypePreview = br.ReadByte '第31字节为缩略图格式信息,2 为BMP格式,3为WMF格式
            Select Case TypePreview
                Case 1

                Case 2, 3
                    PosBMP = br.ReadInt32 'DWG文件保存的位图所在位置
                    LenBMP = br.ReadInt32 '位图的大小
                    DwgF.Seek(PosBMP + 14, SeekOrigin.Begin) '移动指针到位图块
                    biBitCount = br.ReadInt16 '读取比特深度
                    DwgF.Seek(PosBMP, SeekOrigin.Begin) '从位图块开始处读取全部位图内容备用
                    BMPInfo = br.ReadBytes(LenBMP)  '不包含文件头的位图信息
                    br.Close()
                    DwgF.Close()
                    With biH  '建立位图文件头
                        .bfType = &H4D42
                        If biBitCount < 9 Then .bfSize = 54 + 4 * (2 ^ biBitCount) + LenBMP Else .bfSize = 54 + LenBMP
                        .bfReserved1 = 0 '保留字节
                        .bfReserved2 = 0 '保留字节
                        .bfOffBits = 14 + &H28 + 1024 '图像数据偏移
                    End With
                    '以下开始写入位图文件头
                    bmpr.Write(biH.bfType) '文件类型
                    bmpr.Write(biH.bfSize) '文件大小
                    bmpr.Write(biH.bfReserved1) '0
                    bmpr.Write(biH.bfReserved2) '0
                    bmpr.Write(biH.bfOffBits) '图像数据偏移
                    bmpr.Write(BMPInfo) '写入位图


                    BMPF.Seek(0, SeekOrigin.Begin) '指针移到文件开始处

                    myImg = Image.FromStream(BMPF) '创建位图文件对象
                    Return myImg
                    bmpr.Close()
                    BMPF.Close()
            End Select
        Catch ex As Exception
            Return Nothing
        End Try

      
    End Function

这个程序涉及到了DWG文件的内部格式。编出来的人很了不起。

 

 

 

 

各位高手帮忙看看,是否能够在foxtable中借用上,谢了

3楼
狐狸爸爸 发表于:2010/11/18 15:05:00

我帮你改了一下,复制到全局代码中用:

 

Private Structure BITMAPFILEHEADER
        Dim bfType As Short
        Dim bfSize As Integer
        Dim bfReserved1 As Short
        Dim bfReserved2 As Short
        Dim bfOffBits As Integer
    End Structure

Public Function GetDwgImage(ByVal FileName As String) As Image
        If Not io.File.Exists(FileName) Then Exit Function
        Dim DwgF As io.FileStream    '文件流
        Dim PosSentinel As Integer  '文件描述块的位置
        Dim br As io.BinaryReader  '读取二进制文件
        Dim TypePreview As Integer '缩略图格式
        Dim PosBMP As Integer '缩略图位置
        Dim LenBMP As Integer '缩略图大小
        Dim biBitCount As Short '缩略图比特深度
        Dim biH As BITMAPFILEHEADER 'BMP文件头,DWG文件中不包含位图文件头,要自行加上去
        Dim BMPInfo() As Byte  '包含在DWG文件中的BMP文件体
        Dim BMPF As New io.MemoryStream  '保存位图的内存文件流
        Dim bmpr As New io.BinaryWriter(BMPF) '写二进制文件类
        Dim myImg As Image
        Try
            DwgF = New io.FileStream(FileName, io.FileMode.Open, io.FileAccess.Read)    '文件流
            br = New io.BinaryReader(DwgF)
            DwgF.Seek(13, io.SeekOrigin.Begin) '从第十三字节开始读取
            PosSentinel = br.ReadInt32 '第13到17字节指示缩略图描述块的位置
            DwgF.Seek(PosSentinel + 30, io.SeekOrigin.Begin) '将指针移到缩略图描述块的第31字节

            TypePreview = br.ReadByte '第31字节为缩略图格式信息,2 为BMP格式,3为WMF格式
            Select Case TypePreview
                Case 1

                Case 2, 3
                    PosBMP = br.ReadInt32 'DWG文件保存的位图所在位置
                    LenBMP = br.ReadInt32 '位图的大小
                    DwgF.Seek(PosBMP + 14, io.SeekOrigin.Begin) '移动指针到位图块
                    biBitCount = br.ReadInt16 '读取比特深度
                    DwgF.Seek(PosBMP, io.SeekOrigin.Begin) '从位图块开始处读取全部位图内容备用
                    BMPInfo = br.ReadBytes(LenBMP)  '不包含文件头的位图信息
                    br.Close()
                    DwgF.Close()
                    With biH  '建立位图文件头
                        .bfType = &H4D42
                        If biBitCount < 9 Then .bfSize = 54 + 4 * (2 ^ biBitCount) + LenBMP Else .bfSize = 54 + LenBMP
                        .bfReserved1 = 0 '保留字节
                        .bfReserved2 = 0 '保留字节
                        .bfOffBits = 14 + &H28 + 1024 '图像数据偏移
                    End With
                    '以下开始写入位图文件头
                    bmpr.Write(biH.bfType) '文件类型
                    bmpr.Write(biH.bfSize) '文件大小
                    bmpr.Write(biH.bfReserved1) '0
                    bmpr.Write(biH.bfReserved2) '0
                    bmpr.Write(biH.bfOffBits) '图像数据偏移
                    bmpr.Write(BMPInfo) '写入位图


                    BMPF.Seek(0, io.SeekOrigin.Begin) '指针移到文件开始处

                    myImg = Image.FromStream(BMPF) '创建位图文件对象
                    Return myImg
                    bmpr.Close()
                    BMPF.Close()
            End Select
        Catch ex As Exception
            Return Nothing
        End Try

      
    End Function

4楼
唐尸三摆手 发表于:2010/11/18 15:21:00

如果这样能行的话,我们就可以制作图纸管理系统了,相信很多企业都会遇到这种情况的

5楼
唐尸三摆手 发表于:2010/11/18 15:31:00
如何调用啊,真是挠头
6楼
狐狸爸爸 发表于:2010/11/18 15:38:00

复制到全局代码,以后就可以:

 

Dim pb As Winfrom.PictureBox = forms("XXX").Controls("YYY")

pb.Image = GetDwgImage("dwg文件,包括路径")

7楼
唐尸三摆手 发表于:2010/11/18 16:05:00


图片点击可在新窗口打开查看此主题相关图片如下:screenshot1.jpg
图片点击可在新窗口打开查看

 

老大,这样是不是就意味着我们可以用foxtable来管理图纸了?

8楼
狐狸爸爸 发表于:2010/11/18 16:06:00
呵呵,既然都显示出来了,应该就是的了。
9楼
程兴刚 发表于:2010/11/19 0:42:00

这个要收藏!

 

不过,我有点贪心,一直期盼能直接支持.dwg格式,包括他的可编辑属性!图片点击可在新窗口打开查看

10楼
方沈 发表于:2012/11/30 12:19:00
支持增加PDF,CAD
共26 条记录, 每页显示 10 条, 页签: [1] [2][3]

Copyright © 2000 - 2018 foxtable.com Tel: 4000-810-820 粤ICP备11091905号

Powered By Dvbbs Version 8.3.0
Processed in .05078 s, 2 queries.