首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

,双缓冲绘图闪烁的有关问题

2013-06-26 
求助,双缓冲绘图闪烁的问题类函数如下,1秒钟刷新一次,背景图不会出现闪烁问题,但是之后在背景图上画网格用

求助,双缓冲绘图闪烁的问题
类函数如下,1秒钟刷新一次,背景图不会出现闪烁问题,但是之后在背景图上画网格用的for循环,就出现了网格线闪烁的问题(图片仍然不会闪烁)。请问什么原因啊?该怎么改

BOOL CMapEdit::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default

pDC=GetDC();
CDC MemDC;
CPen hpen;
CPen* oldpen;
hpen.CreatePen(PS_SOLID,1,RGB(0,255,0));
HBITMAP hBitmap=(HBITMAP)::LoadImage(AfxGetInstanceHandle(),lpszName,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

CBitmap Bitmap;
BITMAP bmap;

Bitmap.Attach(hBitmap);
Bitmap.GetBitmap(&bmap);

MemDC.CreateCompatibleDC(pDC);
CBitmap* pOldBitmap=MemDC.SelectObject(&Bitmap);
oldpen=pDC->SelectObject(&hpen);

CRect rect;
GetClientRect(&rect);

pDC->SetStretchBltMode(COLORONCOLOR);
pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&MemDC,0,0,bmap.bmWidth,bmap.bmHeight,SRCCOPY);

for (int i=1;i<6;i++)
{
pDC->MoveTo(0,rect.Height()*i/6);
pDC->LineTo(rect.Width(),rect.Height()*i/6);

}
for (int j=1;j<8;j++)
{
pDC->MoveTo(rect.Width()*j/8,0);
pDC->LineTo(rect.Width()*j/8,rect.Height());
}

//pDC->BitBlt(0,0,rect.Width(),rect.Height(),&MemDC,0,0,SRCCOPY);
MemDC.SelectObject(pOldBitmap);
ReleaseDC(pDC);

//return CEdit::OnEraseBkgnd(pDC);
return TRUE;
}

int CMapEdit::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CEdit::OnCreate(lpCreateStruct) == -1)
return -1;

// TODO:  Add your specialized creation code here
SetTimer(1,1000,NULL);

return 0;
}

void CMapEdit::OnTimer(UINT_PTR nIDEvent)
{
// TODO: Add your message handler code here and/or call default
Invalidate(TRUE);
CEdit::OnTimer(nIDEvent);
}


[解决办法]
 for (int i=1;i<6;i++)
    {
        pDC->MoveTo(0,rect.Height()*i/6);
        pDC->LineTo(rect.Width(),rect.Height()*i/6);
         
    }
    for (int j=1;j<8;j++)
    {
        pDC->MoveTo(rect.Width()*j/8,0);
        pDC->LineTo(rect.Width()*j/8,rect.Height());
    }
这段代码需要在内存位图中绘制,不能用pDC。用pDC不就闪了么。要了解双缓存的原理才行啊
[解决办法]
线不全,是因为你MemDC选进的图片不够rect大,先选个和rect一样大的图片进MemDC,然后在MemDC做所有的绘图工作(包括画背景图片,画直线)


        CDC  TempDc;
TempDc.CreateCompatibleDC(pDC);

CBitmap TempBitmap;
TempBitmap.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height());

CBitmap* oldBitmap = TempDc.SelectObject(&TempBitmap);

热点排行