15,979
社区成员
发帖
与我相关
我的任务
分享
void CCatchScreenDlg::CopyCatchFileToClipboard( CString strFilePath )
{
BSTR filePath = strFilePath.AllocSysString();
Bitmap tempBmp( filePath );
Color backColor;
HBITMAP hTmpBitmap = NULL;
tempBmp.GetHBITMAP( backColor, &hTmpBitmap );
// 当XP系统的颜色设置为16位时,通过GetHBITMAP获取的位图是非兼容的,直接插入到richedit后会抛出
// “存储空间不足,无法完成此操作”的异常,所以需要将位图转化成兼容的位图后再插入,2012/04/24
CBitmap* pBitmap = CBitmap::FromHandle( hTmpBitmap );
if ( pBitmap == NULL )
{
return;
}
// 获取位图信息,主要是尺寸信息
BITMAP bitmap;
pBitmap->GetBitmap( &bitmap );
HDC hDC = ::GetDC( NULL ); // 获取桌面DC
HDC hSrcDC = ::CreateCompatibleDC( hDC );
::SelectObject( hSrcDC, hTmpBitmap ); // 将位图选进DC
HDC hMemDC = ::CreateCompatibleDC( hDC ); // 为屏幕设备描述表创建兼容的内存设备描述表
HBITMAP hBitmap = ::CreateCompatibleBitmap( hDC, bitmap.bmWidth, bitmap.bmHeight ); // 创建一个与屏幕设备描述表兼容的位图
::SelectObject( hMemDC, hBitmap ); // 把新位图选到内存设备描述表中
::BitBlt( hMemDC, 0, 0, bitmap.bmWidth, bitmap.bmHeight, hSrcDC, 0, 0, SRCCOPY );
if( ::OpenClipboard( NULL ) )
{
::EmptyClipboard();
::SetClipboardData( CF_BITMAP, hBitmap );
::CloseClipboard();
}
::DeleteDC( hMemDC );
::DeleteDC( hSrcDC );
if ( hDC != NULL )
{
::ReleaseDC( NULL, hDC );
}
::DeleteObject( hBitmap );
// Bitmap::GetHBITMAP返回的的位图句柄是该函数内部创建的,用完后要手动将之释放掉,否则会造成内存泄露,2013/06/09
if ( hTmpBitmap != NULL )
{
DeleteObject( hTmpBitmap );
}
// 调用AllocSysString后要用SysFreeString释放掉,2013/06/09
if ( filePath != NULL )
{
SysFreeString( filePath );
}
}