1.CDC到Graphics只要这样:
Graphics g(pDC -> GetSafeHdc()); // 只要能构造CDC句柄的MFC对象都可以 // CClientDC、CPaintDC,也都可以
2.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)
3.想要用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对象,否则你会发现你的内存占用…
CView使用OnPaint打印图像就是一个例子,使用GDI+无法在打印纸上打印出图像,只有一片空白。在找到原因之前,只好从GDI+转换到GDI使用BitBlt和StretchBlt方式来打印。
4.保存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); // 保存
5.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都需要释放,否则资源会被占用而不接受其他操作