文字横向滚动的实现

文字横向滚动的关键在于在计时器里递增文字位置的偏移并重绘,还要处理边界和循环绘制的效果,下面是一个基于CStatic的文字横向滚动的例子

void  CMyStatic::OnTimer(UINT  nIDEvent)    
{  
           //  TODO:  Add  your  message  handler  code  here  and/or  call  default  
           CString  strText;  
           GetWindowText(strText);  
           if  (strText  ==  m_strText)  
           {  
                       CDC*  pDC  =  GetDC();  
                       pDC->SelectObject(&m_font);  
                       CSize  size  =  pDC->GetTextExtent(strText);  
                       ReleaseDC(pDC);  
                       CRect  rect;  
                       GetClientRect(rect);  
                       int  iWidth  =  rect.Width();  
                       if  (size.cx  >  iWidth)  
                       {                          
 
                                   Invalidate();  
                                   UpdateWindow();  
                                   m_iExtend  +=  2;  
                                   if  (m_iExtend  >  size.cx)  
                                               m_iExtend  -=  size.cx  +  8;  
                       }  
           }  
           else  
           {  
                       m_iExtend  =  0;  
                       m_strText  =  strText;  
           }  
           CStatic::OnTimer(nIDEvent);  
}  
void  CMyStatic::OnPaint()    
{  
           //  TODO:  Add  your  message  handler  code  here  
             
           CPaintDC  dc(this);  
           CRect  rc;  
           GetClientRect(rc);  
           CString  strText;  
           GetWindowText(strText);  
           CDC  memDC;  
           memDC.CreateCompatibleDC(&dc);  
           CBitmap  bmp;  
           bmp.CreateCompatibleBitmap(&dc,  rc.Width(),  rc.Height());  
           memDC.SelectObject(&bmp);  
           memDC.SelectObject(&m_font);  
           dc.SelectObject(&m_font);  
                 memDC.FillSolidRect(rc,  RGB(255,  255,  255);  
           CSize  size  =  memDC.GetTextExtent(strText);  
           if  (size.cx  >  rc.Width())  
           {  
           if  (size.cx  -  m_iExtend  >  0)  
                       memDC.TextOut(rc.left  -  m_iExtend,  rc.top  +  (rc.Height()  -  size.cy)/2,  strText);  
           if  (rc.left  -  m_iExtend  +  8  +size.cx  <  rc.right)  
                       memDC.TextOut(rc.left  -  m_iExtend  +  8+size.cx  ,  rc.top  +  (rc.Height()  -  size.cy)/2,  strText);  
           }  
           else  
                       memDC.TextOut(rc.left,  rc.top  +  (rc.Height()  -  size.cy)/2,  strText);  
 
 
           dc.BitBlt(rc.left,  rc.top,  rc.Width(),  rc.Height(),  &memDC,  rc.left,  rc.top,  SRCCOPY);  
           memDC.DeleteDC();  
           bmp.DeleteObject();  
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值