文字横向滚动的关键在于在计时器里递增文字位置的偏移并重绘,还要处理边界和循环绘制的效果,下面是一个基于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();
}