GDI+如何在内存中画图并显示?请给代码! 如题 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 http://www.bc-cn.net/Article/kfyy/vc/jszl/200703/4528.html GDI+内存画图要使用Bitmap*对象添加全局对象 Bitmap* m_pBitmap; m_pBitmap=new Bitmap(宽,高);//建立图像画图:Pen pen(Color(255,R,G,B),(float)笔宽);Graphics grp(m_pBitmap);//在Bitmap上建立Graphics绘图grp.SetSmoothingMode(SmoothingModeAntiAlias); //打开抗锯齿grp.DrawLine(&pen, x1, y1, x2, y2);//画线显示:void CXXXXView::OnDraw(CDC* pDC){ Graphics graphics(pDC->m_hDC); graphics.DrawImage(m_pBitmap,Rect(0,0,宽,高));} Bitmap如果只指定宽度和高度的话,而不是从图像文件中来的话,就是在内存中了,画图的话,用DrawBitmap就可以了。 应该是在MemoryDC(内存DC)中做图吧??就是常说的双缓存做图.大概步骤如下:1.创建一个与源DC相同的内存DC.2.根据源DC创建一个位图.3.将位图选入内存DC.4.在内存DC中做图.和任意其他DC操作.5.完成后后把内存DC的内容用BitBlt复制到源DC中. 我是想通过内存绘图来防止闪烁,如GDI: CRect rect; GetClientRect(&rect); CDC mem; mem.CreateCompatibleDC(&dc); CBitmap memmap; memmap.CreateCompatibleBitmap(&dc,rect.Width(),rect.Height()); CBitmap *oldmap=mem.SelectObject(&memmap); mem.SelectStockObject(WHITE_BRUSH); mem.Rectangle(&rect); mem.SelectStockObject(BLACK_BRUSH); mem.Rectangle(a,a,a+10,a+10); dc.BitBlt(0,0,rect.Width(),rect.Height(),&mem,0,0,SRCCOPY); mem.SelectObject(oldmap); memmap.DeleteObject(); mem.DeleteDC(); 防止闪烁要把内存绘图和显示内存图像分开进行绘图过程全部放在OnDraw里好像并不能解决问题闪烁主要是Invalidate()造成,刷新的话尽量使用Invalidate(FALSE)和 InvalidateRect(..)或者不用Invalidate(),直接用新内容DrawImage覆盖,防止闪烁有奇效还有,lz你到底是用GDI+还是GDI? 我用的是GDI+.网上找到的内存绘图都是GDI的,不是GDI+的。所以我想问GDI+怎么和内存接口 *****************************转的 Just a Copy***************************** 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+的在内存方式画图呀,不过刚才打错了,显示是用DrawImage,而不是DrawBitmap 大家看一下,我将文件导入OLB 对象 到底哪错了。。。求解100分 vc与DSP和FPGA 通信的区别,出现错误 请问有什么办法可以在MFC的列表控件ClistCtrl中加入网格吗? 初学python, 痛苦中 求一个代理服务器的解决方案(效率问题) 如何让按钮响应显示文字? 怎样改变static控件的背景色? 想做一个分割视图程序,功能如下,请进!! 如何在xp下coms中禁用ideII端口?? CEditView类中的光标问题(112分哦) RealPlayer G2 Control的问题? 【请教】debug正常,release下有误
画图:Pen pen(Color(255,R,G,B),(float)笔宽);
Graphics grp(m_pBitmap);//在Bitmap上建立Graphics绘图
grp.SetSmoothingMode(SmoothingModeAntiAlias); //打开抗锯齿grp.DrawLine(&pen, x1, y1, x2, y2);//画线显示:
void CXXXXView::OnDraw(CDC* pDC)
{
Graphics graphics(pDC->m_hDC);
graphics.DrawImage(m_pBitmap,Rect(0,0,宽,高));}
就是常说的双缓存做图.大概步骤如下:
1.创建一个与源DC相同的内存DC.
2.根据源DC创建一个位图.
3.将位图选入内存DC.
4.在内存DC中做图.和任意其他DC操作.
5.完成后后把内存DC的内容用BitBlt复制到源DC中.
CRect rect;
GetClientRect(&rect);
CDC mem;
mem.CreateCompatibleDC(&dc);
CBitmap memmap;
memmap.CreateCompatibleBitmap(&dc,rect.Width(),rect.Height());
CBitmap *oldmap=mem.SelectObject(&memmap);
mem.SelectStockObject(WHITE_BRUSH);
mem.Rectangle(&rect);
mem.SelectStockObject(BLACK_BRUSH);
mem.Rectangle(a,a,a+10,a+10);
dc.BitBlt(0,0,rect.Width(),rect.Height(),&mem,0,0,SRCCOPY);
mem.SelectObject(oldmap);
memmap.DeleteObject();
mem.DeleteDC();
绘图过程全部放在OnDraw里好像并不能解决问题
闪烁主要是Invalidate()造成,刷新的话尽量使用Invalidate(FALSE)和 InvalidateRect(..)
或者不用Invalidate(),直接用新内容DrawImage覆盖,防止闪烁有奇效还有,lz你到底是用GDI+还是GDI?
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都需要释放,否则资源会被占用而不接受其他操作