Bitmap到CBitmap的转换

本文介绍如何使用C++进行位图创建、转换及绘制,并展示了具体代码实现过程,包括利用CBitmap进行HBITMAP的获取与释放。
 

Bitmap* tpBitmap = new Bitmap(width,height,PixelFormat24bppRGB);

HBITMAP aaa1;

BITMAP bm;

tpBitmap ->GetHBITMAP(Color(0,0,0),&aaa1);

CBitmap* pbm = CBitmap::FromHandle(aaa1);

 

//使用

pbm->GetBitmap(&bm);

// Paint the image.

CBitmap* pOldBitmap = dcImage.SelectObject(pbm);

pDC->SetStretchBltMode(COLORONCOLOR);

pDC->StretchBlt(rstRect->left, rstRect->top ,rstRect->Width(),rstRect->Height() , &dcImage, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);

dcImage.SelectObject(pOldBitmap);

 

pbm->DeleteObject();

delete tpBitmap;

 

///!!注意pbm无法将之保存留作长周期的,?好像在一定的时间后会自动释放?

///但是也不能够不释放,因为不释放下次再进入改程序段则会另外分配地址空间,则在短时间内系统会占用太多的资源

<think> 嗯,用户想了解CBitmapBITMAP的区别。之前系统提供的引用材料已经给出了基本概念,但需要更系统地梳理。 用户可能是Windows平台的C++开发者,正在使用MFC框架处理位图资源。从ta直接询问两个术语的区别来看,ta应该已经遇到了实际开发问题,比如在资源加载或图像操作时混淆了这两个类型。 先对比本质区别:BITMAP是SDK层面的结构体,就像裸数据容器;而CBitmap是MFC的类封装,像带工具的包装箱。引用[2]提到CBitmap包含操作功能这点很重要,需要强调。 内存管理差异值得展开:BITMAP需要手动管理生命周期,而CBitmap遵循RAII原则。用户如果遇到过资源泄漏问题,这点会很实用。 注意到引用[3][4]给出了转换示例,但用户没问转换方法,暂时不必展开。不过引用[5]显示用户可能长期困惑于位图概念体系,可以补充说明:BITMAP描述图像元数据(宽高/色深等),CBitmap则代表图像实体+操作方法。 应该提醒常见陷阱:比如直接修改BITMAP结构体不会同步到CBitmap对象,因为BITMAP只是快照。这点引用材料没提及但实践中容易踩坑。 最后保留拓展性:如果用户后续问及转换或HBITMAP,再补充具体API用法。当前回答已覆盖核心区别,并准备了相关问题引导深入。 </think> 根据引用内容,CBitmapBITMAP 的本质区别如下(附操作示例): ### 核心区别 1. **本质不同** - **BITMAP**:Windows SDK 中的**结构体**(C 语言风格),仅存储位图元数据(宽/高/颜色格式/像素位值等)。 ```c typedef struct tagBITMAP { LONG bmWidth; // 宽度(像素) LONG bmHeight; // 高度(像素) LONG bmWidthBytes;// 每行字节数 WORD bmPlanes; // 颜色平面数 WORD bmBitsPixel; // 每像素位数 LPVOID bmBits; // 像素数据指针 } BITMAP; ``` - **CBitmap**:MFC 框架中的**类**(C++ 对象),封装了位图资源及其操作(加载/创建/销毁等),本质是对 `HBITMAP` 的面向对象封装[^2]。 2. **功能差异** - BITMAP 仅提供**静态数据描述**(如获取位图尺寸): ```cpp BITMAP bmInfo; ::GetObject(hBitmap, sizeof(BITMAP), &bmInfo); // 通过HBITMAP获取信息 ``` - CBitmap 提供**完整操作方法**(资源管理+API封装): ```cpp CBitmap mfcBmp; mfcBmp.LoadBitmapW(IDB_MYBITMAP); // 从资源加载 mfcBmp.GetBitmap(&bmInfo); // 直接获取BITMAP信息[^3] ``` 3. **内存管理** - BITMAP 不管理资源,需手动操作 `bmBits` 指针 - CBitmap 通过 RAII 机制自动管理 `HBITMAP` 资源生命周期(析构时自动释放)[^2]。 ### 转换关系示例 ```cpp // HBITMAPCBitmap HBITMAP hBmp = ::CreateCompatibleBitmap(hDC, 100, 100); CBitmap mfcBmp; mfcBmp.Attach(hBmp); // 关联HBITMAP资源[^1] // CBitmapBITMAP BITMAP bm; mfcBmp.GetBitmap(&bm); // 获取位图元数据[^3] // CBitmap → HBITMAP HBITMAP hBmp2 = mfcBmp.GetSafeHandle(); // 获取底层句柄[^1] ``` ### 关键总结 | **特性** | BITMAP | CBitmap | |----------------|----------------------------|----------------------------------| | **类型** | 结构体(数据容器) | 类(资源管理器+操作接口) | | **所属框架** | Windows SDK | MFC | | **资源管理** | 不管理像素内存 | 自动管理关联的 `HBITMAP` | | **典型用途** | 查询位图参数 | 加载/创建/绘制位图 | | **操作支持** | 无成员方法,需API函数操作 | 封装了位图操作方法(如`LoadBitmap`) | > 简单说:**BITMAP 是位图的“身份证”(记录信息),CBitmap 是位图的“管家”(持有资源并操作)**[^2][^5]。 --- ### 相关问题 1. **如何在 MFC 中通过 CBitmap 显示位图到窗口?** 2. **BITMAP 结构中的 `bmBits` 指针在使用时需要注意哪些内存问题?** 3. **HBITMAPCBitmap 在资源释放时有何差异?** 4. **非 MFC 程序(如 Win32 API)中如何操作位图资源?**
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值