再次问背景重画问题 上次也是这个问题,就是如何将当前CDC上的数据保存到内存DC上,在重画的时候直接从内存上显示出来,也就是重画问题请给出一个比较详细的DEMO或者代码,我不知道什么时候保存到内存,何时又显示出来在下不剩感谢!Email:[email protected] 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我网站上有CMemDC的例子,就是你要的这个例子在Dialog上画了边框并重画背景色http://www.crob.net/upload/DlgHasBorder.zipenjoy it 我看了,好象不怎么符合我的实际情况你的代码看起来还是在OnPaint()函数里调用了dc->DrawBord()我要求不在这个里面调用它,否则如果这个函数工作量很多内存DC还是没有什么明显的作用不知道我理解的对不对 重载OnDraw()函数 CDC dc; CDC* pDrawDC = pDC; CBitmap bitmap; CBitmap* pOldBitmap; // only paint the rect that needs repainting CRect client; pDC->GetClipBox(client); CRect rect = client; DocToClient(rect); if (!pDC->IsPrinting()) { // draw to offscreen bitmap for fast looking repaints if (dc.CreateCompatibleDC(pDC)) { if (bitmap.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height())) { OnPrepareDC(&dc, NULL); pDrawDC = &dc; // offset origin more because bitmap is just piece of the whole drawing dc.OffsetViewportOrg(-rect.left, -rect.top); pOldBitmap = dc.SelectObject(&bitmap); dc.SetBrushOrg(rect.left % 8, rect.top % 8); // might as well clip to the same rectangle dc.IntersectClipRect(client); } } } // paint background CBrush brush; if (!brush.CreateSolidBrush(pDoc->GetPaperColor())) return; brush.UnrealizeObject(); pDrawDC->FillRect(client, &brush); if (!pDC->IsPrinting() && m_bGrid) DrawGrid(pDrawDC); pDoc->Draw(pDrawDC, this); if (pDrawDC != pDC) { pDC->SetViewportOrg(0, 0); pDC->SetWindowOrg(0,0); pDC->SetMapMode(MM_TEXT); dc.SetViewportOrg(0, 0); dc.SetWindowOrg(0,0); dc.SetMapMode(MM_TEXT); pDC->BitBlt(rect.left, rect.top, rect.Width(), rect.Height(), &dc, 0, 0, SRCCOPY); dc.SelectObject(pOldBitmap); }闪屏问题的解决办法是采用双缓冲技术。即创建与设备DC兼容的位图,在位图中绘制,然后Copy到屏幕上。注意,要重载BOOL CDrawView::OnEraseBkgnd(CDC*)函数,返回TRUE;即BOOL CDrawView::OnEraseBkgnd(CDC*){ return TRUE;} 用这个在OnPaint里画是最简洁而且结果最好的,我画很多大型图表都是这样的,资源等各方面都不会有问题 我仔细看了Crob的程序你的程序的作用是当需要重新画界面的时候,所有的图表只是在内存中画而已,还是执行了所有的画图命令。我想的是:当需要重画的时候,只是将内存中的图表重新显示出来,这个图表是在需要重画之前保存到内存中去的。骑士的程序,其中有些函数是你自己的吧,不会也是重画到内存中去的吧。据我了解,CBitmap申明必须是全局的,这样才能保存并显示出来 不知道上次是不是回答的你的问题, 你创建 一个类成员的CBitmap指针,在你的ondraw()中 检测 pBitmap是不是空 ,如果不空就创建, 不是空直接帖上就可以了,当然,你需要在窗口大小改变等的情况下重建位图 请教个语法问题 在Dialog中的Picture里面画了一幅图像,移动Dialog时,只要Picture区域被覆盖,图像就没了!:( 拷贝已打开的文件 端口扫描问题(菜鸟初学) VC最新的头文件哪有的下? TRACE宏的怪问题 怎样得到句柄?? 高分求教ActiveSkin的使用问题? 用MFC ODBC创建数据库时遇到的有关查询的问题 关于“自带IE8内核”的问题 打印时如何实现 像素与mm(毫米)之间的单位转换呢 有没有好一点的方法?THANKS 目标:本月内达到1星,散分
这个例子在Dialog上画了边框并重画背景色http://www.crob.net/upload/DlgHasBorder.zipenjoy it
你的代码看起来还是在OnPaint()函数里调用了dc->DrawBord()
我要求不在这个里面调用它,否则如果这个函数工作量很多
内存DC还是没有什么明显的作用
不知道我理解的对不对
CDC dc;
CDC* pDrawDC = pDC;
CBitmap bitmap;
CBitmap* pOldBitmap; // only paint the rect that needs repainting
CRect client;
pDC->GetClipBox(client);
CRect rect = client; DocToClient(rect); if (!pDC->IsPrinting())
{
// draw to offscreen bitmap for fast looking repaints
if (dc.CreateCompatibleDC(pDC))
{
if (bitmap.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height()))
{
OnPrepareDC(&dc, NULL);
pDrawDC = &dc; // offset origin more because bitmap is just piece of the whole drawing
dc.OffsetViewportOrg(-rect.left, -rect.top);
pOldBitmap = dc.SelectObject(&bitmap);
dc.SetBrushOrg(rect.left % 8, rect.top % 8); // might as well clip to the same rectangle
dc.IntersectClipRect(client);
}
}
} // paint background
CBrush brush;
if (!brush.CreateSolidBrush(pDoc->GetPaperColor()))
return; brush.UnrealizeObject();
pDrawDC->FillRect(client, &brush); if (!pDC->IsPrinting() && m_bGrid)
DrawGrid(pDrawDC); pDoc->Draw(pDrawDC, this); if (pDrawDC != pDC)
{
pDC->SetViewportOrg(0, 0);
pDC->SetWindowOrg(0,0);
pDC->SetMapMode(MM_TEXT);
dc.SetViewportOrg(0, 0);
dc.SetWindowOrg(0,0);
dc.SetMapMode(MM_TEXT);
pDC->BitBlt(rect.left, rect.top, rect.Width(), rect.Height(),
&dc, 0, 0, SRCCOPY);
dc.SelectObject(pOldBitmap);
}
闪屏问题的解决办法是采用双缓冲技术。即创建与设备DC兼容的位图,在位图中绘制,然后Copy到屏幕上。注意,要重载BOOL CDrawView::OnEraseBkgnd(CDC*)函数,返回TRUE;
即
BOOL CDrawView::OnEraseBkgnd(CDC*)
{
return TRUE;
}
你的程序的作用是当需要重新画界面的时候,所有的图表只是在内存中画而已,还是执行了所有的画图命令。我想的是:当需要重画的时候,只是将内存中的图表重新显示出来,这个图表是在需要重画之前保存到内存中去的。骑士的程序,其中有些函数是你自己的吧,不会也是重画到内存中去的吧。据我了解,CBitmap申明必须是全局的,这样才能保存并显示出来