函数原型:
virtual COLORREF CDC::SetTextColor(COLORREF crColor);
调用成功返回文本原本的颜色。默认文本颜色为黑色。
函数原型:
int CDC::SetBkMode(int nBkMode);
调用成功返回原背景模式。
nBkMode可以取的值:
代码 | 功能 |
OPAQUE | 使用当前窗口的背景画刷颜色填充文字背景。这是默认的文本背景模式。 |
TRANSPARENT | 将文字背景设置为透明。 |
函数原型:
virtual COLORREF CDC::SetBkColor(COLORREF crColor);
调用成功返回原背景颜色,出现错误返回0x80000000。默认的背景色是白色。
函数原型:
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对象。调用成功返回非零,否则返回零。
函数原型:
void CString::Format(LPCTSTR lpszFormat,...);
void CString::Format(UNIT nFormatID,...);
lpszFormat是格式控制字符串,如%c、%f等,nFormatID是包含格式控制字符串的资源标识符。
函数原型:
BOOL CFont::CreateFontIndirect(const LOGFONT* lpLogFont);
lpLogFont是LOGFONT结构体的指针,该结构体定义了逻辑字体。调用成功返回非零,否则返回零。
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;
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);//蓝字,浮点数
}
实现效果:
此代码中用到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();
}
实现效果:
在这个例子中我发现很多字体设置无效,不知道是什么原因,尝试多次未能解决,先记录之。