1、有关IPicture加载图片后直接Render到内存DC的问题(HBITMAP转换IPicture)
Picture的方法get_Handle可以直接得到图片的句柄

IPicture *pIPicture;
HBITMAP hBitmap;
...
pIPicture->get_Handle((OLE_HANDLE *)&hBitmap);

2、CBitmap 转换 HBITMAP
CBitmap m_bitMap;
HBITMAP m_hBitMap;
m_bitMap.LoadBitmap(IDB_BITMAP);
m_hBitMap=(HBITMAP)m_bitMap.GetSafeHandle();
3、HBITMAP转换 CBitmap
CBitmap cbMMyBitmap;//用来显示动画的位图
HBITMAP hMMyHBitmap;//用来显示动画的位图的句柄
BITMAP bMMyBitmapInfo;//位图信息
cbMMyBitmap.Attach(hMMyHBitmap);
cbMMyBitmap.GetBitmap(&bMMyBitmapInfo);
4、DrawDibDraw和AlphaBlend
一:这两个函数都是绘制 DIB 的。
我在使用过程中发现这两个函数对于 32 位的位图,Alpha通道不能正确显示。就是说,该透明的地方不透明。
说明一下,位图没有问题的,用看图软件或PS之类的都可以正确显示。

我想问一下,是我的原因还是这两个函数本来就不支持32位位图?

ps.显示32位位图可以用AlphaBlend实现的,但是这个函数是绘制场景里的 DDB 的。由于我想显示的是 DIB,不想转来转去的,所以这个函数先不考虑。
二:StretchDIBits 或 DrawDibDraw 就没法显示带透明属性的图片
要显示带透明属性的图片只能用别的方法 例如 GDI+
5、
回答(1)
CBitmap::GetBitmap
回答人:软界网友 
回答(2)
每个成员变量都赋值。
回答人:软界网友 
回答(3)
CBitmap::GetBitmap是把CBitmap的信息赋给BITMAP结构
我问的是BITMAP赋给CBitmap
回答人:软界网友 
回答(4)
创建CBitmap对象时,采用BITMAP指定信息
回答人:软界网友 
回答(5)
是用构造函数吗?
CBitmap::CBitmap(BITMAP bitmap)好像没有这个构造函数
回答人:软界网友 
回答(6)
CBitmap::FromHandle(HBITMAP hBitmap )

回答(7)
HBITMAP CreateBitmapIndirect(
CONST BITMAP *lpbm // bitmap data
);
6、用GDI实现位图透明显示

下面是实现中几个关键的地方:
[cpp]
////////////////////////////////////////////////////////////////////////// 
////把位图bmpFile的特定矩形区域rtWant上的所有像素的数据读取到缓冲区pBuf中 
int CChildView::GetPixFromBmp(CString fileName,CRect rtWant,BYTE *pBuf) 

BITMAPINFOHEADER headInfo; 
ZeroMemory(&headInfo,sizeof(headInfo)); 
int imageHeight; 
int imageWidth; 
 
CFile file; 
file.Open(fileName, CFile::modeRead); 
file.Seek(14, CFile::begin); 
file.Read(&headInfo, 40); ///-- 从文件中读去位图的BITMAPINFOHEADER信息 
imageWidth = headInfo.biWidth; 
imageHeight = headInfo.biHeight; 
if(headInfo.biBitCount!=32) 

MessageBox(fileName+"不是32位位图"); 

 
for(int i=0;i<rtWant.Height();i++) 

file.Seek(54+(imageHeight- rtWant.bottom+i)*imageWidth*headInfo.biBitCount/8+rtWant.left*headInfo.biBitCount/8,CFile::begin); 
file.Read(pBuf+i*rtWant.Width()*headInfo.biBitCount/8,rtWant.Width()*headInfo.biBitCount/8);  

file.Close(); 
 
return 0; 

 
////////////////////////////////////////////////////////////////////////// 
//// pDesBuf:目的表面缓冲区,W,H--目的表面的宽和高 
//// pSrcBuf: 源表面缓冲区 
//// pRetBuf:结果保存到这个缓冲区中,与pDesBuf兼容 
//// rtBlend:源表面缓冲区与目的表面缓冲区进行alpha混合的矩形区域 
//// alpha : 需要透明的百分比,0---完全透明,1 -- 完全不透明 
void CChildView::MyBlend(BYTE* pDesBuf,BYTE* pSrcBuf,BYTE* pRetBuf,CRect rtBlend,int W,int H,float alpha) 

memcpy(pRetBuf,pDesBuf,W*H*4); 
for(int i=0;i<rtBlend.Height();i++) 

for(int j=0;j<rtBlend.Width();j++) 

long posDesPix = ((H-rtBlend.bottom+i)*W+rtBlend.left+j)*4; 
long posSrcPix = (i*rtBlend.Width()+j)*4; 
pRetBuf[posDesPix+0] = BYTE(pDesBuf[posDesPix+0]*(1-alpha) + pSrcBuf[posSrcPix+0]*(alpha)); 
pRetBuf[posDesPix+1] = BYTE(pDesBuf[posDesPix+1]*(1-alpha) + pSrcBuf[posSrcPix+1]*(alpha)); 
pRetBuf[posDesPix+2] = BYTE(pDesBuf[posDesPix+2]*(1-alpha) + pSrcBuf[posSrcPix+2]*(alpha)); 
pRetBuf[posDesPix+3] = BYTE(pDesBuf[posDesPix+3]*(1-alpha) + pSrcBuf[posSrcPix+3]*(alpha)); 



 

 
///-- 设置位图的BITMAPINFOHEADER信息 
ZeroMemory(&m_headInfo,sizeof(m_headInfo)); 
m_headInfo.biSize = sizeof(m_headInfo); 
m_headInfo.biPlanes = 1; 
m_headInfo.biBitCount = 32; // 24 
m_headInfo.biCompression = BI_RGB; 
m_headInfo.biWidth = m_rtShow.Width(); 
m_headInfo.biHeight = m_rtShow.Height(); 
m_headInfo.biSizeImage = m_nLen; 
 

 
void CChildView::OnPaint()  

CPaintDC dc(this); // device context for painting 
 
StretchDIBits(m_MemDC.GetSafeHdc(),0,0,m_rtShow.Width(),m_rtShow.Height(), 
0,0,m_rtShow.Width(),m_rtShow.Height(),(void*)m_pCurrBuf,(BITMAPINFO*)&m_headInfo,NULL,SRCCOPY); 
 
dc.BitBlt(m_rtShow.left,m_rtShow.top,m_rtShow.Width(),m_rtShow.Height(), 
&m_MemDC,0,0,SRCCOPY); 
 
}

IPicture、BITMAP、HBITMAP和CBitmap的关系的更多相关文章

  1. CBitmap,HBitmap,Bitmap区别及联系

    加载一位图,可以使用LoadImage: HANDLE LoadImage(HINSTANCE hinst,LPCTSTR lpszName,UINT uType,int cxDesired,int ...

  2. C++ CBitmap,HBitmap,Bitmap区别及联系

    加载一位图,可以使用LoadImage: HANDLE LoadImage(HINSTANCE hinst,LPCTSTR lpszName,UINT uType,int cxDesired,int ...

  3. Bitmap、CBitmap、HBITMAP以及BITMAP的相互转换

    Bitmap.CBitmap.HBITMAP以及BITMAP的相互转换 构建CBitmapCBitmap bmp;bmp.LoadBitmap(ID); 构建HBITMAPHBitmap = (HBI ...

  4. CBitmap Detach和DeleteObject的关系

    注意:当使用完资源后,必须通过调用函数以释放加速器表.位图.光标.图标以及菜单所占的内存资源:      加速器表:DesteoyAcceleratorTable:      位图:DeleteObj ...

  5. IPicture总结

    1.利用IPicture接口加载.显示图片 IPicture接口管理一个图片对象和它的属性.图片对象提供对Bitmap Icon Metafile的语言不相关的抽象支持.图像对象的主要接口是IPict ...

  6. 根据图像路径,创建CBitmap对象的方法

    因为项目的关系,需要根据图像路径,创建CBitmap对象.起初查资料找到了LoadBitmap这个函数,根据CSDN得 BOOL LoadBitmap ( LPCTSTR lpszResourceNa ...

  7. 【VS开发】IPicture在指定窗口绘制图

    1.利用IPicture接口加载.显示图片 IPicture接口管理一个图片对象和它的属性.图片对象提供对Bitmap Icon Metafile的语言不相关的抽象支持.图像对象的主要接口是IPict ...

  8. VC++ GDI 总结 一一 CBitmap类

    class CBitmap : public CGdiObject { DECLARE_DYNAMIC(CBitmap) public: static CBitmap* PASCAL FromHand ...

  9. Bitmap: a C++ class

    Bitmap: a C++ class        The five steps involved to draw a bitmap: Load bitmap using LoadBitmap or ...

随机推荐

  1. linux源码阅读笔记 #define 语句的妙用

    #define 语句用于宏定义,在c中,我们可以用其实现函数的功能.如下语句 #define test(a,b)  a>b?a:b 很显然,这是一个比较大小的语句.这里a,b相当于函数中的参数. ...

  2. OneAlert:国内首家 SaaS 模式的云告警平台

    随着互联网行业的高速发展,企业 IT 应用环境日趋复杂.几分钟的故障就会严重到用户体验,那么如何有效降低IT故障带来的影响呢?权威数据表明,86%的企业认为建立有效的监控系统和告警系统.提升 IT 的 ...

  3. git安装及使用

    一.安装 1.从http://code.google.com/p/msysgit/下载Git-1.8.4-preview20130916.exe,并安装. 2.新建git目录,右键选择Git Bash ...

  4. APT工作原理

    两篇好的文章:http://blog.csdn.net/newjueqi/article/details/6679857 http://blog.csdn.net/buguyiqie/article/ ...

  5. call,apply,bind方法的总结

    why?call,apply,bind干什么的?为什么要学这个? 一般用来指定this的环境,在没有学之前,通常会有这些问题. var a = { user:"追梦子", fn:f ...

  6. C#中的文件操作

    在.NET Framework 中进行的所有输入和输出工作都要用到流(stream) 有两种类型的流: 输出流:当向某些外部目标写入数据时,就要用到输出流(将数据写入到文件中). 输入流:用于将数据读 ...

  7. 典型重构3 (Try/Catch)

    Try/Catch 块过多 public Customer GetCustomer(string customerId) { try { var command = new SqlCommand(); ...

  8. 李洪强iOS开之【零基础学习iOS开发】【02-C语言】04-常量、变量

    在我们使用计算机的过程中,会接触到各种各样的数据,有文档数据.图片数据.视频数据,还有聊QQ时产生的文字数据.用迅雷下载的文件数据等.这讲我们就来介绍C语言中数据的处理. 一.数据的存储 1.数据类型 ...

  9. lintcode :旋转字符串

    题目: 旋转字符串 给定一个字符串和一个偏移量,根据偏移量旋转字符串(从左向右旋转) 样例 对于字符串 "abcdefg". offset=0 => "abcdef ...

  10. 【Linux高频命令专题(16)】less

    概述 less 工具也是对文件或其它输出进行分页显示的工具,应该说是linux正统查看文件内容的工具,功能极其强大.less 的用法比起 more 更加的有弹性.在 more 的时候,我们并没有办法向 ...