iCAx开思工具箱
标题:
获得ug文件的预览图片的控件
[打印本页]
作者:
tangxu12
时间:
2010-12-12 22:07
标题:
获得ug文件的预览图片的控件
本人前段时间见有人问此问题,不知道此人是否解决了此问题:
平日比较忙,没有时间做,今日开发了一个此功能ActiveX控件。
下图是在VC ActiveX控件测试容器中的截图:
(, 下载次数: 24)
上传
点击文件名下载附件
下载积分: 贡献 -2
作者:
tangxu12
时间:
2010-12-12 22:11
使用方法很简单,和其余控件一样
在VC /VB / IE / OFFICE等,插入此控件,代码中输入/或者用对话框选择NX PART
(, 下载次数: 7)
上传
点击文件名下载附件
下载积分: 贡献 -2
就可以得到NX PART的预览图了:
作者:
tangxu12
时间:
2010-12-12 22:13
(, 下载次数: 7)
上传
点击文件名下载附件
下载积分: 贡献 -2
作者:
qindongjun88
时间:
2010-12-13 23:12
不是很明白怎么做,楼主能否详细点!
作者:
tangxu12
时间:
2010-12-15 21:18
没人回复 看来不需要
作者:
jiaojianyaya
时间:
2010-12-18 18:42
我有这个问题,望楼主说的详细点
作者:
wangcx123
时间:
2010-12-18 22:34
谢谢分享,无私奉献
作者:
leelog
时间:
2010-12-21 20:17
先感谢一下楼主,我就是当时问这个问题的人,一直没法联系到你,能不能加我的QQ具体说一下呢。。我的QQ是1721395764~~谢谢楼主
作者:
leelog
时间:
2010-12-21 20:27
顶一下,谢谢楼主,能不能联系一下我呢。。。教我一下控件的制作方法。。
作者:
boxi2279
时间:
2010-12-27 22:21
顶一下,谢谢楼主,能不能联系一下我呢。。。教我一下控件的制作方法。。
作者:
leelog
时间:
2010-12-29 15:17
再顶一下啊,期待楼主出现。。
作者:
tangxu12
时间:
2011-3-2 20:53
控件的代码:
作者:
tangxu12
时间:
2011-3-2 20:54
void OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// 使图标在工作矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
if ( m_bShowShortCut )
{
showShortCutAsFile( this->GetDC(), m_hBitmap );
}
}
}
作者:
tangxu12
时间:
2011-3-2 20:55
HRESULT CreateThumbnail(DWORD dwWidth, DWORD dwHeight, HBITMAP* pThumbnail)
{
LPITEMIDLIST pidlItems = NULL, pidlURL = NULL, pidlWorkDir = NULL;
ULONG ulParseLen = 0;
HRESULT hr;
WCHAR pszPath[MAX_PATH];
DWORD dwPriority = 0, dwFlags = IEIFLAG_ASPECT;
SIZE size = { dwWidth, dwHeight };
IExtractImage* peiURL = NULL; // nterface is used to request a thumbnail image from a Shell folder
IShellFolder* psfDesktop = NULL;
IShellFolder* psfWorkDir = NULL;
IMalloc* pMalloc = NULL;
wstring wsDir,wsFile,wsTempFile;
// 初始化Com库
if ( CoInitialize( NULL ) != 0 )
{
AfxMessageBox( _T( "初始化Com库失败!" ) );
goto OnExit;
}
hr = SHGetMalloc( &pMalloc );
if ( FAILED( hr ) )
{
goto OnExit;
}
hr = SHGetDesktopFolder(&psfDesktop);
if(FAILED(hr)) goto OnExit;
wsDir = m_wsDir;
wsFile = m_wsFile;
wcscpy(m_wsBuffer,wsDir.c_str());
hr = psfDesktop->ParseDisplayName(NULL, NULL, m_wsBuffer, &ulParseLen, &pidlWorkDir, NULL);
if(FAILED(hr)) goto OnExit;
hr = psfDesktop->BindToObject(pidlWorkDir, NULL, IID_IShellFolder, (LPVOID*)&psfWorkDir);
if(FAILED(hr)) goto OnExit;
psfDesktop->Release();
psfDesktop = NULL;
pMalloc->Free(pidlWorkDir);
pidlWorkDir = NULL;
wcscpy(m_wsBuffer,wsFile.c_str());
hr = psfWorkDir->ParseDisplayName(NULL, NULL, m_wsBuffer, &ulParseLen, &pidlURL, NULL);
if(FAILED(hr)) goto OnExit;
hr = psfWorkDir->GetUIObjectOf(NULL, 1, (LPCITEMIDLIST*)&pidlURL, IID_IExtractImage, NULL, (LPVOID*)&peiURL);
if(FAILED(hr)) goto OnExit;
hr = peiURL->GetLocation(pszPath, MAX_PATH, &dwPriority, &size, 16, &dwFlags);
if(FAILED(hr)) goto OnExit;
hr = peiURL->Extract(pThumbnail);
if(FAILED(hr)) goto OnExit;
peiURL->Release();
peiURL = NULL;
OnExit:
if(peiURL != NULL) peiURL->Release();
if(pidlURL != NULL) pMalloc->Free(pidlURL);
if(pidlWorkDir != NULL) pMalloc->Free(pidlWorkDir);
if(psfDesktop != NULL) psfDesktop->Release();
if(psfWorkDir != NULL) psfWorkDir->Release();
CoUninitialize();
return hr;
}
作者:
tangxu12
时间:
2011-3-2 20:56
void showShortCutAsFile( CDC* pDC, HBITMAP hBitmap )
{
BITMAP bmpPic;
GetObject( hBitmap, sizeof BITMAP, &bmpPic ); // 图片大小与控件大小不一致,缩放
HBITMAP hOdBmp = static_cast<HBITMAP>( SelectObject( m_pMemDC->m_hDC, hBitmap ) );
::StretchBlt( pDC->m_hDC,
m_rectStatic.left,
m_rectStatic.top,
m_rectStatic.Width(),
m_rectStatic.Height(),
m_pMemDC->m_hDC,
0,
0,
bmpPic.bmWidth,
bmpPic.bmHeight,
+SRCCOPY );
SelectObject( m_pMemDC->m_hDC, hOdBmp );
}
作者:
tangxu12
时间:
2011-3-2 20:56
显示图片
void OnBnClickedButtonShowShortCut()
{
// TODO: 在此添加控件通知处理程序代码
DWORD dwWeight = 320;
DWORD dwHeight = 240;
CFileDialog dlg( TRUE,_T("prt" ));
dlg.m_ofn.lpstrFilter = _T( "Microsoft Excel Files(*.xls)\0*.xls\0All Files(*.*)\0*.*\0\0" );
int nRetVal = dlg.DoModal();
if ( nRetVal == IDCANCEL )
{
return ;
}
CString strFilePath = dlg.GetPathName();
m_wsDir = (LPCWSTR)strFilePath.Left( strFilePath.ReverseFind( _T( '\\' ) ) + 1 ); // 带"\"
m_wsFile = (LPCWSTR)dlg.GetFileName();
HRESULT hr;
HBITMAP hBitmap;
hr = CreateThumbnail( dwWeight, dwHeight, &hBitmap );
if ( FAILED( hr ) )
{
AfxMessageBox( _T( "获得缩略图失败!" ) );
return ;
}
m_hBitmap = hBitmap;
m_bShowShortCut = TRUE;
showShortCutAsFile( this->GetDC(), hBitmap );
}
作者:
tangxu12
时间:
2011-3-2 20:57
给你的都是控件的类成员代码
剩余的就是调用控件了
作者:
tangxu12
时间:
2011-3-2 20:58
我把类名删除了 你自己根据自己的类名 在函数前添加即可
作者:
tangxu12
时间:
2011-3-2 20:59
类的成员函数
// 实现
protected:
HICON m_hIcon;
// 生成的消息映射函数
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
public:
// 获取缩略图的句柄
HRESULT CreateThumbnail( DWORD dwWidth, DWORD dwHeight,
HBITMAP* pThumbnail );
// 在界面上显示缩略图
void showShortCutAsFile( CDC* pDC, HBITMAP hBitmap );
private:
// 内存位图
CRect m_rect;
CRect m_rectStatic;
CDC* m_pMemDC;
CBitmap m_bmpMem;
// 获取缩略图
// 文件夹路径
wstring m_wsDir;
// 文件名称
wstring m_wsFile;
// 临时缓冲区
wchar_t m_wsBuffer[255];
// 为了刷新
HBITMAP m_hBitmap;
BOOL m_bShowShortCut;
CBrush m_brushShortCut;
afx_msg void OnBnClickedButtonShowShortCut();
};
作者:
tangxu12
时间:
2011-3-2 20:59
自己复制粘帖一下就可以了
看不懂代码也没有什么关系 只要会用就可以
作者:
leelog
时间:
2011-3-3 17:27
谢谢,使用方法是不是我新建一个MFC activeX 空的文档,然后插入到目标窗口下,然后在这个窗口的程序内输入上述命令?
作者:
icbcnbxs
时间:
2013-8-13 16:00
楼主,你发的代码我怎么用啊,请指点一下行吗QQ17660998,拜托了
欢迎光临 iCAx开思工具箱 (https://t.icax.org/)
Powered by Discuz! X3.3