本篇是图形函数学习的最后一篇,相关内容暂告一段落。
在图形界面输出文字,涉及文字字体、大小、颜色、背景、显示等问题,完成这些需要系列函数的支持。下面做简要介绍。
一、输出文本函数
原型:virtual BOOL textOut(int x, int y, LPCTSTR lpszString, int nCount);
BOOL TextOut(int x, int y, const CString& string);
参数:(x,y)输出文本起点坐标
lpszString 字符串指针
int nCount 字符串长度(LPCTSTR类型获得字符串长度可用CString(str).GetLength())
string 指向CString对象的指针
返回值:显示成功返回非0数字,失败返回0。
说明:
a.这个函数属于CDC类成员函数,使用时需要CDC类对象指针调用。
b.关于文字字符串起始位置,若把字符串看做矩形的话,起始位置是左上角。
c.如果直接调用这个函数输出文字,则字体、大小、颜色等使用的都是缺省设置;如需改变这些设置,需要使用下面这些函数,且需要在输出文字前进行设置。
d.关于参数中的字符串:多字符集情况下,可以使用char*、LPCTSTR类型声明对象并用"="直接赋值,也可以使用CString声明对象,并用对象调用其成员函数Format完成赋值;UNICODE情况下,可以使用LPCTSTR类型声明对象并用"="赋值,也可以使用CString声明对象,并用对象调用其成员函数Format完成赋值,但在字符串引号前要加L。
二、定义字体函数
原型:BOOL CreateFontIndirect(const LOGFONT* lpLogFont);
参数:lpLogFont是字体属性结构体(LOGFONT)指针,该结构体的使用见下。
返回值:定义字体成功返回非0数,否则返回0。
说明:
a.这个函数时CFont的成员函数,使用时需要CFont对象(指针)调用。
b.字体属性结构体LOGFONT常用属性:
lfHeight; //字体高度、LONG类型
lfWidth; //字体宽度、LONG类型(取值0时系统自动与lfHeight匹配)
lfEscapement; //倾角、LONG类型(文本行与X轴夹角,1=1/10度,顺时针方向为正)
lfOrientation; //文本基准线、LONG类型
lfWeight; //字体笔画粗细、LONG类型(取值0-900)
lfItalic; //斜体标志、BYTE类型(0标准、1倾斜)
lfUnderline; //下划线、BYTE类型
lfStrikeOut; //删除线、BYTE类型
lfCharSet; //字符集、BYTE类型(一般取值GB2312_CHARSET,也可使用DEFAULT_CHARSET)
lfFaceName[LF_FACESIZE];//字体名、TCHAR类型、如"宋体"、"仿宋"等
c.声明LOGFONT结构体对象后,一般将其用memset函数全部初始化成0<缺省值>,然后再对需要的属性进行赋值,其它的就使用缺省值。为lfFaceName赋值时,不能使用“=”赋值,若是UNICODE模式,需要使用wcscpy_s函数赋值;多字符集模式,使用strcpy_s函数赋值。
d.调用CreateFontIndirect生成的字体后,也需要调用SelectObject函数选入CDC,并用CFont*接收其返回值用于恢复缺省字体。(和使用画刷相似)
三、设置文字颜色函数
原型:virtual COLORREF SetTextColor (COLORREF color);
参数:color COLORREF类型的颜色值(可直接使用16进制、也可调用RGB函数)
返回值:返回原来文本颜色的RGB值,设置失败返回CLR_INVALID(0xFFFFFFFF)
说明:
a.该函数是CDC类的成员函数,使用时需CDC类对象或指针调用。
b.通过该函数进行文字颜色的设置,应接收其返回值,并在完成文字显示后恢复缺省设置。
四、设置文字背景颜色函数
原型:virtual COLORREF SetBkColor(COLORREF color);
参数:color为COLORREF类型的颜色值
返回值:原有的背景色,设置失败返回CLR_INVALID(0xFFFFFFFF)
说明:
a.这个函数是CDC类的成员函数,使用是需CDC类对象或指针调用。
b.所谓背景色,仅是显示文字的背景色,不涉及其它。
五、设置背景模式函数
原型:int SetBkMode(int nBkMode);
参数:nBkMode有两个取值:OPAQUE(值=2),表示背景颜色设置生效(默认设置,不调用这个函数的效果);TRANSPARENT(值=1),表示背景透明,背景颜色不改变。
返回:返回原背景模式。
说明:这个函数的TRANSPARENT模式在实际使用时,更有用处。也就是:当我们设置了字体颜色,背景颜色随已有图形颜色时,就没必要在设置背景颜色,只要把背景模式设置为TRANSPARENT即可。
六、举例程序
使用红(0000FF)、橙(007FFF)、黄(00FFFF)、绿(00FF00)、青(FFFF00)、蓝(FF0000)、紫(FF008B)、黑(000000)八种颜色在自定义坐标系中绘制8个填充扇形;每个扇形占半个象限;在扇形中用文字标出颜色名。
步骤一:在CMFC2DGraphView.h中定义一个全局宏,代码:
#define PI 3.14159
步骤二:在CMFC2DGraphView.h中,找到CMFC2DGraphView类,在类内public:下声明自定义画扇形函数,代码:
public:
//声明自定义画扇形函数
void myPie(double startRad, double endRad, COLORREF fillColor,
LPCTSTR str, COLORREF strColor);
//参数说明:startRad-扇形起点弧度、endRad-终点弧度、fillColor-填充颜色、
// str-标识文字、strColor-表示文字颜色
步骤三:在CMFC2DGraphView.cpp中实现myPie函数,代码:
//实现自定义画扇形函数
void CMFC2DGraphView::myPie(
double startRad,
double endRad,
COLORREF fillColor,
LPCTSTR str,
COLORREF strColor)
{
//自定义坐标系
CRect rect;
GetClientRect(rect);
CDC* pDC;
pDC = GetDC();/*做一点说明:GetDC()函数是CWnd类成员函数,使用时需要CWind类对象或指针调用;但由于我们是在视图类中作图,而视图类的基类就是CWnd类,所以使用this指针就可以调用,而this指针可以省略,所以这个函数在视图类中可以直接使用,就像全局函数一样。*/
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);
//以当前窗口宽、高最小者的35%为扇形半径
int r = min(rect.Width(), rect.Height()) * 0.35;
//定义扇形填充颜色画刷、同颜色画笔并选入CDC
CBrush brush(fillColor);
CBrush* oldBrush = pDC->SelectObject(&brush);
CPen pen(PS_SOLID, 1, fillColor);
CPen* oldPen=pDC->SelectObject(&pen);
//绘制扇形
pDC->Pie(-r,r,r,-r, r*cos(startRad),r*sin(startRad), r * cos(endRad), r * sin(endRad));
//恢复缺省画刷、画笔
pDC->SelectObject(oldBrush);
pDC->SelectObject(oldPen);
//定义字体、字体颜色、背景模式并选入CDC
LOGFONT logfont; //字体属性结构体设置
memset(&logfont, 0, sizeof(logfont));
logfont.lfCharSet = DEFAULT_CHARSET;
wcscpy_s(logfont.lfFaceName,L"仿宋");
logfont.lfHeight = 35;
logfont.lfEscapement = (startRad + (endRad - startRad) / 2) * (-180) / PI;
CFont cfont; //字体生成
cfont.CreateFontIndirectW(&logfont);
CFont* oldFont=pDC->SelectObject(&cfont);
COLORREF oldColor = pDC->SetTextColor(strColor); //字体颜色设置
pDC->SetBkMode(TRANSPARENT);
//显示文字
pDC->TextOutW(r * 0.7 * cos(startRad + (endRad - startRad) / 2)-18,
r * 0.7 * sin(startRad + (endRad - startRad) / 2)+18,
str, CString(str).GetLength());
//恢复字体、字体颜色、背景模式缺省设置
pDC->SelectObject(oldFont);
pDC->SetTextColor(oldColor);
pDC->SetBkColor(OPAQUE);
ReleaseDC(pDC); //前面用GetDC获取了pDC,这里要释放,函数性质同GetDC
}
步骤四:在OnDraw函数中调用myPie函数,画出要求的扇形,代码:
myPie(0 * PI / 4, 1 * PI / 4, 0x0000ff, L"红", 0x000000);//填充红、文字黑
myPie(1 * PI / 4, 2 * PI / 4, 0x007fff, L"橙", 0x8b00ff);//填充橙、文字紫
myPie(2 * PI / 4, 3 * PI / 4, 0x00ffff, L"黄", 0xff0000);//填充黄、文字蓝
myPie(3 * PI / 4, 4 * PI / 4, 0x00ff00, L"绿", 0x000000);//填充绿、文字黑
myPie(4 * PI / 4, 5 * PI / 4, 0xffff00, L"青", 0xff0000);//填充青、文字蓝
myPie(5 * PI / 4, 6 * PI / 4, 0xff0000, L"蓝", 0x0000ff);//填充青、文字红
myPie(6 * PI / 4, 7 * PI / 4, 0xff008B, L"紫", 0x00ffff);//填充青、文字黄
myPie(7 * PI / 4, 8 * PI / 4, 0x000000, L"黑", 0x00ffff);//填充青、文字黄
(以上代码也可以写成循环,颜色定义成COLORREF数组)
七、程序运行效果截图