3,248
社区成员




// 将图片文件拷贝到剪切板(将包含文件名的文件完整路径添加到剪切板中)
void CCatchScreenDlg::CopyCatchFileToClipboard( CString strFilePath )
{
DROPFILES dropFiles;
UINT uGblLen, uDropFilesLen;
HGLOBAL hGblFiles, hGblEffect;
char *szData, *szFileList;
DWORD *pdwDropEffect;
hGblEffect = GlobalAlloc( GMEM_ZEROINIT|GMEM_MOVEABLE|GMEM_DDESHARE, sizeof(DWORD) );
pdwDropEffect = (DWORD*)GlobalLock( hGblEffect );
*pdwDropEffect = DROPEFFECT_COPY;
GlobalUnlock(hGblEffect);
uDropFilesLen=sizeof(DROPFILES);
dropFiles.pFiles = uDropFilesLen;
dropFiles.pt.x = 0;
dropFiles.pt.y = 0;
dropFiles.fNC = FALSE;
dropFiles.fWide = TRUE;
uGblLen = uDropFilesLen + strFilePath.GetLength()*2 + 8;
hGblFiles = GlobalAlloc( GMEM_ZEROINIT|GMEM_MOVEABLE|GMEM_DDESHARE, uGblLen );
szData = (char*)GlobalLock( hGblFiles );
memcpy (szData, (LPVOID)(&dropFiles), uDropFilesLen );
szFileList = szData + uDropFilesLen;
LPWSTR lpWStrBmpFileName = NULL; // 注意:Bitmap::Save接口第一个参数是宽字节参数
#ifdef _UNICODE
lpWStrBmpFileName = strFilePath.GetBuffer( 0 ); // 如果是_UNICODE模式,直接使用
#else
WCHAR wchBmpFileName[MAX_PATH*2] = {0};
MultiByteToWideChar( CP_ACP, 0, strFilePath.GetBuffer( 0 ), -1, wchBmpFileName, strlen(strFilePath)+1 ); // 将窄字符转化为宽字符
lpWStrBmpFileName = wchBmpFileName;
#endif
wmemcpy( (WCHAR *)szFileList, lpWStrBmpFileName, wcslen( lpWStrBmpFileName )+2 );
GlobalUnlock(hGblFiles);
if( ::OpenClipboard(NULL) )
{
::EmptyClipboard();
::SetClipboardData( CF_HDROP, hGblFiles );
::SetClipboardData( m_dwScreenCatchClipFormat, hGblEffect );
::CloseClipboard();
}
}