博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
GDI和GDI+对象的互相转换[r]
阅读量:7038 次
发布时间:2019-06-28

本文共 2058 字,大约阅读时间需要 6 分钟。

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

1.CDC到Graphics只要这样:

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

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

None.gif
CDC 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.gif
Bitmap::Bitmap(HBITMAP,HPALETTE)

以及

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

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

None.gif
Bitmap
*
 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.gif
pbm
->
DeleteObject();
//
要记得删除GDI对象,否则你会发现你的内存占用…
None.gif
None.gif

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

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

None.gif
Bitmap
*
 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.gif
CLSID 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.gif
Bitmap
*
 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.gif
tempG.ReleaseHDC(hdc); 
//
要记得relese,GDI都需要释放,否则资源会被占用而不接受其他操作
None.gif

转载地址:http://ecnal.baihongyu.com/

你可能感兴趣的文章
Zend Studio使用教程:使用Zend Studio和Zend Server进行根本原因分析 (二)
查看>>
golang的fmt包String(),Error(),Format(),GoString()的接口实现
查看>>
Java技术转(兼顾)产品经理——读《快速转行做产品经理》有感
查看>>
成为优秀Java开发人员的10件事
查看>>
Kali Linux安装教程
查看>>
Android缓存处理
查看>>
JavaScript 数据类型检测终极解决方案
查看>>
年赚百万游戏主播!玩转Python后:几行代码轻松“吃鸡” 附源码
查看>>
【python】使用简单的python语句编写爬虫 定时拿取信息并存入txt
查看>>
卡拉OK歌词原理和实现高仿Android网易云音乐
查看>>
小编带着小白看springboot源码6
查看>>
javascript原型链
查看>>
Re: 从零开始的【comic spider】《最简单的实现》(上)
查看>>
Java 单例模式学习理解
查看>>
ios创建可拖动的视图
查看>>
Linux常用的基本命令12
查看>>
ORACLE数据库事务隔离级别介绍
查看>>
DHCP服务和http服务
查看>>
bitnami 使用记录
查看>>
Vsftpd+(linux)文件服务器
查看>>