MFC之学习输出文本和设置字体

1.笔记

1.1输出文本

1.1.1设置文本颜色函数

函数原型:

virtual COLORREF CDC::SetTextColor(COLORREF crColor);

调用成功返回文本原本的颜色。默认文本颜色为黑色。

1.1.2设置背景模式函数

函数原型:

int CDC::SetBkMode(int nBkMode);

调用成功返回原背景模式。

nBkMode可以取的值:

代码功能
OPAQUE使用当前窗口的背景画刷颜色填充文字背景。这是默认的文本背景模式。
TRANSPARENT将文字背景设置为透明。

1.1.3 设置背景颜色函数

函数原型:

virtual COLORREF CDC::SetBkColor(COLORREF crColor);

调用成功返回原背景颜色,出现错误返回0x80000000。默认的背景色是白色。

1.1.4输出文本函数

函数原型:

virtual BOOL CDC::TextOut(int x,int y,LPCTSTR lpszString,int nCount);
virtual BOOL CDC::TextOut(int x,int y,const CString& str);

(x,y)是文本的起点逻辑坐标,lpszString是文本的字符串指针,nCount是文本的字节长度,str是字符串的CString对象。调用成功返回非零,否则返回零。

1.1.5设置文本格式函数

函数原型:

void CString::Format(LPCTSTR lpszFormat,...);
void CString::Format(UNIT nFormatID,...);

lpszFormat是格式控制字符串,如%c、%f等,nFormatID是包含格式控制字符串的资源标识符。

1.2输出字体

1.2.1创建字体

函数原型:

BOOL CFont::CreateFontIndirect(const LOGFONT* lpLogFont);

lpLogFont是LOGFONT结构体的指针,该结构体定义了逻辑字体。调用成功返回非零,否则返回零。

1.2.2逻辑字体的属性

typedef struct tagLOGFONT{
    LONG lfHeight;    //逻辑高度
    LONG lfWidth;    //平均逻辑宽度
    LONG lfEscapement;    //倾角
    LONG lfOrientation;    //书写方向
    LONG lfWeight;    //粗细
    BYTE lfItalic;    //斜体标志
    BYTE lfUnderline;    //下划线标志
    BYTE lfStrikeOut;    //删除线标志
    BYTE lfCharSet;    //字符集
    BYTE lfOutPrecision;    //输出精度
    BYTE lfClipPrecision;    //裁剪精度
    BYTE lfQuality;    //输出质量
    BYTE lfPitchAndFamily;    //间距和族
    TCHAR lfFaceName[LF_FACESIZE];    //字样名
}LOGFONT,*PLOGFONT;

2.使用练习

2.1在程序中将输出文本的白底黑字、黄底红字、透明底绿色整数、蓝色浮点数效果都试一遍。

void CExample1View::OnDraw(CDC* pDC)
{
	CExample1Doc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if (!pDoc)
		return;

	// TODO: 在此处为本机数据添加绘制代码
	CString data, str;
	str = CString("3D Computer Graphics based on VS2019");
	data.Format(CString("%s"), str);//设置data的内容
	pDC->TextOutW(100, 100, data);//白底黑字,默认效果

	pDC->SetTextColor(RGB(255, 0, 0));
	pDC->SetBkColor(RGB(255, 255, 0));//黄底红字
	pDC->TextOutW(450, 100, CString("BoChuang Research Institute!"));

	pDC->SetTextColor(RGB(0, 255, 0));
	pDC->SetBkMode(TRANSPARENT);
	int a = 5, b = 8;
	data.Format(CString("%d,%d"), a, b);
	pDC->TextOutW(100, 120, data);//绿字透明底,整数

	double da = 8.2, db = 5.3;
	data.Format(CString("%f,%f"), da, db);
	pDC->SetTextColor(RGB(0, 0, 255));
	pDC->TextOutW(200, 120, data);//蓝字,浮点数
}

实现效果:

2.2自定义二维坐标系并绘制出来,根据给定的坐标点所在的象限位置,使用“华文彩云”汉字输出象限名称。

此代码中用到wcscpy字符串拷贝函数,微软不建议使用这个函数,可能会出现warning无法通过编译,如果非要使用这个函数,在解决方案资源管理器界面,右键项目,属性 -> C/C++ -> 预处理器 -> 预处理器定义 -> 编辑,在弹出界面的文本框中新增一行输入_CRT_SECURE_NO_WARNINGS即可。

void CExample1View::OnDraw(CDC* pDC)
{
	CExample1Doc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if (!pDoc)
		return;

	// TODO: 在此处为本机数据添加绘制代码
	CRect rect;
	GetClientRect(rect);
	pDC->SetMapMode(MM_ANISOTROPIC);
	pDC->SetWindowExt(rect.Width(), rect.Height());
	pDC->SetViewportExt(rect.Width(), -rect.Height());
	pDC->SetViewportOrg(rect.Width() / 2, rect.Height() / 2);
	rect.OffsetRect(-rect.Width() / 2, -rect.Height() / 2);

	CPen newPen, * pOldPen;
	newPen.CreatePen(PS_SOLID, 3, RGB(128, 128, 128));
	pOldPen = pDC->SelectObject(&newPen);

	pDC->MoveTo(rect.left, 0/*rect.CenterPoint().y*/);//画x轴
	pDC->LineTo(rect.right, 0);
	pDC->MoveTo(rect.right - 10, 5);//画x轴箭头
	pDC->LineTo(rect.right, 0);
	pDC->MoveTo(rect.right - 10, -5);
	pDC->LineTo(rect.right, 0);
	pDC->TextOutW(rect.right - 20, -30, _T("x"));//标注x轴

	pDC->MoveTo(0/*rect.CenterPoint().x*/, rect.top);//画y轴
	pDC->LineTo(0, rect.bottom);
	pDC->MoveTo(5, rect.bottom - 10);//画y轴箭头
	pDC->LineTo(0, rect.bottom);
	pDC->MoveTo(-5, rect.bottom - 10);
	pDC->LineTo(0, rect.bottom);
	pDC->TextOutW(-30, rect.bottom - 20, _T("y"));//标志y轴

	pDC->TextOutW(-20, -10, _T("O"));//标注原点
	pDC->SelectObject(pOldPen);

	CString title;
	title = _T("3D计算机图形学");
	CString quadrant1(_T("第一象限"));
	CString quadrant2(_T("第二象限"));
	CString quadrant3(_T("第三象限"));
	CString quadrant4(_T("第四象限"));

	CFont newFont, * pOldFont;
	LOGFONT lf;
	memset(&lf, 0, sizeof(LOGFONT));//将lf全部字节清零
	lf.lfHeight = 50;//设置字体高度
	lf.lfCharSet = GB2312_CHARSET;//设置字体字符集
	//设置字体字样名,拷贝字样名字符串到字样属性中
	wcscpy(lf.lfFaceName, _T("楷体"));
	newFont.CreateFontIndirectW(&lf);//创建字体
	pOldFont = pDC->SelectObject(&newFont);

	pDC->SetTextColor(RGB(0, 128, 0));
	pDC->TextOutW(rect.left + 100, rect.bottom - 10, title);

	pDC->SetTextColor(RGB(128, 0, 0));
	pDC->TextOutW(300, 200, quadrant1);
	pDC->TextOutW(-300, 200, quadrant2);
	pDC->TextOutW(-300, -200, quadrant3);
	pDC->TextOutW(300, -200, quadrant4);

	pDC->SelectObject(pOldFont);
        newFont.DeleteObject();
	newPen.DeleteObject();
}

实现效果:

在这个例子中我发现很多字体设置无效,不知道是什么原因,尝试多次未能解决,先记录之。

  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

赴星辰大海

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值