您的位置:逆风者 VC++ 正文
 添加时间:2007-09-01 原文发表:2007-08-31 人气:150 来源:vckbase.com

GDI和GDI 对象的相互转换

作者:.Live

  当然希望可以使用GDI 来完全代替GDI,再不济也只需要从GDI对象转到GDI 对象。但是就是有那么些工程,又要新技术新特性、又希望快速开发、又不肯丢弃旧版本的已有的功能。没办法,只能缝缝补补,咔哐碙啌...
逆风编程技术

一、CDC到Graphics只要这样:


Graphics g(pDC->GetSafeHdc());//只要能构造CDC句柄的MFC对象都可以

	//CClientDC、CPaintDC,也都可以
二、CBitmap到Graphics需要创建一个内存位图设备:

CDC MemDC; 

CBitmap MemBitmap;

MemDC.CreateCompatibleDC(pDC);

MemBitmap.CreateCompatibleBitmap(pDC,size.cx, size.cy);

CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);

Graphics g(MemDC.GetSafeHdc());

///… you can work with GDI  … ///
或者使用:

Bitmap::Bitmap(HBITMAP,HPALETTE)。

static?Bitmap?*FromHBITMAP(HBITMAP?hbm,HPALETTE?hpal);
三、想要用Bitmap来打开图片,却又需要用GDI的绘图函数来操作(一般都为历史遗留问题),就需要将Bitmap对象转换到CBitmap,可以这样:

Bitmap* pPicture = new Bitmap(L"dotLive.jpg");

HBITMAP hBitmap;

CBitmap* pbm;

pPicture->GetHBITMAP(Color(0,0,0),&hBitmap);

pbm = CBitmap::FromHandle(aaa1);

///… use pbm to do the GDI works ...///

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

Bitmap* tPic= new Bitmap(L"dotLive.jpg");//锁定文件

Bitmap* pPicture = new Bitmap(tPic->GetWidth()

                             ,tPic->GetHeight()

                             ,tPic->GetPixelFormat());

Graphics g(pPicture);

g.DrawImage(tPic,0,0,m_nWidth,m_nHeight);//复制过来

delete tPic;//解锁

/// … use the pPicture to access "dotLive.jpg" … ///

CLSID tiffClsid;

GetEncoderClsid(L"image/jpeg", &tiffClsid);//这个函数MSDN中有

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

Bitmap* pPicture = new Bitmap(L"dotLive.jpg");//打开图片

Graphics tempG(pPicture );

HDC hdc = tempG.GetHDC ();//获得GDI句柄

CDC* tempDC = CDC::FromHandle(hdc);

/// … hurry up, draw what you want … ///

tempG.ReleaseHDC(hdc); //要记得relese,GDI都需要释放,否则资源会被占用而不接受其他操作
关于GDI 、图像处理以及.net编程,欢迎到dotlive.cnblogs.com来讨论。

相关文章

软件框架的利器、TangramMini组件应用教程二
C语言高效编程的几招
VC 操作 SQL Server 主从表
软件测试悖论
如何在 C# 中加载自己编写的动态链接库
DLL头文件的格式和应用
用 Web 服务进行二进制序列化和 BinaryForm
QQ2006 界面编程之鸡蛋里挑骨头
在你的程序中如何使用CButtonST类
Buffer Overruns,portability和其它...
PE文件格式详解(下)
计算MDI子窗口数,仅显示文件夹的打开对话框
基于MFC对话框的NT服务程序框架
关于控件注册和使用许可问题的解决办法
汉诺塔游戏的设计
Spy++原理初探
WIN32程序挂钩SetLastError,输出错误描述到
超强仿QQ自动伸缩窗口
VC实用小知识总结 (一)
VC实用小知识总结 (二)

相关评论


本文章所属分类:首页 VC++

  热门关键字: