CMove的头文件
#pragma once
/*类的初始化用 WM_CREATE消息*/
#include"CMemoryDC.h"
#include"stdafx.h"
class CMove:public CWnd
{
private:
CFont m_font; //字体
CString m_Text; //输出的文字
UINT m_num; //定时器编号
COLORREF m_ColorText, m_ColorBack; //文字颜色 背景色
int m_left;
CMemoryDC m_memory, m_back; //双内存技术
public:
CMove();
CMove(const CString Text);
CMove(const PTCHAR Text);
~CMove();
public:
void GetTextColor(COLORREF &colorText)const;
void GetBkColor(COLORREF &colorBk)const;
//修改字符串
void SetText(const CString Text);
void SetText(const PTCHAR Text);
//设置颜色
void SetTextColor(const COLORREF &ColorText);
void SetBkColor(const COLORREF &ColorBk);
//调用系统定时器
void Start(UINT time = 20, UINT num = 1);
//结束系统定时器
void Pause();
//创建
void Create(CRect pRect, CWnd *pParent, const UINT &nID);
void CreateEx(const DWORD &nType, CRect pRect, CWnd *pParent, const UINT &nID);
//x轴方向移动
void xMove();
DECLARE_MESSAGE_MAP()
afx_msg void OnTimer(UINT_PTR nIDEvent);
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnPaint();
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
afx_msg void OnNcPaint();
};
CMove的.cpp文件
#include "stdafx.h"
#include "CMove.h"
CMove::CMove()
{
m_ColorText = GetSysColor(COLOR_WINDOWTEXT);
m_ColorBack = GetSysColor(COLOR_BTNFACE);
}
CMove::CMove(const CString Text)
{
m_ColorText = GetSysColor(COLOR_WINDOWTEXT);
m_ColorBack = GetSysColor(COLOR_BTNFACE);
m_Text = Text;
}
CMove::CMove(const PTCHAR Text)
{
m_ColorText = GetSysColor(COLOR_WINDOWTEXT);
m_ColorBack = GetSysColor(COLOR_BTNFACE);
m_Text = Text;
}
CMove::~CMove()
{
Pause();
}
void CMove::GetTextColor(COLORREF & colorText) const
{//colorText 是获取文字颜色的结构体
colorText = m_ColorText;
}
void CMove::GetBkColor(COLORREF & colorBk) const
{//colorBk 获取背景颜色的结构体
colorBk = m_ColorBack;
}
void CMove::SetText(const CString Text)
{
m_Text = Text;
}
void CMove::SetText(const PTCHAR Text)
{
m_Text = Text;
}
void CMove::SetTextColor(const COLORREF & ColorText)
{
m_ColorText = ColorText;
}
void CMove::SetBkColor(const COLORREF & ColorBk)
{
m_ColorBack = ColorBk;
}
void CMove::Start(UINT time, UINT num)
{//num 是定时器编号 time 是间隔时间
m_num = num;
SetTimer(num, time, NULL);
}
void CMove::Pause()
{
KillTimer(m_num);
}
void CMove::Create(CRect pRect, CWnd * pParent, const UINT &nID)
{//pRect 是创建的大小 pParent 是父窗口句柄 nID 是控件ID
BOOL n = CWnd::Create(NULL, NULL, WS_CHILD | WS_VISIBLE, pRect, pParent, nID);
}
void CMove::CreateEx(const DWORD &nType, CRect pRect, CWnd * pParent, const UINT & nID)
{
BOOL n = CWnd::CreateEx(nType, NULL, NULL, WS_CHILD | WS_VISIBLE, pRect, pParent, nID);
}
void CMove::xMove()
{
}
BEGIN_MESSAGE_MAP(CMove, CWnd)
ON_WM_TIMER()
ON_WM_CREATE()
ON_WM_PAINT()
ON_WM_ERASEBKGND()
ON_WM_NCPAINT()
END_MESSAGE_MAP()
//系统定时消息
void CMove::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
Invalidate(FALSE);
CWnd::OnTimer(nIDEvent);
}
int CMove::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CWnd::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: 在此添加您专用的创建代码
CRect clientRect;
GetClientRect(clientRect);
m_left = clientRect.right;
//创建内存
m_memory.Create(clientRect.Width(), clientRect.Height());
Start();
return 0;
}
//无双闪技术
//void CMove::OnPaint()
//{
// CClientDC dc(this);
// dc.SetTextColor(m_ColorText); //设置文字颜色
//
// dc.SelectObject(GetFont()); //设置字体
//
// CRect clientRect;
// GetClientRect(clientRect);
//
// CSize size = dc.GetOutputTextExtent(m_Text);
//
// dc.FillRect(clientRect, &CBrush(m_ColorBack));
// dc.SetBkMode(TRANSPARENT);
//
// CRect rect = clientRect;
// rect.left = m_left;
// //输出文字
// dc.DrawText(m_Text, rect, DT_VCENTER | DT_SINGLELINE);
//
// m_left -= 1;
//
// if (m_left + size.cx <= 0)
// m_left = clientRect.right;
//}
void CMove::OnPaint()
{
CClientDC dc(this);
m_memory.SetTextColor(m_ColorText); //设置文字颜色
m_memory.SelectObject(GetFont()); //设置字体
CRect clientRect;
GetClientRect(clientRect);
CSize size = dc.GetOutputTextExtent(m_Text);
m_memory.FillRect(clientRect, &CBrush(m_ColorBack));
m_memory.SetBkMode(TRANSPARENT);
CRect rect = clientRect;
rect.left = m_left;
//输出文字
m_memory.DrawText(m_Text, rect, DT_VCENTER | DT_SINGLELINE);
dc.BitBlt(0, 0, m_memory.GetWidth(), m_memory.GetHeight(), &m_memory,
0, 0, SRCCOPY);
m_left -= 1;
if (m_left + size.cx <= 0)
m_left = clientRect.right;
}
//防闪烁
BOOL CMove::OnEraseBkgnd(CDC* pDC)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
return TRUE;
}
void CMove::OnNcPaint()
{
// TODO: 在此处添加消息处理程序代码
// 不为绘图消息调用 CWnd::OnNcPaint()
}