我的画图和画字都是通过调用重载函数 OnEraseBkgnd 来完成的。1、我把MP3的歌曲名一行一行的画到bmp上,这样看起来就像一个歌曲列表了(我是不想用控件来实现,才自己画的)。
2、但我按上翻或者下翻的按钮时,我也是调用 OnEraseBkgnd 按照当前应当显示的歌曲用pDC->DrawText 一个一个的画上去
   但是那些字,也就是列表的歌曲名有时看起来闪烁。请问要怎么处理呢?
3、闪烁的原因我大概分析是,按上翻或者下翻的按钮时,我先是擦除了背景,然后才是pDC->DrawText把歌名一首一首的画上去。谢谢!

解决方案 »

  1.   

    请使用双缓存来解决这个问题:CRect rcClient;
    GetClientRect(rcClient);CDC dcMem;
    dcMem.CreateCompatibleDC(&dc);CBitmap bmpMem;
    bmpMem.CreateCompatibleBitmap(&dc, rcClient.Width(), rcClient.Height());CBitmap *pbmpOldMem = dcMem.SelectObject(&bmpMem);// 把你需要绘制的东西,都画到dcMem上。
    ...dc.BitBlt(0, 0, rcClient.Width(), rcClient.Height(), &dcMem, 0, 0, SRCCOPY);dcMem.SelectObject(pbmpOldMem);
    上面的代码,是假设你在WM_PAINT消息中处理,如果是在EraseBkGround中,把dc换成EraseBkGround的DC。
    ------------------------------------------------------------------------
      

  2.   

    psbeond:
    你好,看了你的回复,我感觉你说的方法只是处理绘制图片时的闪屏,这个我的图片绘制是采用了双缓存了的,而且图片绘制时是没有闪屏。现在闪是MP3列表框的歌曲列表,(这个列表框不是控件,只是简单地把歌曲名画上去而已),当我按上下翻滚箭头时,是整个歌曲列表的字看起来有点闪屏。
      

  3.   

    注意我上面的“//把你需要绘制的东西,都画到dcMem上”这条。不管有多少,东西,都画到dcMem上,就不闪了。你是画到dc上了。正确的应该是:把图画到dcMem上,把歌词画到dcMem上,把其它需要画的都画到dcMem,最后一次性,把dcMem,画到dc上。这就是双缓存。
    ------------------------------------------------------------------------
      

  4.   


    哦,那我理解有些出入。但是有个问题,我现在是用CDC*pDC的pDC->DrawText来画字的,那如果我HDC hDCMem = ::CreateCompatibleDC(pDC->m_hDC);了之后,我如何往HDC hDCMem这个句柄DC上画字呢,不知道用什么函数了,该怎么弄,能否再指点下。谢谢!
      

  5.   

    而且,我还要作选择字体动作:CFont* pOldFont = (CFont*)pDC->SelectObject(&m_font[0]);
    还有选颜色动作:pDC->SetTextColor(RGB(255,0,50));
    上面的那些操作都是用CDC*pDC来实现的,现在要在HDC hDCMem这样的一个设备句柄上做这样的操作,不知道怎么弄了
      

  6.   

    我知道了,用CreateFontIndirect SelectObject DrawText,还是差不多的函数,只是作这些工作比在类中做麻烦些。
      

  7.   

    在psbeond的指点下,这个闪屏的问题总算解决了(用WIN32 API CreateFontIndirect SelectObject DrawText)。
    虽然已经结贴了,还是回来道一声:谢谢,谢谢你的无私帮助!