VC控件——让Static控件的文本具有滚动效果

来源:互联网 发布:sql 分组小计总计 编辑:程序博客网 时间:2024/05/17 07:59
 

在网上查找一些方法,也在codeproject上下载了几个源码,发现都没有达到我的目的。于是自己研究出一个方法:

 

实现效果:文本从右向左滚动,初始字符串在Static控件左边逐渐消失,当全部消失后,从Static的右边向左一点点的显示出来。如果Static控件的文本变化,则滚动从头开始。

实现方法分为两步:

1. 从Static控件左边一点点消失

   设置Timer,Timer执行一次,字符串从头的位置去掉一个字符。然后UpdateData()。

2. 从Static控件右边一点点显示出来

  这个没有别的好办法,只有在Static控件中绘图。为了去除闪烁,使用内存DC绘图。

 

整个代码如下:

void CAutoRunDlg::scrollServerInfo( )
{
 CString strCurText;
 if ( m_bScrollFlag )
 {
  strCurText = m_strScrollText.Right( m_strServerInfo.GetLength() - 1 );
  if ( strCurText.GetLength() == 0 )    // 字符串从左边缘全部消失
  {
   m_strServerInfo = "";
   UpdateData( FALSE );
   m_bScrollFlag = FALSE;
   GetDlgItem( IDC_EDIT_URL )->GetClientRect( &m_rectScroll );
   m_rectScroll.left = m_rectScroll.right;
   m_iScrollTextLeft = 0;
   m_strServerInfo = m_strScrollText;
  }
  else
  {
   m_strServerInfo = strCurText;     //控件关联变量赋值
   UpdateData( FALSE );        //更新控件
  }
 }
 else
 {
  m_iScrollTextLeft += m_iStep;         // 每一次向左移动的步长。
  if ( m_rectScroll.left == 0 )
  {
   m_bScrollFlag = TRUE;
   return ;
  }
  if ( ( m_rectScroll.right - m_iScrollTextLeft ) < 0 )
  {
   m_rectScroll.left = 0;
  }
  else
  {
   m_rectScroll.left = m_rectScroll.right - m_iScrollTextLeft;
  }
  m_dcMemStaticCtrl.CreateCompatibleDC( m_pDCStaticCtrl );
  m_bmpMemStaticCtrl.CreateCompatibleBitmap( m_pDCStaticCtrl,
               m_rectStaticCtrl.Width(),
               m_rectStaticCtrl.Height() );
  m_pOldBmpStaticCtrl = m_dcMemStaticCtrl.SelectObject( &m_bmpMemStaticCtrl );

  m_dcMemStaticCtrl.FillRect( &m_rectStaticCtrl, &m_brushScrollBg );
  m_pOldFontScrollText = m_dcMemStaticCtrl.SelectObject( m_fontScrollText );
  m_dcMemStaticCtrl.DrawText( m_strServerInfo, &m_rectScroll, DT_LEFT | DT_VCENTER );
  m_pDCStaticCtrl->BitBlt( m_rectScroll.left,
         m_rectScroll.top,
         m_rectScroll.Width(),
         m_rectScroll.Height(),
         &m_dcMemStaticCtrl,
         m_rectScroll.left,
         m_rectScroll.top,
         SRCCOPY );
   m_dcMemStaticCtrl.SelectObject( m_pOldBmpStaticCtrl );
  m_dcMemStaticCtrl.SelectObject( m_pOldFontScrollText );
  m_bmpMemStaticCtrl.DeleteObject();
  m_dcMemStaticCtrl.DeleteDC();
 }
}
说明:

1. 标志变量是标志滚动进行到哪一步的?是从左边缘消失,还是从右边缘逐渐显示

2. m_strServerInfo是控件关联变量。

变量定义:

 /************************************************************************/
 /* Scroll text variable                                                 */
 BOOL m_bScrolling;

 CString m_strScrollText;
 
 BOOL    m_bScrollFlag;  // true: left, false: right

 int  m_iStep;

 int     m_iScrollTextLeft;

 CRect m_rectStaticCtrl;

 CDC*    m_pDCStaticCtrl;

 CWnd*   m_pWndStaticCtrl;
 
 CDC  m_dcMemStaticCtrl;

 CBitmap m_bmpMemStaticCtrl;

 CBitmap* m_pOldBmpStaticCtrl;

 CRect m_rectScroll;

 CBrush  m_brushScrollBg;

 CBrush* m_pOldBrushScrollBg;

 CFont*  m_fontScrollText;

 CFont*  m_pOldFontScrollText;
 
 /************************************************************************/
变量的初始化:

 m_pWndStaticCtrl = GetDlgItem( IDC_EDIT_URL );
 m_pWndStaticCtrl->GetClientRect( &m_rectStaticCtrl );
 m_pDCStaticCtrl = m_pWndStaticCtrl->GetDC();
 m_brushScrollBg.CreateSolidBrush( RGB( 255, 255, 255 ) );
 m_fontScrollText = m_pWndStaticCtrl->GetFont();

 

 
原创粉丝点击