首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 怎样象操作系统一样,浏览的时候获取到文件的缩略图? [已结贴,结贴人:tlygood]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • tlygood
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 揭帖率:
    发表于:2007-10-26 18:54:21 楼主
    怎样象操作系统一样,浏览的时候获取到文件的缩略图?比如一个DWG文件(AutoCad生成的文件),有没有人做过把其中的位图信息抽出来。。。。
    100  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • MBWQ
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2007-10-26 19:19:051楼 得分:30
    在窗体中显示DWG缩略图(两种方法)
    从Kean的文章上看到的,本来想翻译文章的,但现在人懒了,把主要的内容说一下。
    要在Windows的窗体上显示DWG缩略图,这个估计是很多人想实现的功能。以前在论坛里有个朋友用了acmgdinternal.dll中有关的内容来显示缩略图,但很多朋友反映这个方法显示的缩略图有点模糊。因此我向大家介绍Kean的方法。
    一共有两个方法,一个是使用DWGThumbnail 这个OCX控件,另外一个是使用DWGTrueView。
    1.添加DWGThumbnail 控件
    这个是ADN上提供的一个控件,可怜我们这些穷老百姓,哪会加入到这个组织啊。但还是通过Google这个强大的工具,找到了这个控件,呵呵,就给大家共享了,可以到附件里下载。
    要在你的程序里使用DWGThumbnail 控件,你必须在Visual Studio的工具箱中右击,然后选择“选择项目……”,切换到COM组件选项卡,浏览选择DwgThumbnail.ocx文件。把添加好的控件从工具箱中拉出放到窗体上,再设置控件的DwgFileName属性为所要显示的DWG文件名。


    2.添加DWGTrueView控件
    可以到这个地址下载:http://download.autodesk.com/esd/dwgtrueview/2007_2/SetupDWGTrueView2008_CHS.exe。
    添加的方法与上面一样,在COM组件选项卡上选择DWGVIEWRCtrl项。把添加好的控件从工具箱中拉出放到窗体上,再设置控件的PutSourcePath函数为所要显示的DWG文件名。


    3.为了比较这两个控件的差别,请建立一个简单的Windows 窗体程序,在左边放一个DWGThumbnail 控件,而在右边放置一个DwgTrueView控件,最后在窗体上添加一个"Load"按钮来载入DWG文件,这个按钮用来选择DWG文件并把它载入到DWGThumbnail 和DWGTrueView控件中。
    下面是VB.NET的代码:复制内容到剪贴板代码:
    Public Class ComparisonForm
      Private Sub LoadButton_Click _
        (ByVal sender As System.Object, _
        ByVal e As System.EventArgs) _
        Handles LoadButton.Click
        Dim dlg As New System.Windows.Forms.OpenFileDialog()
        dlg.InitialDirectory = _
          System.Environment.CurrentDirectory
        dlg.Filter = _
          "DWG files (*.dwg)|*.dwg|All files (*.*)|*.*"
        Dim oc As Cursor = Me.Cursor
        Dim fn As String = ""
        If dlg.ShowDialog() = Windows.Forms.DialogResult.OK Then
          Me.Cursor = Cursors.WaitCursor
          fn = dlg.FileName()
          Me.Refresh()
        End If
        If fn <> "" Then
          Me.AxDwgThumbnail1.DwgFileName = fn
          Me.AxDwgThumbnail1.Refresh()
          Me.AxAcCtrl1.PutSourcePath(fn)
        End If
        Me.Cursor = oc
      End Sub
    End ClassC#代码如下:复制内容到剪贴板代码:

            private void LoadButton_Click(object sender, EventArgs e)
            {
                OpenFileDialog dlg = new OpenFileDialog();
                dlg.InitialDirectory = System.Environment.CurrentDirectory;
                dlg.Filter = "DWG files (*.dwg)|*.dwg|All files (*.*)|*.*";
                Cursor oc = this.Cursor;
                string fn = "";
                if (dlg.ShowDialog() = DialogResult.OK)
                {
                    this.Cursor = Cursors.WaitCursor;
                    fn = dlg.FileName;
                    this.Refresh();
                }
                if (fn != "")
                {
                    this.axDwgThumbnail1.DwgFileName = fn;
                    this.axDwgThumbnail1.Refresh();
                    this.axAcCtrl1.PutSourcePath(fn);
                }
                this.Cursor = oc;
            }程序运行的结果如下图所示:


    你可以发现DWGTrueView控件完全就是AutoCAD的一个只读微型版本,以前记得有网友提过类似的要求,我想这个控件正好可以满足这个要求。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • tlygood
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2007-10-26 19:32:162楼 得分:0
    好人啦,谢谢。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • tlygood
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2007-10-26 19:36:153楼 得分:0
    还想再问下,能不能直接获取该缩略图的位图呢?比如说得到该位图资源。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wawaku
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2007-10-26 22:39:154楼 得分:0
    直接获取不大现实。自己解读文件绘制也不现实。 所以唯一的思路是利用AutoCad的DLL来取得文件的内存DC。正是一楼的方法
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • sxfzhulin
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2007-10-29 11:38:175楼 得分:20
    实际上AutoCAD已经为操作系统实现了一个com接口类CExtractImage2,这个在InteliCAD的代码中也有体现,但是怎样象操作系统中通过COM实例去实现调用这个接口,没能分析出这个东东,所以希望有高手指点。。。。。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wjkgz
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2007-10-29 12:40:026楼 得分:50
    给你一段我以前写的代码,windows能得到的它也可以得到。


    C/C++ code
    void CtestThubnailView::ShowThubnail( CDC * pDC, CString fileName ) { LPSHELLFOLDER pIShellFolder = NULL; CString sParentFolder = GetPath( fileName ); if (sParentFolder.IsEmpty()) { return ; } LPSHELLFOLDER pIDesktopFolder = NULL; HRESULT hRes = SHGetDesktopFolder(&pIDesktopFolder); if (FAILED(hRes)) { return ; } LPITEMIDLIST pidl = GetPIDL(sParentFolder, pIDesktopFolder); if (NULL == pidl) { return ; } hRes = pIDesktopFolder->BindToObject(pidl, NULL, IID_IShellFolder, (void**)&pIShellFolder); if (FAILED(hRes)) { return ; } LPMALLOC pMalloc; if (SHGetMalloc (&pMalloc)== NOERROR) { pMalloc->Free(pidl); pMalloc->Release(); } else { return ; } CString sRelFileName = GetName( fileName ); LPCITEMIDLIST relativePidl = GetPIDL(sRelFileName, pIShellFolder); if (NULL == relativePidl) { pIShellFolder->Release(); return ; } SIZE size; size.cx = GetSystemMetrics(SM_CXSCREEN) ; size.cy = GetSystemMetrics(SM_CYSCREEN) ; LPEXTRACTIMAGE pIExtract = NULL; HRESULT hr; hr = pIShellFolder->GetUIObjectOf(NULL, 1, &relativePidl, IID_IExtractImage, NULL, (void**)&pIExtract); if(NULL == pIExtract) // early shell version, thumbs not supported { return ; } OLECHAR wszPathBuffer[MAX_PATH]; DWORD dwPriority = 0; // IEI_PRIORITY_NORMAL is defined nowhere! DWORD dwFlags = IEIFLAG_SCREEN; HBITMAP hBmpImage = NULL; hr = pIExtract->GetLocation(wszPathBuffer, MAX_PATH, &dwPriority, &size, 32, &dwFlags); // even if we've got shell v4.70+, not all files support thumbnails if(NOERROR == hr) { try{ hr = pIExtract->Extract(&hBmpImage); CString strTmp; strTmp.Format( "Extract file %S ok! \n" , wszPathBuffer ); TRACE( strTmp ); } catch(...) { CString strTmp; strTmp.Format( "Extract file %S error! \n" , wszPathBuffer ); TRACE( strTmp ); } } pIExtract->Release(); if (NULL == hBmpImage ) { pIShellFolder->Release(); LPMALLOC pMalloc; if (SHGetMalloc (&pMalloc)== NOERROR) { pMalloc->Free((void*)relativePidl); pMalloc->Release(); } return ; } pIShellFolder->Release(); if (SHGetMalloc (&pMalloc)== NOERROR) { pMalloc->Free((void*)relativePidl); pMalloc->Release(); } CBitmap bitmap; bitmap.Attach( hBmpImage ); CDC dcComp; dcComp.CreateCompatibleDC(pDC); dcComp.SelectObject(&bitmap); // get size of bitmap for BitBlt() BITMAP bmInfo; bitmap.GetObject(sizeof(bmInfo),&bmInfo); // use BitBlt() to draw bitmap pDC->BitBlt(0,0,bmInfo.bmWidth,bmInfo.bmHeight, &dcComp, 0,0,SRCCOPY); DeleteObject( hBmpImage ); }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wjkgz
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2007-10-29 12:42:467楼 得分:0
    AutoCAD应该是实现了IExtractImage的接口,所以用这个就可以得到Thumbnail的。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • tlygood
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2007-10-30 11:07:428楼 得分:0
    呵呵,wjkgz 提供的代码真的太好了。立马实现效果了。真的谢谢了啊。谢谢各位好手.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ylhyh
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-03-14 20:35:309楼 得分:0
    mark
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zuodumei
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-04-07 23:47:4210楼 得分:0
    wrfwerewre
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved