设置文本格式 (GDI+)

若要对文本应用特殊格式,请初始化 StringFormat 对象,并将该对象的地址传递给 Graphics 类的 DrawString 方法。

若要在矩形中绘制格式化文本,需要 GraphicsFontFamilyFontRectFStringFormatBrush 对象。

对齐文本

以下示例在矩形中绘制文本。 每行文本 (左右) 居中,整个文本块在矩形中 (从上到下) 居中。

WCHAR string[] = 
   L"Use StringFormat and RectF objects to center text in a rectangle.";
                       
FontFamily   fontFamily(L"Arial");
Font         font(&fontFamily, 12, FontStyleBold, UnitPoint);
RectF        rectF(30.0f, 10.0f, 120.0f, 140.0f);
StringFormat stringFormat;
SolidBrush   solidBrush(Color(255, 0, 0, 255));

// Center-justify each line of text.
stringFormat.SetAlignment(StringAlignmentCenter);

// Center the block of text (top to bottom) in the rectangle.
stringFormat.SetLineAlignment(StringAlignmentCenter);

graphics.DrawString(string, -1, &font, rectF, &stringFormat, &solidBrush);

Pen pen(Color(255, 0, 0, 0));
graphics.DrawRectangle(&pen, rectF);
            

下图显示了矩形和居中文本。

包含一个矩形的窗口的屏幕截图,该矩形包含六行文本,水平居中

前面的代码调用 StringFormat 对象的两个方法: StringFormat::SetAlignmentStringFormat::SetLineAlignment。 对 StringFormat::SetAlignment 的调用指定每行文本都居中,该矩形由传递给 DrawString 方法的第三个参数提供。 调用 StringFormat::SetLineAlignment 指定文本块在矩形中 (从上到下) 居中。

StringAlignmentCenter 是在 Gdiplusenums.h 中声明的 StringAlignment 枚举的元素。

设置制表位

可以通过调用 StringFormat 对象的 StringFormat::SetTabStops 方法,然后将该 StringFormat 对象的地址传递到 Graphics 类的 DrawString 方法,为文本设置制表位。

以下示例将制表位设置为 150、250 和 350。 然后,代码将显示名称和测试分数的选项卡式列表。

WCHAR string[150] = 
   L"Name\tTest 1\tTest 2\tTest 3\n";

StringCchCatW(string, 150, L"Joe\t95\t88\t91\n");
StringCchCatW(string, 150, L"Mary\t98\t84\t90\n");
StringCchCatW(string, 150, L"Sam\t42\t76\t98\n");
StringCchCatW(string, 150, L"Jane\t65\t73\t92\n");
                       
FontFamily   fontFamily(L"Courier New");
Font         font(&fontFamily, 12, FontStyleRegular, UnitPoint);
RectF        rectF(10.0f, 10.0f, 450.0f, 100.0f);
StringFormat stringFormat;
SolidBrush   solidBrush(Color(255, 0, 0, 255));
REAL         tabs[] = {150.0f, 100.0f, 100.0f};

stringFormat.SetTabStops(0.0f, 3, tabs);

graphics.DrawString(string, -1, &font, rectF, &stringFormat, &solidBrush);

Pen pen(Color(255, 0, 0, 0));
graphics.DrawRectangle(&pen, rectF);
            

下图显示了选项卡式文本。

包含四列文本的矩形的插图;每列都左对齐

前面的代码将三个参数传递给 StringFormat::SetTabStops 方法。 第三个参数是包含制表位偏移量的数组的地址。 第二个参数指示该数组中有三个偏移量。 传递给 StringFormat::SetTabStops 的第一个参数为 0,表示数组中的第一个偏移量是从边界矩形的左边缘位置 0 开始测量的。

绘制垂直文本

可以使用 StringFormat 对象来指定垂直而不是水平绘制文本。

以下示例将值 StringFormatFlagsDirectionVertical 传递给 StringFormat 对象的 StringFormat::SetFormatFlags 方法。StringFormat 对象的地址将传递给 Graphics 类的 DrawString 方法。 值 StringFormatFlagsDirectionVertical 是在 Gdiplusenums.h 中声明的 StringFormatFlags 枚举的元素。

WCHAR string[] = L"Vertical text";
                     
FontFamily   fontFamily(L"Lucida Console");
Font         font(&fontFamily, 14, FontStyleRegular, UnitPoint);
PointF       pointF(40.0f, 10.0f);
StringFormat stringFormat;
SolidBrush   solidBrush(Color(255, 0, 0, 255));

stringFormat.SetFormatFlags(StringFormatFlagsDirectionVertical);

graphics.DrawString(string, -1, &font, pointF, &stringFormat, &solidBrush);
            

下图显示了垂直文本。

显示包含顺时针旋转 90 度文本的窗口的插图