void CCurve::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
// TODO: Add your code to draw the specified item
CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
UINT state = lpDrawItemStruct->itemState;
m_rectCurveBK.CopyRect(&lpDrawItemStruct->rcItem);
m_rectCurve = m_rectCurveBK;
m_rectCurve.InflateRect(-30,0,-30,-15);//curve area
//pDC->FillRect(&m_rectCurveBK,&m_BkBrush);//直接用此代码清除原来所画的容易,出现闪屏。
CBitmap bitmap;
bitmap.CreateCompatibleBitmap(pDC, m_rectCurveBK.Width(), m_rectCurveBK.Height());//生成空间的内存位图
CDC me;
me.CreateCompatibleDC(NULL);//生成内存cd
me.SelectObject(&bitmap);
me.SetBkMode(TRANSPARENT);//设置透明字体
me.SetTextColor(RGB(255,0,0));
me.FillRect(&m_rectCurveBK,&m_BkBrush);//用内存dc清除原来所画。
添加绘图函数
DrawRect(&me);
DrawButtonText(&me);//绘制控件文本
DrawTip(&me);
DrawCurve(&me);
///
me.SetROP2(R2_WHITE);
pDC->BitBlt(0, 0, m_rectCurveBK.Width(), m_rectCurveBK.Height(), &me, 0, 0, SRCCOPY);//一次拷贝。
bitmap.DeleteObject();
me.DeleteDC();
ReleaseDC(pDC);
}
重绘时可用 InvalidateRect(&m_rectCurveBK);而不是 InvalidateRect(&m_rectCurve);
或则直接调用Invalidate();
单独在屏幕上绘制 DrawRect(&me); DrawButtonText(&me); DrawTip(&me); DrawCurve(&me);时,屏幕上可以理解为看见画家整个作画的过程,从打底稿,到上色,所以会出现闪屏。而用了双缓冲技术,则可理解为没有看到作画的过程,直接看到作做好的画,也就是只看到结果,在背后草纸上画好,一次性贴过来。
另外,需要重载OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
return false;
//return CButton::OnEraseBkgnd(pDC);
}