歌词窗口实现

头文件:

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

 

你可能感兴趣的:(MFC)