小弟我用双缓冲解决闪烁有关问题但是没有效果,小弟我写的代码如下,还望有大神解惑
我用双缓冲解决闪烁问题但是没有效果,我写的代码如下,还望有大神解惑
void CCurveView::OnDraw(CDC* pDC)
{
CDocument* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CRect rect;
GetClientRect(&rect);
CDC MemDC; //首先定义一个显示设备对象
CBitmap MemBitmap;//定义一个位图对象
//随后建立与屏幕显示兼容的内存显示设备
MemDC.CreateCompatibleDC(NULL);
//这时还不能绘图,因为没有地方画 ^_^
//下面建立一个与屏幕显示兼容的位图,至于位图的大小嘛,可以用窗口的大小
MemBitmap.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());
//将位图选入到内存显示设备中
//只有选入了位图的内存显示设备才有地方绘图,画到指定的位图上
CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);
//先用背景色将位图清除干净,这里我用的是白色作为背景
//你也可以用自己应该用的颜色
MemDC.FillSolidRect(0,0,rect.Width(),rect.Height(),RGB(255,255,255));
//绘图
//pDC->SetBkMode(TRANSPARENT);
//pDC->SetTextAlign(TA_RIGHT|TA_BOTTOM);
// if (m_rightmouse == 1)
{
MemDC.MoveTo(m_point.x,0);
MemDC.LineTo(m_point.x,rect.Height());
CString strText =_T("");
strText.Format(_T("%d,%d"),m_point.x,m_point.y);
MemDC.TextOut(m_point.x,30,strText);
}
MemDC.MoveTo(50,50);
MemDC.LineTo(50,300);
MemDC.LineTo(1000,300);
MemDC.MoveTo(50,300);
MemDC.LineTo(50,550);
MemDC.MoveTo(50,50);
MemDC.LineTo(43,65);
MemDC.MoveTo(50,50);
MemDC.LineTo(57,65);
MemDC.TextOut(38,50,"y");
MemDC.MoveTo(1000,300);
MemDC.LineTo(993,315);
MemDC.MoveTo(1000,300);
MemDC.LineTo(993,285);
MemDC.TextOut(980,320,"t(s)");
for (m_y=500;m_y>=100;m_y+=-50)
{
CString str;
str.Format("%d",300-m_y);
MemDC.MoveTo(50,m_y);
MemDC.LineTo(60,m_y);
MemDC.TextOut(20,m_y,str);
}
for (m_t=95;m_t>5;m_t+=-10)
{
CString str;
str.Format("%d",m_t-5);
MemDC.MoveTo(10*m_t,300);
MemDC.LineTo(10*m_t,290);
MemDC.TextOut(10*m_t,325,str);
}
CPen pen(PS_SOLID,2,RGB(0,0,255));
CPen * pOld = MemDC.SelectObject(&pen);
for(i=0;i<899;i++)
{
MemDC.MoveTo(m_n[i].x,m_n[i].y);
MemDC.LineTo(m_n[i+1].x,m_n[i+1].y);
}
pDC->BitBlt(0,0,rect.Width(),rect.Height(),&MemDC,0,0,SRCCOPY);
//绘图完成后的清理
MemBitmap.DeleteObject();
MemDC.DeleteDC();
}
------解决思路----------------------
WM_ERASEBKGND 返回TRUE
------解决思路----------------------
给一个程序中关于双缓冲绘图部分的例子,可参考
void CCurveView::OnDraw(CDC* pDC)
{
CDocument* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CRect rect;
GetClientRect(&rect);
CDC MemDC; //首先定义一个显示设备对象
CBitmap MemBitmap;//定义一个位图对象
//随后建立与屏幕显示兼容的内存显示设备
MemDC.CreateCompatibleDC(NULL);
//这时还不能绘图,因为没有地方画 ^_^
//下面建立一个与屏幕显示兼容的位图,至于位图的大小嘛,可以用窗口的大小
MemBitmap.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());
//将位图选入到内存显示设备中
//只有选入了位图的内存显示设备才有地方绘图,画到指定的位图上
CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);
//先用背景色将位图清除干净,这里我用的是白色作为背景
//你也可以用自己应该用的颜色
MemDC.FillSolidRect(0,0,rect.Width(),rect.Height(),RGB(255,255,255));
//绘图
//pDC->SetBkMode(TRANSPARENT);
//pDC->SetTextAlign(TA_RIGHT|TA_BOTTOM);
// if (m_rightmouse == 1)
{
MemDC.MoveTo(m_point.x,0);
MemDC.LineTo(m_point.x,rect.Height());
CString strText =_T("");
strText.Format(_T("%d,%d"),m_point.x,m_point.y);
MemDC.TextOut(m_point.x,30,strText);
}
MemDC.MoveTo(50,50);
MemDC.LineTo(50,300);
MemDC.LineTo(1000,300);
MemDC.MoveTo(50,300);
MemDC.LineTo(50,550);
MemDC.MoveTo(50,50);
MemDC.LineTo(43,65);
MemDC.MoveTo(50,50);
MemDC.LineTo(57,65);
MemDC.TextOut(38,50,"y");
MemDC.MoveTo(1000,300);
MemDC.LineTo(993,315);
MemDC.MoveTo(1000,300);
MemDC.LineTo(993,285);
MemDC.TextOut(980,320,"t(s)");
for (m_y=500;m_y>=100;m_y+=-50)
{
CString str;
str.Format("%d",300-m_y);
MemDC.MoveTo(50,m_y);
MemDC.LineTo(60,m_y);
MemDC.TextOut(20,m_y,str);
}
for (m_t=95;m_t>5;m_t+=-10)
{
CString str;
str.Format("%d",m_t-5);
MemDC.MoveTo(10*m_t,300);
MemDC.LineTo(10*m_t,290);
MemDC.TextOut(10*m_t,325,str);
}
CPen pen(PS_SOLID,2,RGB(0,0,255));
CPen * pOld = MemDC.SelectObject(&pen);
for(i=0;i<899;i++)
{
MemDC.MoveTo(m_n[i].x,m_n[i].y);
MemDC.LineTo(m_n[i+1].x,m_n[i+1].y);
}
pDC->BitBlt(0,0,rect.Width(),rect.Height(),&MemDC,0,0,SRCCOPY);
//绘图完成后的清理
MemBitmap.DeleteObject();
MemDC.DeleteDC();
}
------解决思路----------------------
WM_ERASEBKGND 返回TRUE
------解决思路----------------------
给一个程序中关于双缓冲绘图部分的例子,可参考
// ======= 在内存中创建一个CDC ==========
CRect rect;
GetClientRect(&rect);
CClientDC dc(this);
CDC mdc;
CBitmap bmp; //这里的Bitmap是必须的,否则当心弄出一个大黑块哦。
mdc.CreateCompatibleDC(&dc);
bmp.CreateCompatibleBitmap(&dc,rect.Width(),rect.Height());
CBitmap* pOld=mdc.SelectObject(&bmp);
// ========= 在内存CDC上绘制 ============
CDrawPicture::GradientBack(&mdc); // 背景色渐变
CDrawPicture::DrawWorkFram(&mdc,RGB(200,200,200)); // 绘框
CDrawPicture::WriteTitle(&mdc,str); // 绘标题
CDrawPicture::DrawClock(&mdc); // 绘时钟
CDrawPicture::WriteOperatorState(&mdc,str1); // 操作员状态提示
// ========== 将结果写回屏幕 ============
dc.BitBlt(0,0,rect.Width(),rect.Height(),&mdc,0,0,SRCCOPY);
// ========== 恢复 ==========
mdc.SelectObject(pOld);
bmp.DeleteObject();
mdc.DeleteDC();