如何复制一个CBitmap对象 存在两个CBitmap对象: ScrBmp和DestBmp,请问高手如何将ScrBmp中的内容复制到DestBmp 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 int GetBitmap( BITMAP* pBitMap );BOOL CreateBitmapIndirect( LPBITMAP lpBitmap ); 实际上3楼说的对。要是不行。就用下面的我写的一段代码吧。下面代码的意思是:复制当前的位图句柄。HBITMAP CSIDropSource::CopyBitmap(HBITMAP hSourceHbitmap //The source bitmap handle. (I) ){ CDC sourceDC; CDC destDC; sourceDC.CreateCompatibleDC(NULL); destDC.CreateCompatibleDC(NULL); //The bitmap information. BITMAP bm = {0}; //Get the bitmap information. ::GetObject(hSourceHbitmap, sizeof(bm), &bm); // Create a bitmap to hold the result HBITMAP hbmResult = ::CreateCompatibleBitmap(CClientDC(NULL), bm.bmWidth, bm.bmHeight); HBITMAP hbmOldSource = (HBITMAP)::SelectObject( sourceDC.m_hDC, hSourceHbitmap); HBITMAP hbmOldDest = (HBITMAP)::SelectObject( destDC.m_hDC, hbmResult ); destDC.BitBlt(0,0,bm.bmWidth, bm.bmHeight, &sourceDC, 0, 0, SRCCOPY ); // Restore DCs ::SelectObject( sourceDC.m_hDC, hbmOldSource ); ::SelectObject( destDC.m_hDC, hbmOldDest ); ::DeleteObject(sourceDC.m_hDC); ::DeleteObject(destDC.m_hDC); return hbmResult;}DestBmp.Attach(中的参数是位图句柄) /************************************************************************* * * 函数名称: * CopyHandle() * * 参数: * HGLOBAL h - 要复制的内存区域 * * 返回值: * HGLOBAL - 复制后的新内存区域 * * 说明: * 该函数复制指定的内存区域。返回复制后的新内存区域,出错时返回0。 * ************************************************************************/HGLOBAL WINAPI CopyHandle (HGLOBAL h){ if (h == NULL) return NULL; // 获取指定内存区域大小 DWORD dwLen = ::GlobalSize((HGLOBAL) h); // 分配新内存空间 HGLOBAL hCopy = ::GlobalAlloc(GHND, dwLen); // 判断分配是否成功 if (hCopy != NULL) { // 锁定 void* lpCopy = ::GlobalLock((HGLOBAL) hCopy); void* lp = ::GlobalLock((HGLOBAL) h); // 复制 memcpy(lpCopy, lp, dwLen); // 解除锁定 ::GlobalUnlock(hCopy); ::GlobalUnlock(h); } return hCopy;}这是一个例子程序的一部分,发给你,就是复制句柄,即实现位图的复制,特别 注意的是,256色和24位真彩有一点区别。响应菜单函数后可以应用,原程序是剪切板技术,不过这段代码很好用,我的程序就是用这段程序,写得很好! 谢谢TopLevel ,采用你的方法搞定了。 vc中,BOOL竟然是 int 类型的别名,令我大吃一惊呀? DIRECTX 贴图问题 有没有办法给IE加一个菜单项目 广州的公司有没有要人的 在对话框内任意处绘图的问题! 如何学习VC++ 鄙人刚学vc++,谢谢指教(很简单的)。 关于滚动条的一个问题 *****请问高手,一个installshield安装文件的制作问题,做好setup.exe后,运行这一安装程序后出现如下错误:**** 呵呵,从未想过却遇到的新问题 关于堆栈和内存堆的概念,我的理解对不对,请大家参与 关于CTime::GetCurrentTime ();
BOOL CreateBitmapIndirect( LPBITMAP lpBitmap );
要是不行。
就用下面的我写的一段代码吧。
下面代码的意思是:
复制当前的位图句柄。
HBITMAP CSIDropSource::CopyBitmap(HBITMAP hSourceHbitmap //The source bitmap handle. (I) )
{
CDC sourceDC;
CDC destDC;
sourceDC.CreateCompatibleDC(NULL);
destDC.CreateCompatibleDC(NULL);
//The bitmap information.
BITMAP bm = {0};
//Get the bitmap information.
::GetObject(hSourceHbitmap, sizeof(bm), &bm);
// Create a bitmap to hold the result
HBITMAP hbmResult = ::CreateCompatibleBitmap(CClientDC(NULL), bm.bmWidth, bm.bmHeight); HBITMAP hbmOldSource = (HBITMAP)::SelectObject( sourceDC.m_hDC, hSourceHbitmap);
HBITMAP hbmOldDest = (HBITMAP)::SelectObject( destDC.m_hDC, hbmResult );
destDC.BitBlt(0,0,bm.bmWidth, bm.bmHeight, &sourceDC, 0, 0, SRCCOPY ); // Restore DCs
::SelectObject( sourceDC.m_hDC, hbmOldSource );
::SelectObject( destDC.m_hDC, hbmOldDest );
::DeleteObject(sourceDC.m_hDC);
::DeleteObject(destDC.m_hDC); return hbmResult;
}DestBmp.Attach(中的参数是位图句柄)
*
* 函数名称:
* CopyHandle()
*
* 参数:
* HGLOBAL h - 要复制的内存区域
*
* 返回值:
* HGLOBAL - 复制后的新内存区域
*
* 说明:
* 该函数复制指定的内存区域。返回复制后的新内存区域,出错时返回0。
*
************************************************************************/HGLOBAL WINAPI CopyHandle (HGLOBAL h)
{
if (h == NULL)
return NULL; // 获取指定内存区域大小
DWORD dwLen = ::GlobalSize((HGLOBAL) h);
// 分配新内存空间
HGLOBAL hCopy = ::GlobalAlloc(GHND, dwLen);
// 判断分配是否成功
if (hCopy != NULL)
{
// 锁定
void* lpCopy = ::GlobalLock((HGLOBAL) hCopy);
void* lp = ::GlobalLock((HGLOBAL) h);
// 复制
memcpy(lpCopy, lp, dwLen);
// 解除锁定
::GlobalUnlock(hCopy);
::GlobalUnlock(h);
} return hCopy;
}这是一个例子程序的一部分,发给你,就是复制句柄,即实现位图的复制,特别 注意的是,256色和24位真彩有一点区别。响应菜单函数后可以应用,原程序是剪切板技术,不过这段代码很好用,我的程序就是用这段程序,写得很好!