如何调用windows自带函数生成缩略图
答案:2 悬赏:80 手机版
解决时间 2021-02-21 13:41
- 提问者网友:寂寞撕碎了回忆
- 2021-02-21 02:30
如何调用windows自带函数生成缩略图
最佳答案
- 五星知识达人网友:像个废品
- 2021-02-21 03:05
1、实现的原理
在Windows XP下实现缩略图功能根本上就是实现IExtractImage、IExtractImage2和IPersistFile中的各种方法。上述接口中的各种方法都必须有相应的实现函数,函数如果没有具体内容可以返回E_NOTIMPL,代码如下:
// IExtractImage
TDMETHOD(GetLocation)(LPWSTRpszPathBuffer, DWORDcchMax,
DWORD *pdwPriority, constSIZE *prgSize, DWORDdwRecClrDepth, DWORD *pdwFlags); STDMETHOD(Extract)(HBITMAP*); // IExtractImage2
STDMETHOD(GetDateStamp)(FILETIME *pDateStamp);
// IPersistFile
STDMETHOD(Load)(LPCOLESTRwszFile, DWORDdwMode);
STDMETHOD(GetClassID)(LPCLSIDclsid){returnE_NOTIMPL;} STDMETHOD(IsDirty)(VOID) {returnE_NOTIMPL;} STDMETHOD(Save)(LPCOLESTR, BOOL){returnE_NOTIMPL;} STDMETHOD(SaveCompleted)(LPCOLESTR){returnE_NOTIMPL;} STDMETHOD(GetCurFile)(LPOLESTRFAR*){returnE_NOTIMPL;}
上述即只实现了四个方法GetLocation、Extract、GetDateStamp和Load,其他方法均返回E_NOTIMPL。
2、实现的方法
在codeproject网上有一个例子,而且有一个VC6的工程向导。利用该向导并添加适当的代码就可以显示特定格式文件的缩略图。上文是对该例子的简化,原例子在Load方法中先在DC上绘图然后在保存HBITMAP,本文直接用GDI+的方法生成了一个HBITMAP(主要不同请查看Load方法具体实现的不同之处)。各方法的具体实现如下:
HRESULT CGydTydPreviewExtractor::GetLocation(LPWSTR pszPathBuffer, DWORD cchMax, DWORD *pdwPriority,
const SIZE *prgSize, DWORD dwRecClrDepth, DWORD *pdwFlags) {
AFX_MANAGE_STATE(AfxGetStaticModuleState()); m_bmSize = *prgSize;
if (*pdwFlags & IEIFLAG_ASYNC) return E_PENDING; return NOERROR; }
HRESULT CGydTydPreviewExtractor::Load(LPCOLESTR wszFile, DWORD dwMode) {
AFX_MANAGE_STATE(AfxGetStaticModuleState());
USES_CONVERSION;
_tcscpy(m_szFile, OLE2T((WCHAR*)wszFile));
BOOL bLoad = FALSE;
GdiplusStartupInput startupInput; ULONG_PTR gdiplusToken;
Status ret = GdiplusStartup(&gdiplusToken, &startupInput, NULL); CFile file;
if(file.Open(m_szFile, CFile::modeRead)) {
file.Seek(26, CFile::begin);
WORD wBitCounts; DWORD dwVersion;
file.Read(&dwVersion, 4); if(dwVersion >= 20090612) {
file.Read(&wBitCounts, 2);
BYTE *pBits = (BYTE*)GlobalAlloc(GMEM_ZEROINIT, 450000);
BYTE *pt = (BYTE*)GlobalAlloc(GMEM_ZEROINIT, wBitCounts+5000); file.Read(pt, wBitCounts);
short nWidth = 100;
long len = uncode_expand(pt, pBits, wBitCounts); GlobalFree(pt); if(len == 40000) nWidth = 100; else
nWidth = 256;
Bitmap *pBitmap = new Bitmap(nWidth, nWidth, nWidth*4, PixelFormat32bppRGB, pBits); if(pBitmap) {
bLoad = TRUE;
ret = pBitmap->GetHBITMAP(Color(0, 0, 0), &m_hPreview); ASSERT(ret == Ok); delete pBitmap; }
GlobalFree(pBits); }
file.Close(); }
在Windows XP下实现缩略图功能根本上就是实现IExtractImage、IExtractImage2和IPersistFile中的各种方法。上述接口中的各种方法都必须有相应的实现函数,函数如果没有具体内容可以返回E_NOTIMPL,代码如下:
// IExtractImage
TDMETHOD(GetLocation)(LPWSTRpszPathBuffer, DWORDcchMax,
DWORD *pdwPriority, constSIZE *prgSize, DWORDdwRecClrDepth, DWORD *pdwFlags); STDMETHOD(Extract)(HBITMAP*); // IExtractImage2
STDMETHOD(GetDateStamp)(FILETIME *pDateStamp);
// IPersistFile
STDMETHOD(Load)(LPCOLESTRwszFile, DWORDdwMode);
STDMETHOD(GetClassID)(LPCLSIDclsid){returnE_NOTIMPL;} STDMETHOD(IsDirty)(VOID) {returnE_NOTIMPL;} STDMETHOD(Save)(LPCOLESTR, BOOL){returnE_NOTIMPL;} STDMETHOD(SaveCompleted)(LPCOLESTR){returnE_NOTIMPL;} STDMETHOD(GetCurFile)(LPOLESTRFAR*){returnE_NOTIMPL;}
上述即只实现了四个方法GetLocation、Extract、GetDateStamp和Load,其他方法均返回E_NOTIMPL。
2、实现的方法
在codeproject网上有一个例子,而且有一个VC6的工程向导。利用该向导并添加适当的代码就可以显示特定格式文件的缩略图。上文是对该例子的简化,原例子在Load方法中先在DC上绘图然后在保存HBITMAP,本文直接用GDI+的方法生成了一个HBITMAP(主要不同请查看Load方法具体实现的不同之处)。各方法的具体实现如下:
HRESULT CGydTydPreviewExtractor::GetLocation(LPWSTR pszPathBuffer, DWORD cchMax, DWORD *pdwPriority,
const SIZE *prgSize, DWORD dwRecClrDepth, DWORD *pdwFlags) {
AFX_MANAGE_STATE(AfxGetStaticModuleState()); m_bmSize = *prgSize;
if (*pdwFlags & IEIFLAG_ASYNC) return E_PENDING; return NOERROR; }
HRESULT CGydTydPreviewExtractor::Load(LPCOLESTR wszFile, DWORD dwMode) {
AFX_MANAGE_STATE(AfxGetStaticModuleState());
USES_CONVERSION;
_tcscpy(m_szFile, OLE2T((WCHAR*)wszFile));
BOOL bLoad = FALSE;
GdiplusStartupInput startupInput; ULONG_PTR gdiplusToken;
Status ret = GdiplusStartup(&gdiplusToken, &startupInput, NULL); CFile file;
if(file.Open(m_szFile, CFile::modeRead)) {
file.Seek(26, CFile::begin);
WORD wBitCounts; DWORD dwVersion;
file.Read(&dwVersion, 4); if(dwVersion >= 20090612) {
file.Read(&wBitCounts, 2);
BYTE *pBits = (BYTE*)GlobalAlloc(GMEM_ZEROINIT, 450000);
BYTE *pt = (BYTE*)GlobalAlloc(GMEM_ZEROINIT, wBitCounts+5000); file.Read(pt, wBitCounts);
short nWidth = 100;
long len = uncode_expand(pt, pBits, wBitCounts); GlobalFree(pt); if(len == 40000) nWidth = 100; else
nWidth = 256;
Bitmap *pBitmap = new Bitmap(nWidth, nWidth, nWidth*4, PixelFormat32bppRGB, pBits); if(pBitmap) {
bLoad = TRUE;
ret = pBitmap->GetHBITMAP(Color(0, 0, 0), &m_hPreview); ASSERT(ret == Ok); delete pBitmap; }
GlobalFree(pBits); }
file.Close(); }
全部回答
- 1楼网友:長槍戰八方
- 2021-02-21 04:23
计算机 属性 高级 特效里 把aeropeek关闭
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯