如何把HBitmap句柄中的位图数据拷贝到另一块内存区域里?

madlas 2000-11-19 04:38:00
我需要把HBitmap句柄中的位图数据拷贝到一块内存区域里,并用一个指针指向这块区域,不知该用什么API函数?
...全文
635 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
老魏2006 2000-11-21
  • 打赏
  • 举报
回复
void CBlat2View::OnDraw(CDC* pDC)
{
CBlat2Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);

// load IDB_BITMAP1 from our resources
CBitmap bmp;
if (bmp.LoadBitmap(IDB_BITMAP1))
{
// Get the size of the bitmap
BITMAP bmpInfo;
bmp.GetBitmap(&bmpInfo);

// Create an in-memory DC compatible with the
// display DC we're using to paint
CDC dcMemory;
dcMemory.CreateCompatibleDC(pDC);

// Select the bitmap into the in-memory DC
CBitmap* pOldBitmap = dcMemory.SelectObject(&bmp);

// Find a centerpoint for the bitmap in the client area
CRect rect;
GetClientRect(&rect);
int nX = rect.left + (rect.Width() - bmpInfo.bmWidth) / 2;
int nY = rect.top + (rect.Height() - bmpInfo.bmHeight) / 2;

// Copy the bits from the in-memory DC into the on-
// screen DC to actually do the painting. Use the centerpoint
// we computed for the target offset.
pDC->BitBlt(nX, nY, bmpInfo.bmWidth, bmpInfo.bmHeight, &dcMemory,
0, 0, SRCCOPY);

dcMemory.SelectObject(pOldBitmap);
}
else
TRACE0("ERROR: Where's IDB_BITMAP1?\n");
}
madlas 2000-11-21
  • 打赏
  • 举报
回复
请问BITBLT该怎么用呢?不好意思,我是菜鸟。
老魏2006 2000-11-20
  • 打赏
  • 举报
回复
不至于这么麻烦吧。
用bitblt、streatchblt、
BCB里面的CopyRect等等,都可以使先你上面提到的功能,而且更简单。

如果没有包含MFC,你不能使用CBitmap。因为如果使用了MFC,就不能包含Windows.h这个文件。
madlas 2000-11-19
  • 打赏
  • 举报
回复
两位大虾,真不好意识,GETBITMAPBITS我已用过,代码是这样的:
char * dd;
dd= new char(500);
GetBitmapBits(已有数据的位图句柄,500,dd);
SetBitmapBits(已有数据的位图句柄,500,dd);
这段代码本想将原有的位图数据,截掉后面一块,只剩下500个字节的数据,再将它反还个原有句柄,显示出来就只有原有位图的前面一部分了,但我在C++BUILD中一运行就出错,不知为什么?
再说开发文档中强烈建议在WIN32下不要用这个函数,而用GetDIBits函数,不知这个函数能否适用于我,该怎么用?

还有SUN2000大虾,因为我用的是WINDOWS APPLICATION模版,而没有用MFC模版,我加上这个CBitmap的头文件,编译时就报告WINDOWS.h已存在...
sun2000 2000-11-19
  • 打赏
  • 举报
回复
可以在msdn中找一下foxbear的一个游戏例子程序
sun2000 2000-11-19
  • 打赏
  • 举报
回复
不好意思多打了一条
sun2000 2000-11-19
  • 打赏
  • 举报
回复
你要操作它必需知道HDIB的结构,要不你可以用CBitmap::的Attach操作
老魏2006 2000-11-19
  • 打赏
  • 举报
回复
LONG GetBitmapBits(
HBITMAP hbmp, // handle to bitmap
LONG cbBuffer, // number of bytes to copy
LPVOID lpvBits // buffer to receive bits
);
的到数据之后,想怎么处理,就怎么处理。
VB 做的相册(缩略图预览程序) VB做的小型相册,实际上是一个图片浏览程序,打开时显示缩略图,鼠标点击显示大图片,并可接着浏览下去,程序相关说明:   函数功能: 该函数将指定位图的位拷贝到缓冲区?   函数原型:LONG GetBitmapBits(HBITMAP hbmp, LONG cbBuffer, LPVOID lpvBits);   参数:   hbmp:指向感兴趣的位图句柄?   cbBuffer:指定要从位图拷贝到缓冲区的字节数?   lpvBits:指向接收位图数据的缓冲区指针?这些位是按字节类型存储在数组的?   返回值:如果该函数执行成功,那么返回值就是拷贝到缓冲区的字节数;如果该函数执行失败,那么返回值为0。   Declare Function GetBitmapBits Lib "gdi32" (ByVal hBitmap As Long, ByVal nwCount As Long, lpBits As Any) As Long      函数功能:该函数将位图的颜色数据位设置成指定值?   函数原型:LONG SetBitmapBits(HBITMAP hmbp, DWORD cBytes, CONST VOID (lpBits);   参数:   hbmp:指向要设置的位图句柄?   cBytes:指定参数lpBits指向的数组的字节数?   lpBits:指向字节类型数组的指针?该数组包含了指定位图的颜色数据?   返回值:如果该函数执行成功,则返回值就是在设置位图位时使用的字节数;如果失败,则返回值为0。      函数功能:该函数得到指定图形对象的信息,根据图形对象,函数把填满的或结构,或表项(用于逻辑调色板)数目放入一个指定的缓冲区。   函数原型:int GetObject(HGDIOBJ hgdiobj, int cbBuffer, LPVOID lpvObject);   参数:   hgdiobj:指向感兴趣的图形对象的句柄,它可以是这样的一个句柄:一个逻辑位图、一个刷子、一种字体、一个调色板、笔或通过调用CreateDIBsection函数创建的与设备无关位图。   cbBuffer:指定将要写到缓冲区的信息的字节数目?‘lpvObject:指向一个缓冲区的指针,该缓冲区将要检索指定图形对象的信息。      函数功能描述:将一块内存数据从一个位置复制到另一个位置   函数原型:VOID CopyMemory(PVOID Destination,CONST VOID *Source,DWORD Length);   参数:   Destination:要复制内存块的目的地址?   Source:要复制内存块的源地址?   Length:指定要复制内存块的大小,单位为字节   返回值:该函数为VOID型,没有返回值。

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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