头文件:
CArray m_Text; //字符串数组
CArray m_rgn; //图像区域的数组
CFont m_font; //字体类型
int m_nIndex, m_nLeft;
CMemoryDC m_front; //在内存中建立前景色
CMemoryDC m_back; //在内存中建立背景色
CMemoryDC m_dc; //获取文字的区域
CRect m_rect; //获取窗口大小
// 设置字体大小
void SetFontSize();
// 初始化内存DC
void InitCMemory(CMemoryDC &dc);
// 获取单个文字区域
void TextRgn(LPCTSTR szText, CRgn &rgn);
// 获取多个文字区域
void TextAllRgn();
afx_msg void OnTimer(UINT_PTR nIDEvent);
// 设置窗口为文字大小
void SetWindowToStr();
afx_msg LRESULT OnNcHitTest(CPoint point);
构造函数:
m_nIndex = 0;
m_nLeft = 20;
m_Text.Add(_T("生死无论"));
m_Text.Add(_T("I Love You"));
OnInitDialog()函数:
//设置文字大小
SetFontSize();
//获取窗口大小
GetClientRect(m_rect);
//初始化内存DC
InitCMemory(m_dc);
InitCMemory(m_front);
InitCMemory(m_back);
//获取所有文字的图形区域
TextAllRgn();
//设置窗口为文字大小
SetWindowToStr();
//设置定时器
SetTimer(1, 16, NULL);
OnPaint()函数:
CPaintDC dc(this);
//选择要显示那个图形区域
dc.SelectObject(&m_rgn[m_nIndex]);
//设置渐进色
m_front.ProgressiveColorY(m_rect, RGB(0, 255, 0),
RGB(255, 0, 0), &m_front);
m_back.ProgressiveColorY(m_rect, RGB(255, 128, 0),
RGB(255, 0, 0), &m_back);
//先输出前景色,在输出背景
dc.BitBlt(0, 0, m_nLeft, m_rect.Height(), &m_front,
0, 0, SRCCOPY);
dc.BitBlt(m_nLeft, 0, m_rect.Width(), m_rect.Height(), &m_back,
0, 0, SRCCOPY);
系统定时函数:
CRect rect;
m_rgn[m_nIndex]->GetRgnBox(rect);
if (++m_nLeft >= rect.right)
{
m_nLeft = 20;
if (++m_nIndex >= m_Text.GetSize())
m_nIndex = 0;
SetWindowToStr();
}
Invalidate(FALSE);
窗口移动消息:
//窗口移动消息
LRESULT CTextDlg::OnNcHitTest(CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
return HTCAPTION;
}
自定义函数:
// 设置字体大小
void CTextDlg::SetFontSize()
{
// TODO: 在此处添加实现代码.
//获取系统字体
CFont *font = GetFont();
//获取字体类型
LOGFONT lf;
font->GetLogFont(&lf);
//修改
lf.lfWeight = 900;
lf.lfHeight *= 5;
//在创建字体
m_font.CreateFontIndirectW(&lf);
}
// 初始化内存DC
void CTextDlg::InitCMemory(CMemoryDC &dc)
{
// TODO: 在此处添加实现代码.
//创建
dc.Create(m_rect.Width(), m_rect.Height());
//选择字体
dc.SelectObject(&m_font);
}
// 获取单个文字区域
void CTextDlg::TextRgn(LPCTSTR szText, CRgn &rgn)
{
// TODO: 在此处添加实现代码.
COLORREF cl = GetSysColor(COLOR_WINDOW);
m_dc.FillSolidRect(0, 0, m_dc.GetWidth(), m_dc.GetHeight(), cl);
//在内存中输入文字
m_dc.TextOutW(20, 20, szText);
//获取文字区域
m_dc.BitRgn(rgn, cl);
}
// 获取多个文字区域
void CTextDlg::TextAllRgn()
{
// TODO: 在此处添加实现代码.
int i = 0, nSize = m_Text.GetSize();
while (nSize > i)
{
CRgn *r = new CRgn;
TextRgn(m_Text[i++], *r);
m_rgn.Add(r);
}
}
// 设置窗口为文字大小
void CTextDlg::SetWindowToStr()
{
// TODO: 在此处添加实现代码.
CRgn r;
r.CreateRectRgn(0, 0, 0, 0);
r.CopyRgn(m_rgn[m_nIndex]);
SetWindowRgn(r, TRUE);
}