BMP怎样调入剪贴板?

zkxz 2004-03-29 02:13:35
请问如何将资源中的位图(比如,IDC_BITMAP1)装入到剪贴板中?
...全文
53 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
wxblcl 2004-03-30
  • 打赏
  • 举报
回复
void toClipboard(CWnd * wnd, BOOL FullWnd)
{
CDC dc;
if(FullWnd)
{ /* full window */
HDC hdc = ::GetWindowDC(wnd->m_hWnd);
dc.Attach(hdc);
} /* full window */
else
{ /* client area only */
HDC hdc = ::GetDC(wnd->m_hWnd);
dc.Attach(hdc);
} /* client area only */

CDC memDC;
memDC.CreateCompatibleDC(&dc);

CBitmap bm;
CRect r;
if(FullWnd)
wnd->GetWindowRect(&r);
else
wnd->GetClientRect(&r);

CString s;
wnd->GetWindowText(s);
CSize sz(r.Width(), r.Height());
bm.CreateCompatibleBitmap(&dc, sz.cx, sz.cy);
CBitmap * oldbm = memDC.SelectObject(&bm);
memDC.BitBlt(0, 0, sz.cx, sz.cy, &dc, 0, 0, SRCCOPY);

wnd->GetParent()->OpenClipboard();
::EmptyClipboard();
::SetClipboardData(CF_BITMAP, bm.m_hObject);
CloseClipboard();

memDC.SelectObject(oldbm);
bm.Detach(); // make sure bitmap not deleted with CBitmap object
}
zkxz 2004-03-30
  • 打赏
  • 举报
回复
多谢两位!程序搞定了!虽然我没用上你们的代码,但从你们的代码中我得到了启发。多谢!
快乐鹦鹉 2004-03-29
  • 打赏
  • 举报
回复
你可以将HBITMAP直接写到剪贴板吧?
有个例子,你看一下,有没有帮助。不过不是我写的。我写过文本以及自定义格式的东西,就是没写过图像。
----------
CBitmap bitmapCopy;
if (!bitmapCopy.CreateCompatibleBitmap (&dc, m_sizeImage.cx, m_sizeImage.cy))
{
AfxMessageBox (IDP_BCGBARRES_CANT_COPY_BITMAP);
return;
}

CBitmap* pOldBitmapDest = memDCDest.SelectObject (&bitmapCopy);
CBitmap* pOldBitmapSrc = memDCSrc.SelectObject (m_pBitmap);

memDCDest.BitBlt (0, 0, m_sizeImage.cx, m_sizeImage.cy,
&memDCSrc, 0, 0, SRCCOPY);

memDCDest.SelectObject (pOldBitmapDest);
memDCSrc.SelectObject (pOldBitmapSrc);

if (!OpenClipboard ())
{
AfxMessageBox (IDP_BCGBARRES_CANT_COPY_BITMAP);
return;
}

if (!::EmptyClipboard ())
{
AfxMessageBox (IDP_BCGBARRES_CANT_COPY_BITMAP);
::CloseClipboard ();
return;
}


HANDLE hclipData = ::SetClipboardData (CF_BITMAP, bitmapCopy.Detach ());
if (hclipData == NULL)
{
AfxMessageBox (IDP_BCGBARRES_CANT_COPY_BITMAP);
TRACE (_T("CBCGImageEditDlg::Copy() error. Error code = %x\n"), GetLastError ());
}

::CloseClipboard ();
zkxz 2004-03-29
  • 打赏
  • 举报
回复
还是不行,happyparrot(快乐鹦鹉)大哥,能不能给个例子啊!我已经郁闷好几天了。
快乐鹦鹉 2004-03-29
  • 打赏
  • 举报
回复
应该可以用LocalSize或者GlobalSize函数获取HBITMAP的大小。
zkxz 2004-03-29
  • 打赏
  • 举报
回复
我试过了,还是不行,程序运行之后,剪贴板查看器里面会显示:ClipBook Viewer cannot display the information in its current format or there is not enough memory to display it.Quit one or more applications to increase the available memory,and then try again.
我这一段的代码是:
HBITMAP hBitmap=(HBITMAP)LoadImage(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP1),IMAGE_BITMAP,0,0,LR_DEFAULTCOLOR);
HGLOBAL hMem=GlobalAlloc(GHND|GMEM_SHARE,19*19*3);
LPBITMAP lpBmpData=(LPBITMAP)GlobalLock(hMem);
memcpy(lpBmpData,hBitmap,19*19*3);
if(OpenClipboard())
{
EmptyClipboard();
SetClipboardData(CF_BITMAP,hMem);
CloseClipboard();
}
GlobalFree(hMem);
请帮忙看看,是什么问题。多谢了!
快乐鹦鹉 2004-03-29
  • 打赏
  • 举报
回复
那就19*19*3。
zkxz 2004-03-29
  • 打赏
  • 举报
回复
我用的也是那种方法,但就是没法把图片正确的放到剪贴板中。我绝的是图片大小的计算有问题,我用的图片都是19*19*24bit,不知道在用GlobalAlloc时第二个参数填多少?
快乐鹦鹉 2004-03-29
  • 打赏
  • 举报
回复
将图像资源转换为HBITMAP句柄。
然后参考http://expert.csdn.net/Expert/topic/2881/2881101.xml?temp=.9424555

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧