关于剪贴板的代码,运行时为什么会出错那,该如何解决
关于剪贴板的代码,运行时为什么会出错那
void DrawImage(CDC * pDC, CString pText)
{
CRect clip(0,0,200,200);
pDC->FillSolidRect(clip,RGB(170,170,222));
CPen pen;
pen.CreatePen(PS_SOLID, 3, RGB(255,10,10));
CPen * oldpen = pDC->SelectObject(&pen);
pDC->MoveTo(0,0);
pDC->LineTo(clip.right,clip.bottom);
pDC->MoveTo(clip.right,clip.top);
pDC->LineTo(0,clip.bottom);
pDC->SelectObject(oldpen);
pen.DeleteObject();
pDC->TextOut(10,10,pText);
pDC->TextOut(30,80,pText);
pDC->TextOut(50,150,pText);
}
void CTestDlg::ClipboardBitmap()
{
if(OpenClipboard())
{
EmptyClipboard();
CBitmap * junk = new CBitmap();
CClientDC cdc(this);
CDC dc;
dc.CreateCompatibleDC(&cdc);
CRect client(0,0,200,200);
junk->CreateCompatibleBitmap(&cdc,client.Width(),client.Height());
dc.SelectObject(junk);
DrawImage(&dc,CString("Bitmap"));
SetClipboardData(CF_BITMAP,junk->m_hObject);
CloseClipboard();
delete junk;
}
//到这里好用,往画图里面粘贴可以
if(OpenClipboard())
{
HBITMAP handle = (HBITMAP)GetClipboardData(CF_DIB);
//这个handle就是空了,下面的自然也就不行,不知道为什么
CBitmap * bm = CBitmap::FromHandle(handle);
CClientDC cdc(this);
CDC dc;
dc.CreateCompatibleDC(&cdc);
dc.SelectObject(bm);
cdc.BitBlt(0,0,200,200,&dc,0,0,SRCCOPY);
CloseClipboard();
}
}
------解决方案--------------------
if(OpenClipboard())
{
//获得剪贴板数据
HBITMAP handle = (HBITMAP)GetClipboardData(CF_BITMAP);
CBitmap * bm = CBitmap::FromHandle(handle);
CClientDC cdc(this);
CDC dc;
dc.CreateCompatibleDC(&cdc);
dc.SelectObject(bm);
cdc.BitBlt(0,0,200,200,&dc,0,0,SRCCOPY);
CloseClipboard();
}
void DrawImage(CDC * pDC, CString pText)
{
CRect clip(0,0,200,200);
pDC->FillSolidRect(clip,RGB(170,170,222));
CPen pen;
pen.CreatePen(PS_SOLID, 3, RGB(255,10,10));
CPen * oldpen = pDC->SelectObject(&pen);
pDC->MoveTo(0,0);
pDC->LineTo(clip.right,clip.bottom);
pDC->MoveTo(clip.right,clip.top);
pDC->LineTo(0,clip.bottom);
pDC->SelectObject(oldpen);
pen.DeleteObject();
pDC->TextOut(10,10,pText);
pDC->TextOut(30,80,pText);
pDC->TextOut(50,150,pText);
}
void CTestDlg::ClipboardBitmap()
{
if(OpenClipboard())
{
EmptyClipboard();
CBitmap * junk = new CBitmap();
CClientDC cdc(this);
CDC dc;
dc.CreateCompatibleDC(&cdc);
CRect client(0,0,200,200);
junk->CreateCompatibleBitmap(&cdc,client.Width(),client.Height());
dc.SelectObject(junk);
DrawImage(&dc,CString("Bitmap"));
SetClipboardData(CF_BITMAP,junk->m_hObject);
CloseClipboard();
delete junk;
}
//到这里好用,往画图里面粘贴可以
if(OpenClipboard())
{
HBITMAP handle = (HBITMAP)GetClipboardData(CF_DIB);
//这个handle就是空了,下面的自然也就不行,不知道为什么
CBitmap * bm = CBitmap::FromHandle(handle);
CClientDC cdc(this);
CDC dc;
dc.CreateCompatibleDC(&cdc);
dc.SelectObject(bm);
cdc.BitBlt(0,0,200,200,&dc,0,0,SRCCOPY);
CloseClipboard();
}
}
------解决方案--------------------
if(OpenClipboard())
{
//获得剪贴板数据
HBITMAP handle = (HBITMAP)GetClipboardData(CF_BITMAP);
CBitmap * bm = CBitmap::FromHandle(handle);
CClientDC cdc(this);
CDC dc;
dc.CreateCompatibleDC(&cdc);
dc.SelectObject(bm);
cdc.BitBlt(0,0,200,200,&dc,0,0,SRCCOPY);
CloseClipboard();
}