背景图闪烁 我做的是单文档的程序,重载了cmyview的OnEraseBkgnd函数,使用双缓冲绘图,在客户区上显示了一幅位图,但是在弹出的对话框在客户区区域移动时,客户区的位图闪烁很厉害,请问如何去除这种闪烁,谢谢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 图象闪烁是由于你在CView重画了全部图片,建议在重新绘图时只画有移动对话框时漏出来的部分,其他部分就不用画。这样的画,由于其他部分没有重新绘图,所以不会有闪烁。你先试试? BOOL CtestsdiView::OnEraseBkgnd(CDC* pDC){ HBITMAP bitmap; bitmap = (HBITMAP)LoadImage(NULL,"e:\\11.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION); CDC memDC; memDC.CreateCompatibleDC(pDC); CBitmap m_bit; m_bit.Attach(bitmap); memDC.SelectObject(&m_bit); BITMAP bm; m_bit.GetBitmap(&bm); CRect rect; pDC->GetClipBox(rect); pDC->BitBlt(rect.left , rect.top , rect.right - rect.left , rect.bottom - rect.top, &memDC, rect.left, rect.top, SRCCOPY); return TRUE; } 当视图重画时,会引起屏幕的闪烁,解决的一个方法是先在内存中画好图形,然后用 位图的方法将内存中画好的图象拷贝到屏幕上。 void CDrawView::OnDraw(CDC* pDC) { CDrawDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); CDC dc; CBitmap bitmap; CBitmap* pOldBitmap; CRect client; CRect rect; pDC->GetClipBox(client);//检取无效区 GetClientRect(rect);//检取整个客户区 if(dc.CreateCompatibleDC(pDC))//创建一个与pDC兼容的内存设备环境 { if(bitmap.CreateCompatibleBitmap(pDC,rect.Width(), rect.Height()))//创建一与pDC兼容的位图,大小为整个客户区 { OnPrepareDC(&dc,NULL);//使dc与pDC具有同样的映射关系 pOldBitmap=dc.SelectObject(&bitmap);//将位图选入内存环境 dc.SelectClipRgn(NULL);//使dc的整个客户区都成无效区 dc.IntersectClipRect(client);//再“与上”检取的无效区,使 //内存环境与pDC检取的无效区相等 } } CBrush brush; if(!brush.CreateSolidBrush(RGB(255,255,255))) return ; brush.UnrealizeObject(); dc.FillRect(client,&brush);//将dc的作图区刷新成背景色 if(m_drawObjs.GetCount()!=0) Draw(&dc);//将所有的画图对象在内存裁减区内重画 pDC->BitBlt(client.left,client.top,client.Width(),client.Height(), &dc,client.left,client.top,SRCCOPY);//将内存裁减区的位图 //拷贝到窗口裁减区 dc.SelectObject(pOldBitmap); } USB 求助:两个类数据传递 MFC 在非VIEW类(class CMyobj)中如何访问文档类的变量? msn注销的实现 一介聊天室程序中的定义错误,怎么解决???? 一个很不错的学习资料网站,有很多教学视频资料下载,晚了就没了. 怎么在Toolbar中动态加入按钮,最好有源程序 请问,OnPaint()函数下是否在响应mousemove时(即当鼠标移动时)才进行刷新?? 软件使用权问题?ktv点歌系统 自已寫得几個小東東,公布源代碼,捧埸者有分!! 在vc下不用任何控件画长方体等3维图形算法有什么书有具体算法 找工作!!!请各位帮忙顶,先谢了!~
{
HBITMAP bitmap;
bitmap = (HBITMAP)LoadImage(NULL,"e:\\11.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
CDC memDC;
memDC.CreateCompatibleDC(pDC);
CBitmap m_bit;
m_bit.Attach(bitmap);
memDC.SelectObject(&m_bit);
BITMAP bm;
m_bit.GetBitmap(&bm);
CRect rect;
pDC->GetClipBox(rect);
pDC->BitBlt(rect.left , rect.top , rect.right - rect.left , rect.bottom - rect.top, &memDC, rect.left, rect.top, SRCCOPY);
return TRUE;
}
位图的方法将内存中画好的图象拷贝到屏幕上。
void CDrawView::OnDraw(CDC* pDC)
{
CDrawDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc); CDC dc;
CBitmap bitmap; CBitmap* pOldBitmap;
CRect client;
CRect rect;
pDC->GetClipBox(client);//检取无效区
GetClientRect(rect);//检取整个客户区
if(dc.CreateCompatibleDC(pDC))//创建一个与pDC兼容的内存设备环境
{
if(bitmap.CreateCompatibleBitmap(pDC,rect.Width(),
rect.Height()))//创建一与pDC兼容的位图,大小为整个客户区
{
OnPrepareDC(&dc,NULL);//使dc与pDC具有同样的映射关系
pOldBitmap=dc.SelectObject(&bitmap);//将位图选入内存环境
dc.SelectClipRgn(NULL);//使dc的整个客户区都成无效区
dc.IntersectClipRect(client);//再“与上”检取的无效区,使
//内存环境与pDC检取的无效区相等
}
}
CBrush brush;
if(!brush.CreateSolidBrush(RGB(255,255,255)))
return ;
brush.UnrealizeObject();
dc.FillRect(client,&brush);//将dc的作图区刷新成背景色 if(m_drawObjs.GetCount()!=0)
Draw(&dc);//将所有的画图对象在内存裁减区内重画
pDC->BitBlt(client.left,client.top,client.Width(),client.Height(),
&dc,client.left,client.top,SRCCOPY);//将内存裁减区的位图
//拷贝到窗口裁减区
dc.SelectObject(pOldBitmap); }