高分,请各位高手帮个忙!!问题不解决,10.1也过不好了^_^ 是一个图形重绘方面的问题,我想在重绘之前把view中的内容用BitBlt拷到一个CDC MemDC中,然后在重绘时再用该函数拷出来,应该在什么时候拷入呢,具体方法是如何的?拷出又该怎样做呢?最好请给出关键代码.先谢谢了. 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 什么意思?你不是知道用BitBlt吗? 建立一个公用的MemDC,在程序Invalidate之前Bitblt即保存当前view然后在OnDraw中:{ CDC * dc = FromHandle(::GetDC(NULL)) ; dc->BitBlt(..., MemDC, ...) ..........} 我在onPaint中加入了以下代码,但是一重绘就报错!CRect rect;GetClientRect(&rect);MemDC.Attach((HDC)this->GetDC());MemDC.BitBlt(0,0,rect.Width(),rect.Height(),&dc,0,0,SRCCOPY); 谢谢siphonelee,在invalidate之前应是什么事件呢,具体应该如何保存. 我以为onPaint调用ondraw,所以在onPaint中保存,是不是不对 重绘你编个函数就行!就得每次FREE,我就是吃过那个苦! 在OnDraw(CDC *pDC)中: CDC MemDC; //首先定义一个显示设备对象 CBitmap MemBitmap;//定义一个位图对象 //随后建立与屏幕显示兼容的内存显示设备 MemDC.CreateCompatibleDC(NULL); //这时还不能绘图,因为没有地方画 ^_^ //下面建立一个与屏幕显示兼容的位图,至于位图的大小嘛,可以用窗口的大小 MemBitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight); //将位图选入到内存显示设备中 //只有选入了位图的内存显示设备才有地方绘图,画到指定的位图上 CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap); //先用背景色将位图清除干净,这里我用的是白色作为背景 //你也可以用自己应该用的颜色 MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255)); //绘图 MemDC.MoveTo(……); MemDC.LineTo(……); //将内存中的图拷贝到屏幕上进行显示 pDC->BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY); //绘图完成后的清理 MemBitmap.DeleteObject(); MemDC.DeleteDC(); 谢谢vccsdn,我的问题在于我是在onmousemove中画图的,那该怎么办.我的思路是在ondraw前保存,然后在ondraw时显示. 改OnPaint函数为 CPaintDC dc(this); // device context for painting OnPrepareDC(&dc); CRect rectUpdate; dc.GetClipBox(&rectUpdate); CBitmap* pOldBitmap = m_pdcMemory->SelectObject(m_pBitmap); m_pdcMemory->SelectClipRgn(NULL); m_pdcMemory->IntersectClipRect(&rectUpdate); CBrush backgroundBrush((COLORREF) ::GetSysColor(COLOR_WINDOW)); CBrush* pOldBrush = m_pdcMemory->SelectObject(&backgroundBrush); m_pdcMemory->PatBlt(rectUpdate.left, rectUpdate.top, rectUpdate.Width(), rectUpdate.Height(), PATCOPY); OnDraw(m_pdcMemory); dc.BitBlt(rectUpdate.left, rectUpdate.top, rectUpdate.Width(), rectUpdate.Height(), m_pdcMemory, rectUpdate.left, rectUpdate.top, SRCCOPY); m_pdcMemory->SelectObject(pOldBitmap); m_pdcMemory->SelectObject(pOldBrush); 在OninitUpdate中添加if (m_pdcMemory->GetSafeHdc() == NULL){ CClientDC dc(this); //dc映射方式也为MM_LOENGLISH OnPrepareDC(&dc); CRect rectMax(0,0,sizeTotal.cx,-sizeTotal.cy); dc.LPtoDP(rectMax); m_pBitmap->CreateCompatibleBitmap(&dc,rectMax.right, rectMax.bottom); m_pdcMemory->SetMapMode(MM_LOENGLISH);} CRect rect;GetClientRect(&rect);MemDC.Attach( (HDC) (this->GetDC()) ); ~~~~~~~~~~~~~~~~~~~~~~MemDC.BitBlt(0,0,rect.Width(),rect.Height(),&dc,0,0,SRCCOPY); socket接不到数据但抓包工具却能接到? 使用VS2010新建了一个MFC MDI的项目,为什么出现6个错误呢? MDI获取的视图类客户区尺寸为0,为什么? 有关dll的例子 md5算法的代码 求够一段代码 谢谢啦 在Windows下怎样截取文件,我需要把一个巨大二进制文件的后面部分去掉? 关于加密技术 vc调用excel的问题,请各位朋友捧场! BOOL CALLBACK EnumChildProc( HWND hwnd,LPARAM lParam) 如何读出bmp图片文件一点上的R值? 请问我在win2k下如何改变虚拟内存的大小?
你不是知道用BitBlt吗?
即保存当前view
然后在OnDraw中:
{
CDC * dc = FromHandle(::GetDC(NULL)) ;
dc->BitBlt(..., MemDC, ...)
..........
}
CRect rect;
GetClientRect(&rect);
MemDC.Attach((HDC)this->GetDC());
MemDC.BitBlt(0,0,rect.Width(),rect.Height(),&dc,0,0,SRCCOPY);
CDC MemDC; //首先定义一个显示设备对象
CBitmap MemBitmap;//定义一个位图对象 //随后建立与屏幕显示兼容的内存显示设备
MemDC.CreateCompatibleDC(NULL);
//这时还不能绘图,因为没有地方画 ^_^
//下面建立一个与屏幕显示兼容的位图,至于位图的大小嘛,可以用窗口的大小
MemBitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight);
//将位图选入到内存显示设备中
//只有选入了位图的内存显示设备才有地方绘图,画到指定的位图上
CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap); //先用背景色将位图清除干净,这里我用的是白色作为背景
//你也可以用自己应该用的颜色
MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255)); //绘图
MemDC.MoveTo(……);
MemDC.LineTo(……);
//将内存中的图拷贝到屏幕上进行显示
pDC->BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY); //绘图完成后的清理
MemBitmap.DeleteObject();
MemDC.DeleteDC();
CPaintDC dc(this); // device context for painting
OnPrepareDC(&dc);
CRect rectUpdate;
dc.GetClipBox(&rectUpdate);
CBitmap* pOldBitmap = m_pdcMemory->SelectObject(m_pBitmap);
m_pdcMemory->SelectClipRgn(NULL);
m_pdcMemory->IntersectClipRect(&rectUpdate);
CBrush backgroundBrush((COLORREF) ::GetSysColor(COLOR_WINDOW));
CBrush* pOldBrush = m_pdcMemory->SelectObject(&backgroundBrush);
m_pdcMemory->PatBlt(rectUpdate.left, rectUpdate.top,
rectUpdate.Width(), rectUpdate.Height(),
PATCOPY);
OnDraw(m_pdcMemory);
dc.BitBlt(rectUpdate.left, rectUpdate.top,
rectUpdate.Width(), rectUpdate.Height(),
m_pdcMemory, rectUpdate.left, rectUpdate.top,
SRCCOPY);
m_pdcMemory->SelectObject(pOldBitmap);
m_pdcMemory->SelectObject(pOldBrush);
if (m_pdcMemory->GetSafeHdc() == NULL)
{
CClientDC dc(this); //dc映射方式也为MM_LOENGLISH
OnPrepareDC(&dc); CRect rectMax(0,0,sizeTotal.cx,-sizeTotal.cy);
dc.LPtoDP(rectMax);
m_pBitmap->CreateCompatibleBitmap(&dc,rectMax.right,
rectMax.bottom);
m_pdcMemory->SetMapMode(MM_LOENGLISH);
}
GetClientRect(&rect);
MemDC.Attach( (HDC) (this->GetDC()) );
~~~~~~~~~~~~~~~~~~~~~~
MemDC.BitBlt(0,0,rect.Width(),rect.Height(),&dc,0,0,SRCCOPY);