VC++设置字体 字幕变色功能的实现 DrawText函数 本章小结

本文介绍了在VC++中如何使用MFC的CFont类设置字体,通过CreatePointFont函数创建字体对象并改变文字大小。同时,详细讲解了如何利用DrawText函数实现文字的平滑变色效果,模拟卡拉OK字幕的动态变色。通过设置定时器和调整矩形宽度,使得文字颜色渐变,实现了一种视觉上的平滑过渡。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

设置字体

字幕变色功能的实现

DrawText函数

本章小结

接上:VC++字符输入 ASCII码

接下:


设置字体

MFC提供了一个CFont类专门用来设置字体。这个类派生于CGdiObject类,封装了一个Windows图形设备接口(GDI)的字体。在实际编程时,在构造了一个CFont对象后,还必须利用该类提供的几个初始化函数之一对该对象进行初始化,然后才能使用这个对象。CFont类提供的初始化函数有:

■ CreateFont

■ CreateFontIndirect

■ CreatePointFont

■ CreatePointFontIndirect

这些初始化函数的作用主要是将CFont这个C++对象字体资源关联起来。本例将使用CreatePointFont这个初始化函数,其声明形式如下所示。

CFont::CreatePointFont

BOOL CreatePointFont(int nPointSize, LPCTSTR lpszFaceName, CDC* pDC = NULL);

该函数带有三个参数,各个参数的含义如下所述。

■ nPointSize设置将要创建的字体的高度,单位是一个点的十分之一。例如,如果该参数值为120,那么要求创建一个12个点的字体。

■ lpszFaceName字体的名称,就像Word中使用的“楷体”“宋体”这些字体名称一样。

在VisualStudio开发环境中,可以看到这些字体的名称,方法是单击【工具】菜单下的【选项】菜单命令,这时会弹出“选项”对话框,在左边的列表框中展开“环境”节点,选中“字体和颜色”,接下来就可以在“字体”的下拉列表中看到所有可用的字体名称,如下图所示。

但是, Visual Studio开发环境支持的字体还是少了一些,我们可以在机器的系统目录下看到系统已安装的所有字体。系统目录是Windows。在系统目录下有一个Fonts目录,在该目录下列出的内容就是操作系统已安装的字体。我们编写的程序并不能够对所有这些字体提供支持,程序支持哪些字体,需要通过试验才能知道。

■ pDC这是一个 CDC 对象的指针,用来把 nPointSize 中指定的高度转换为逻辑单位。如果其值为空,就使用一个屏幕设备描述表来完成这种转换。 

在程序中,与其他GDI对象一样,当创建了一个字体对象并初始化后,还必须将它选入设备描述表,之后这个新字体才能发挥作用。这可以利用CDC类的SelectObject函数来实现,同样,该函数会返回先前的字体,我们可以保存这个字体,在使用完新字体后,再把设备描述表中的字体恢复为先前的字体。

OnChar函数中添加了字体的设置之后,该函数完整的代码如例所示。

	CFont font;
	font, CreatePointFont(300, _T("华文行楷"), NULL);
	CFont *pOldFont = dc.SelectObject(&font);
	dc.SelectObject(pOldFont);
void CTextView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	CClientDC dc(this);
	CFont font;
	font, CreatePointFont(300, _T("华文行楷"), NULL);
	CFont *pOldFont = dc.SelectObject(&font);
	TEXTMETRIC tm;
	dc.GetTextMetrics(&tm);
	if (0x0d == nChar)
	{
		m_strLine.Empty();
		m_ptOrigin.y += tm.tmHeight;
	}
	else if (0x08 == nChar)
	{
		COLORREF clr = dc.SetTextColor(dc.GetBkColor());
		dc.TextOut(m_ptOrigin.x, m_ptOrigin.y, m_strLine);
		m_strLine = m_strLine.Left(m_strLine.GetLength() - 1);
		dc.SetTextColor(clr);
	}
	else
	{
		m_strLine += (TCHAR)nChar;
	}

	CSize sz = dc.GetTextExtent(m_strLine);
	CPoint pt;
	pt.x = m_ptOrigin.x + sz.cx;
	pt.y = m_ptOrigin.y;
	SetCaretPos(pt);

	dc.TextOut(m_ptOrigin.x, m_ptOrigin.y, m_strLine);

	dc.SelectObject(pOldFont);

	CView::OnChar(nChar, n
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

米酒馆

鼓励鼓励,鼓励很重要啦~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值