文本输出
文本的最终输出不仅依赖于文本的字体,而且还跟文本的颜色、对齐方式、字符间隔等有很大关系。GDI+只有一个输出文本的函数DrawString,它的原型如下:
| DrawString( const WCHAR* string, INT length, const Font* font, const RectF& layoutRect, const StringFormat* stringFormat, const Brush* brush ); DrawString( const WCHAR* string, INT length, const Font* font, const PointF& origin, const Brush* brush ); DrawString( const WCHAR* string, INT length, const Font* font, const PointF& origin, const StringFormat* stringFormat, const Brush* brush); |
其中,string用来指定要输出的字符串,length表示该字符串的长度,font用来指定字体,layoutRect用来指定一个字符串所输出的矩形区域,stringFormat用来指定文本输出格式化属性,origin用来指定字符串输出的起点。需要注意的是,PointF和RectF类与Point和Rect类基本相同,所不同的是数据类型是浮点而后者是INT型。brush用来指定一个画刷,这个画刷既可以是SolidBrush和HatchBrush,也可以是TextureBrush(纹理画刷),甚至是渐变画刷。例如下面的代码,结果如图7.14所示。
| Graphics graphics( pDC->m_hDC ); FontFamily fontFamily(L"幼圆"); Font font(&fontFamily, 20, FontStyleRegular, UnitPoint); PointF pointF(30, 10); Image image(L"image.jpg"); TextureBrush tBrush(&image); LinearGradientBrush linGrBrush( Point(30, 50), Point(100, 50), Color(255, 255, 0, 0), Color(255, 0, 0, 255)); WCHAR string[256]; wcscpy(string, L"欢迎使用GDI+!"); graphics.DrawString(string, (INT)wcslen(string), &font, pointF, &tBrush); pointF.Y += 50; graphics.DrawString(string, (INT)wcslen(string), &font, pointF, &linGrBrush); |
需要说明的是,在GDI+中,我们可以通过SetTextRenderingHint来控制文本输出的质量。例如下面的代码,其结果如图7.15所示。
| Graphics graphics( pDC->m_hDC ); FontFamily fontFamily(L"楷体_GB2312"); Font font(&fontFamily, 30, FontStyleRegular, UnitPixel); SolidBrush solidBrush(Color(255, 0, 0, 255)); WCHAR string1[] = L"没有任何优化处理"; WCHAR string2[] = L"字体优化,但边不作平滑处理"; WCHAR string3[] = L"消除走样,且边作平滑处理"; graphics.SetTextRenderingHint(TextRenderingHintSingleBitPerPixel); graphics.DrawString( string1, (INT)wcslen(string1), &font, PointF(10, 10), &solidBrush); graphics.SetTextRenderingHint(TextRenderingHintSingleBitPerPixelGridFit); graphics.DrawString( string2, (INT)wcslen(string2), &font, PointF(10, 50), &solidBrush); graphics.SetTextRenderingHint(TextRenderingHintAntiAliasGridFit); graphics.DrawString( string3, (INT)wcslen(string3), &font, PointF(10, 90), &solidBrush); |








