GDI和GDI+对象的互相转换[r]

本文详细介绍了如何在MFC项目中混合使用GDI+和GDI,包括CDC到Graphics的转换、CBitmap到Graphics的转换、Bitmap到CBitmap的转换、保存Bitmap时的文件锁定问题解决方案,以及Graphics到HDC的转换方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当然希望可以使用GDI+来完全代替GDI,再不济也只需要从GDI对象转到GDI+对象。但是就是有那么些半吊子的工程,又要新技术新特性、又希望快速开发、又不肯丢弃旧版本的已有的功能。没办法,只能打补丁。石头、剪子、不......

1.CDC到Graphics只要这样:

None.gifGraphics g(pDC->GetSafeHdc());//只要能构造CDC句柄的MFC对象都可以
None.gif
//CClientDC、CPaintDC,也都可以 
None.gif


2.CBitmap到Graphics需要创建一个内存位图设备:

None.gifCDC MemDC; 
None.gifCBitmap MemBitmap;
None.gifMemDC.CreateCompatibleDC(pDC);
None.gifMemBitmap.CreateCompatibleBitmap(pDC,size.cx, size.cy);
None.gifCBitmap 
*pOldBit=MemDC.SelectObject(&MemBitmap);
None.gifGraphics g(MemDC.GetSafeHdc());
ExpandedBlockStart.gifContractedBlock.gif
/**////… you can work with GDI+ … ///
InBlock.gif

或者使用:

None.gifBitmap::Bitmap(HBITMAP,HPALETTE)

以及

None.gifstatic Bitmap *FromHBITMAP(HBITMAP hbm,HPALETTE hpal)


3.想要用Bitmap来打开图片,却又需要用GDI的绘图函数来操作(一般都为历史遗留问题),就需要将Bitmap对象转换到CBitmap,可以这样:

None.gifBitmap* pPicture = new Bitmap(L"dotLive.jpg");
None.gifHBITMAP hBitmap;
None.gifCBitmap
* pbm;
None.gifpPicture
->GetHBITMAP(Color(0,0,0),&hBitmap);
None.gifpbm 
= CBitmap::FromHandle(aaa1);
ExpandedBlockStart.gifContractedBlock.gif
/**////… use pbm to do the GDI works dot.gif///
None.gifpbm->DeleteObject();//要记得删除GDI对象,否则你会发现你的内存占用…
None.gif

None.gif

CView使用OnPaint打印图像就是一个例子,使用GDI+无法在打印纸上打印出图像,只有一片空白。在找到原因之前,只好从GDI+转换到GDI使用BitBlt和StretchBlt方式来打印。


4.保存Bitmap,打开很方便,保存就不那么的方便了。Bitmap或者Image打开图像会自动锁定文件,保存时会产生文件被使用之类的错误。一种折衷的办法是,保存时全新创建一个Bitmap(Image)对象,将原来的对象画到新对象上,然后将原来的对象删除以释放文件。保存新对象。不能用clone,它会将锁定的文件资源一块复制过来,则解锁文件需要的释放对象就又多了一个。

None.gifBitmap* tPic= new Bitmap(L"dotLive.jpg");//锁定文件
None.gif
Bitmap* pPicture = new Bitmap(tPic->GetWidth()
None.gif                                         ,tPic
->GetHeight()
None.gif                                         ,tPic
->GetPixelFormat());
None.gifGraphics g(pPicture);
None.gifg.DrawImage(tPic,
0,0,m_nWidth,m_nHeight);//复制过来
None.gif
delete tPic;//解锁
ExpandedBlockStart.gifContractedBlock.gif
/**//// … use the pPicture to access "dotLive.jpg" … ///
None.gifCLSID tiffClsid;
None.gifGetEncoderClsid(L
"image/jpeg"&tiffClsid);//这个函数MSDN中有
None.gif
pPicture->Save(L"dotLive.jpg" ,&tiffClsid);//保存
None.gif

 

5.Graphics到HDC,想要用Bitmap方便打开图像,又要往图像里写文字作图等。糟糕的是由于历史遗留问题,这些操作都是使用GDI完成的。并且GDI+没有异或绘图模式(实现橡皮筋效果)、没有文字输出底色不透明、字符串需要转换到WChar。咋办呢,可以这样转:

None.gifBitmap* pPicture = new Bitmap(L"dotLive.jpg");//打开图片
None.gif
Graphics tempG(pPicture );
None.gifHDC hdc 
= tempG.GetHDC ();//获得GDI句柄
None.gif
CDC* tempDC = CDC::FromHandle(hdc);
ExpandedBlockStart.gifContractedBlock.gif
/**//// … hurry up, draw what you want … ///
None.giftempG.ReleaseHDC(hdc); //要记得relese,GDI都需要释放,否则资源会被占用而不接受其他操作
None.gif

转载于:https://www.cnblogs.com/dotLive/archive/2006/08/25/486588.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值