转自:http://blog.youkuaiyun.com/primer_programer/archive/2007/12/26/1968760.aspx
在网上查找一些方法,也在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();
本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/primer_programer/archive/2007/12/26/1968760.aspx