插入ole对象时选择从文件插入并以图标显示,但是某些图标不能正常显示

儿女情长 2012-12-27 09:50:53
我写的程序可以插入ole对象,但是从文件插入对象并以图标方式显示时,某些图标不能正常显示。而word从文件插入对象图标可以正常显示可以随意更改。
有高手知道这是为什么吗?



...全文
1562 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
mhtsahng 2013-04-07
  • 打赏
  • 举报
回复
我也碰到这个问题。代码在WIN7系统显示图标是正常的,但在XP系统里,图标显示不正常。找了很久,至今没找到解决的办法。猜想可能跟系统哪个文件有关。
儿女情长 2013-02-27
  • 打赏
  • 举报
回复
引用 8 楼 aimn147 的回复:
引用 6 楼 sebastianlin 的回复:修正 DoModal 打錯了要寫為 INT_PTR CInsertDialog::DoModal( void ) { m_io.dwFlags &= ~(IOF_DISABLEDISPLAYASICON|IOF_HIDECHANGEICON); return COleInsertDialog::D……
再次表示感谢
儿女情长 2013-02-27
  • 打赏
  • 举报
回复
引用 6 楼 sebastianlin 的回复:
修正 DoModal 打錯了要寫為 INT_PTR CInsertDialog::DoModal( void ) {     m_io.dwFlags &= ~(IOF_DISABLEDISPLAYASICON|IOF_HIDECHANGEICON);     return COleInsertDialog::DoModal(); } 以上只是 DIALOG 但是不知你……
谢谢你! “m_io.dwFlags &= ~IOF_DISABLEDISPLAYASICON; m_io.dwFlags |= IOF_CHECKDISPLAYASICON;”和SetIconicMetafile()我都大概试了下,另外我程序的old item是使用COleInsertDialog::CreateItem创建的。我的程序是在MFC sample微软官方的mfc示例程序“contain”的基础上修改的,contain程序从文件创建的ole项图标就有问题。MFC sample网上挺好找的。 现在我不用ole对象的方式插入文件了(当时主要为了在我的编辑器中插入视频文件),所以图标的问题不需要考虑了。
西門十方 2013-01-25
  • 打赏
  • 举报
回复
更改 Icon 的方法 (需加上MFC ATL支持) bool ChangeIconicMetafile( IUnknown* pObject ,HGLOBAL hMetaPict) { CComQIPtr<IOleCache> pCache(pObject); if( pCache == NULL ) return false; FORMATETC Etc; Etc.cfFormat = CF_METAFILEPICT; Etc.ptd = NULL; Etc.dwAspect = DVASPECT_ICON; Etc.lindex = -1; Etc.tymed = TYMED_MFPICT; DWORD dwConnection; SCODE sc = pCache->Cache(&Etc, ADVF_NODATA|ADVF_PRIMEFIRST|ADVF_ONLYONCE, &dwConnection); if (FAILED(sc)) return false; if( hMetaPict != NULL) { STGMEDIUM stgMedium; stgMedium.tymed = TYMED_MFPICT; stgMedium.hGlobal = hMetaPict; stgMedium.pUnkForRelease = NULL; sc = pCache>SetData(&Etc, &stgMedium, FALSE); if (FAILED(sc)) { return FALSE; } return true; }
西門十方 2013-01-25
  • 打赏
  • 举报
回复
修正 DoModal 打錯了要寫為 INT_PTR CInsertDialog::DoModal( void ) {     m_io.dwFlags &= ~(IOF_DISABLEDISPLAYASICON|IOF_HIDECHANGEICON);     return COleInsertDialog::DoModal(); } 以上只是 DIALOG 但是不知你要問題是更改後ICON Inerst 秀出的Icon 不是你更改的Icon 還是你是要Insert後的Icon 也可以更改 ,這 2 部份都需要看你的Document部份的如何處理,只光只是看圖只能用猜的,在Icon錯的部份有可能是你沒處理好Item部份,最有可能是你的Item 不是由 COleInsertDialog::CreateItem 來的,如果你是自已CreateItem 那當 DVASPECT 是 DVASPECT_ICON 就要用 QueryInterface IOleCache 處理 hMetaPict ,變更原 ICON 這部份如何處理你可以參考 COleClientItem::SetIconicMetafile PS . 你如果是用 RichView 來幫你處理是沒這問題 ,因為 RichView Item 是用 COleInsertDialog::CreateItem 得來的
西門十方 2013-01-25
  • 打赏
  • 举报
回复
SORRY 因為出國出差現在才有空看信 如果你問題是"某些图标不能正常显示。而word从文件插入对象图标可以正常显示可以随意更改" 原因是在 MFC 中 COleInsertDialog 在 COleInsertDialog::DocObjectsOnly 時用了 IOF_DISABLEDISPLAYASICON 使ICON 不能顯示 如果你要使用顯示功能則需 1. 直接改COleInsertDialog 的 DoModal( DWORD dwFlags ) 找出 IOF_DISABLEDISPLAYASICON 換成 IOF_CHECKDISPLAYASICON 2. 因為 DoModal( DWORD flage ) 會在後面再 CALL virtual DoModal() ,以便給使用有機會再修改,所以只要 overload 這個 medhod 同樣可以 SAMPLES 如下 void CMFCViewView::OnInsertObject() { // Invoke the standard Insert Object dialog box to obtain information // for new CMFCViewCntrItem object CInsertDialog* pDlg=new CInsertDialog; if (((COleInsertDialog*)pDlg)->DoModal((DWORD)COleInsertDialog::DocObjectsOnly) != IDOK) return; ........ } INT_PTR CInsertDialog::DoModal( void ) { m_io.dwFlags &= ~IOF_DISABLEDISPLAYASICON; m_io.dwFlags |= IOF_CHECKDISPLAYASICON; return COleInsertDialog::DoModal(); }
儿女情长 2012-12-29
  • 打赏
  • 举报
回复
儿女情长 2012-12-28
  • 打赏
  • 举报
回复
fishion 2012-12-27
  • 打赏
  • 举报
回复
你可以尝试直接读取文件中的资源,像读取EXE文件资源那样
儿女情长 2012-12-27
  • 打赏
  • 举报
回复
引用 1 楼 fishion 的回复:
你可以尝试直接读取文件中的资源,像读取EXE文件资源那样
怎么直接读取? 选择从文件插入ole对象时,什么类型的文件都可以的。如果直接读取文件,还要判断每种文件的类型吗??

3,248

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧