高分求救,如何把CBitmap放到剪贴板上,我试了半天了,就是不行.请大家进来看看,谢谢啦!
代码很简单,用来Load bmp图片的,我不想用LoadImage,因为LoadImage在win98下面不能装载大图片,所以从网上找了一个方法LoadPictureFromFile.
Load完后我把图片放到剪贴板上,但是粘贴时就是死活说剪贴板数据出错.
LoadPictureFromFile这个方法是正确的,因为CBitmap已经取得,所以估计是剪贴板编程出错了
请大虾指教!
void LoadPictureFromFile(LPCTSTR szFile, CBitmap *pBitmap, CSize &mSize)
{
// open file
HANDLE hFile = CreateFile(szFile, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
_ASSERTE(INVALID_HANDLE_VALUE != hFile);
// get file size
DWORD dwFileSize = GetFileSize(hFile, NULL);
_ASSERTE(-1 != dwFileSize);
LPVOID pvData = NULL;
// alloc memory based on file size
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, dwFileSize);
_ASSERTE(NULL != hGlobal);
pvData = GlobalLock(hGlobal);
_ASSERTE(NULL != pvData);
DWORD dwBytesRead = 0;
// read file and store in global memory
BOOL bRead = ReadFile(hFile, pvData, dwFileSize, &dwBytesRead, NULL);
_ASSERTE(FALSE != bRead);
GlobalUnlock(hGlobal);
CloseHandle(hFile);
LPSTREAM pstm = NULL;
// create IStream* from global memory
HRESULT hr = CreateStreamOnHGlobal(hGlobal, TRUE, &pstm);
_ASSERTE(SUCCEEDED(hr) && pstm);
// Create IPicture from image file
LPPICTURE gpPicture;
hr = ::OleLoadPicture(pstm, dwFileSize, FALSE, IID_IPicture, (LPVOID *)&gpPicture);
_ASSERTE(SUCCEEDED(hr) && gpPicture);
pstm->Release();
OLE_HANDLE m_picHandle;
gpPicture->get_Handle(&m_picHandle);
pBitmap->DeleteObject();
pBitmap->Attach((HGDIOBJ) m_picHandle);
BITMAP bm;
GetObject(pBitmap->m_hObject, sizeof(bm), &bm);
mSize.cx = bm.bmWidth; //nWidth;
mSize.cy = bm.bmHeight; //nHeight;
}
void CSelfTest2Dlg::OnBnClickedButton1()
{
//我想装载一个bmp图片,不想用LoadImage,因为LoadImage在win98下面不能装载大图片,所以从网上找了一个方法LoadPictureFromFile
CBitmap* bmp =new CBitmap();
CSize sz;
//sz用来获得图片宽度和高度
LoadPictureFromFile("c:\\a.bmp",bmp,sz);
//跟踪代码可发现宽度和高度是正确的.所有bmp已经装载了
OpenClipboard();
EmptyClipboard();
SetClipboardData(CF_BITMAP,bmp->GetSafeHandle());
//SetClipboardData(CF_BITMAP,bmp->m_hObject); 这句也不行
CloseClipboard();
delete bmp;
//结果很奇怪,粘贴时剪贴板会数据报错.
}