MFC处理jpg等格式图片 Cpicture(二)

                                                                         MFC处理jpg等格式图片(二)

CPicture 类简介:

大概流程:通过IPicture接口实现图片的各种操作

1

IPicture 实现各种图片加载三部曲

1定义两个类指针

IStream *pIStream;//创建一个IStream接口指针,用来保存图片流

IPicture *pIPicture;//创建一个IPicture接口指针,表示图片对象

2 OleLoadPicture()从流中加载数据构成IPicture对象(将数据流合成IPicture对象)

OleLoadPicture(pIStream,0, false, IID_IPicture, (LPVOID*)&(pIPicture));//OleLoadPicture获得IPicture接口指针

3展示你的劳动成果 hDC为设备上下文

pIPicture->Render(hDC,0,0,theRect.Width(),theRect.Height(),0,hmHeight,hmWidth,-hmHeight,NULL);//在指定的DC上绘出图片

2 关于流大家感到不是很客观 :大家可能对一张具体的图片 或文件更加直接

  所以提供这么多接口供选择

       //Load frm various sosurces

         BOOL Load(UINT nIDRes);              //根据加载的图片ID(一般为位图)

         BOOL Load(LPCTSTR pszPathName)      //图片路径例如”D://1.jgp”

         BOOL Load(CFile& file);               //一个文件类(已经与一个文件关联了)

         BOOL Load(CArchive& ar);             //他的对象可以理解为二进制流

         BOOL Load(IStream* pstm);            //

         BOOL Load(char *pBuffer, int nSize);     //文本文件字符数据

   所以封装好流 我们提供你一个文件路径……你就可以完成图片的加载显示而不用去理会那流了

   现在出场的是IPicture

   我们主要是封装他的

   CComQIPtr<IPicture>m_spIPicture;          // ATL smart pointer to IPicture

 看到这句代码。可能有所不理解 你就理解为IPicture *  m_spIPicture 就行了

至于具体:他其实是一个智能指针:百度

具体代码看

1如何将CFile  CArchive转化为流的

主要流程是:

CFile-> CArchive-> CArchiveStream-> IStream

         CArchivear(&file, CArchive::load | CArchive::bNoFlushOnDelete);

CArchiveStreamarcstream(&ar);

Load((IStream*)&arcstream);

2如何将char*转化为流的呢?

         HGLOBALhGlobal = GlobalAlloc(GMEM_MOVEABLE, nSize); 给图片分配全局内存

         void*pData = GlobalLock(hGlobal);锁定内存

         GlobalUnlock(hGlobal);解锁内存

CreateStreamOnHGlobal(hGlobal, TRUE, &pStream);用全局内存初使化IStream接口指针

总结:所以Cpicture 主要封装了Istream流的产生

关于Cpicture源代码:

点击

CSDN CPicture类源代码

MFC(Microsoft Foundation Classes)中,添加PNG格式图片到控件通常涉及以下步骤: 1. **资源文件管理**:首先,你需要将PNG图片放入项目资源文件中。右键点击资源视图,选择“插入”->“新项”,然后选择“位图”(Bitmap),并输入名称。 2. **加载图片数据**:在代码中,你可以通过`CResourceHandle`类来读取资源。例如: ```cpp HBITMAP hBitmap = (HBITMAP)::LoadImage(AfxGetApp()->m_hInstance, MAKEINTRESOURCE(IDC_YOUR_BITMAP_NAME), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_LOADFROMFILE); ``` 这里,`IDC_YOUR_BITMAP_NAME`是你在资源编辑器中为图片指定的资源标识符。 3. **创建CBitmap对象**:使用`CreateCompatibleDC`和`SelectObject`函数将位图数据绑定到设备上下文(Device Context)上,然后创建一个`CBitmap`对象: ```cpp CDC dcMemory; dcMemory.CreateCompatibleDC(NULL); HDC hdcMemory = dcMemory.GetSafe HDC(); CBitmap bitmap(hBitmap, NULL); // 参数设为NULL表示从内存中创建 ``` 4. **设置图片控件**:将创建好的`CBitmap`应用到需要显示图片的控件(如CStatic、CPicture等)上: ```cpp CBitmap* pOldBitmap = targetCtrl.ReplaceBitmap(&bitmap); // 或者直接赋值给控件的Bitmap属性: targetCtrl.SetBitmap(&bitmap); ``` 记得处理好资源释放: ```cpp bitmap.DeleteObject(); // 清理临时资源 DeleteDC(hdcMemory); // 清除设备上下文 DeleteDC(dcMemory.GetSafe HDC()); // 如果有需要,清除内存DC pOldBitmap->Release(); // 如果替换过旧的位图,释放它 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值