流水文字的实现

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()
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值