我要实现下面的功能:在一个静态文本控件中,从左往右循环(或者从右往左)显示一组文字。
我现在有下面一个难点:闪烁。如果移动速度比较快的时候,闪屏挺厉害。
代码如下: CWnd* Wnd_Pic;
Wnd_Pic = GetDlgItem(IDC_STATIC_PIC);
Wnd_Pic->GetClientRect(&RectPic);
Wnd_Pic->MapWindowPoints(this,&RectPic); RectText.left = RectPic.left - 100;
RectText.top = RectPic.top;
RectText.right = RectPic.left;
RectText.bottom = RectPic.top + 30; CClientDC dc(this);
DC_BK->CreateCompatibleDC(&dc);//背景
Bitmap_BK.CreateCompatibleBitmap(&dc,RectPic.Width(),RectPic.Height());
DC_BK->SelectObject(&Bitmap_BK); CClientDC dc1(this);
DC_BKT->CreateCompatibleDC(&dc1);//前景
Bitmap_BKT.CreateCompatibleBitmap(&dc,RectText.Width(),RectText.Height());
DC_BKT->SelectObject(&Bitmap_BKT);
这是主函数里面的代码:
这是响应按钮的代码:
void CTextDlgDlg::OnButton2() 
{
  
CBrush Brush;
Brush.CreateSolidBrush(RGB(0,255,0));
DC_BK->FillRect(CRect(0,0,RectPic.Width(),RectPic.Height()),&Brush);
// GetBufferX += 20;
// GetDC()->BitBlt(RectPic.left+0,RectPic.top,RectPic.Width(),RectPic.Height(),DC_BK,0,0,SRCCOPY);//
//GetDC()->BitBlt(RectShow.left+80,RectShow.top,RectShow.Width(),RectShow.Height(),DC_BKT,80,0,SRCCOPY);//
// GetDC()->BitBlt(RectShow.right - GetBufferX ,RectShow.top,GetBufferX,RectShow.Height(),DC_BKT,RectShow.Width()-GetBufferX,0,SRCCOPY);//
//  UpdateFace();
     SetTimer(2,1000,NULL);
}
我在定时器里面调用UpdateFace这个函数void CTextDlgDlg::UpdateFace()
{
//装载背景
GetDC()->BitBlt(RectPic.left+0,RectPic.top,RectPic.Width(),RectPic.Height()/2,DC_BK,0,0,SRCCOPY);// GetBufferX += buffer;//记录偏移量
 if(RectShow.left >= RectPic.left && RectShow.right <= RectPic.right)
 {
 //全部进入是是如何显示的
 RectShow.left += buffer;
 RectShow.right += buffer;    if(RectShow.right >= RectPic.right)
 {
            GetDC()->BitBlt(RectShow.left+0,RectShow.top,RectShow.Width() - (RectShow.right - RectPic.right),RectShow.Height(),DC_BKT,0,0,SRCCOPY);//     
 }
 else 
 {
 GetDC()->BitBlt(RectShow.left+0,RectShow.top,RectShow.Width(),RectShow.Height(),DC_BKT,0,0,SRCCOPY);//     
 }
 
 }
 else if(GetBufferX <= RectShow.Width())
 {
 
 
 RectShow.left += buffer;
 RectShow.right += buffer;
 //左边还没有全部进入是如何显示
 //if(RectText.right > RectPic.left)
 //{
 GetDC()->BitBlt(RectShow.right - GetBufferX +0,RectShow.top,GetBufferX,RectShow.Height(),DC_BKT,RectShow.Width() - GetBufferX,0,SRCCOPY);//
// }
 }
 else if(RectShow.right + buffer > RectPic.right && RectShow.left  + buffer < RectPic.right)
 {
          //右边已经出去但是左边还没有出去是如何显示的。
 RectShow.left += buffer;
 //RectText.right += buffer;  
 GetDC()->BitBlt(RectShow.left+0,RectShow.top,RectPic.right - RectShow.left,RectShow.Height(),DC_BKT,0,0,SRCCOPY);//
 
 }
 else if(RectShow.left + buffer >= RectPic.right)
 {
          RectShow = RectText;
          GetBufferX = 0;
 }}///////////////////////////////////////////////////////////////////
请各位大哥看看,帮俺想想办法,挑挑毛病!先给20分。如能解决,100奉上,决不食言!

解决方案 »

  1.   

    既然动态显示的 是文字
    就不用两个dcMem
    你说比较闪烁,可能就是因为两个dcMem的缘故
    你可以直接控制在背景dcMem中TextOut的位置,CBitmap的大小已经固定
    超出的也不会显示出来如果图片比较大
    也可以用IntersectClipRect控制区域
      

  2.   

    我想闪烁的原因是这样造成的:
    文字是由左往右显示的,当文字区域进入静态文本框的区域越来越大的时候,背景是必须要重画的,这样造成重画的面积比较大,所以才用闪烁。
    我想并不是用一个dcMem或是两个dcMem的问题!大家讨论吗!
      

  3.   

    to duyhui
    能详细说说双通道的思路和方法吗?