您的位置:首页 > 其它

gdi、gdi+文本相关函数

2012-12-30 15:27 267 查看
GDI:

TextOut() 最低级的文本输出函数,速度最快,没有裁剪,不能带tab(tab键被忽略)

TabbedTextOut() 上面函数的带tab版本

ExtTextOut() TextOut升级版,可以调整字符间距和裁剪矩形

DrawText() TextOut升级版,可以是多行文本,指定一个Rect,会自动换行,可以设置对齐方向

DrawTextEx() drawText升级版,可以指定tab的显示方式

GetTextExtentPoint32() 测量某文本的显示区域

GetTabbedTextExtent() 测量带tab键的字符串的显示区域

GetTextExtentExPoint() 根据某区域测量能显示下的字符个数

GetTextMetrics() 获取字体信息

GetTextFace(hdc,100,cc); 获取设备中字体名

SetTextColor (hdc, rgbColor) 、GetTextColor 设置文本颜色,默认黑色
SetBkMode (hdc, iMode) ; 设置背景模式OPAQUE or TRANSPARENT,默认OPAQUE不透明
SetBkColor (hdc, rgbColor) ; 设置背景颜色,默认白色 WHITE_BRUSH
GetStockObject(fnObject)获得一些默认的font , pen ,brush,所有的索引名字可以直接使用,如WHITE_BRUSH
GetSysColor(nIndex)都到windows的系统颜色
SetTextCharacterExtra(hdc,nCharExtra)设置TextOut等函数画的字符的横排间距
SelectObject(hdc,hgdiobj)将某个属性选入设备环境
CreatFontIndirect(lplf)创建字体,参数是个结构体
CreateFont创建字体,有12个参数,不常用,上面的常用
画路径字体(例子)

BeginPath (hdc) ;
BeginPath (hdc) ;
StrokePath (hdc) ;
FillPath (hdc) ;
FillPath (hdc) ;
hRgn = PathToRegion (hdc) ;
hRgn = PathToRegion (hdc) ;
GDI+(GDI+的文本函数比GDI慢很多):

DrawString() 画字符串

MeasureString() 获得字符串的整体显示区域信息


函数

备注
实例代码

截图
1

Status MeasureString(
[in]       const WCHAR *string,
[in]       INT length,
[in]       const Font *font,
[in, ref]  const PointF &origin,
[out]      RectF *boundingBox
) const;

用字体和起始点测量字符串的显示区域
VOID Example_MeasureString4(HDC hdc)
{
Graphics graphics(hdc);
// Set up the string.
WCHAR string[] = L"Measure Text";
Font font(L"Arial", 16);
PointF origin(0.0f, 0.0f);
RectF boundRect;
// Measure the string.
graphics.DrawString(string,12,&font,origin,&SolidBrush(Color(255,0,0,0)));
graphics.MeasureString(string, 12, &font, origin, &boundRect);
// Draw a rectangle that represents the size of the string.
graphics.DrawRectangle(&Pen(Color(255, 0, 0, 0)), boundRect);
}




2

Status MeasureString(
[in]       const WCHAR *string,
[in]       INT length,
[in]       const Font *font,
[in, ref]  const RectF &layoutRect,
[out]      RectF *boundingBox
) const;

用字体和限制矩形擦亮字符串的显示区域
1的基础上加了一个矩形区域比较的判断返回更小的
VOID Example_MeasureString(HDC hdc)
{
Graphics graphics(hdc);
// Set up the string.
WCHAR string[] = L"Measure Text";
Font font(L"Arial", 16);
RectF layoutRect(0, 0, 100, 0);
RectF boundRect;
// Measure the string.
graphics.DrawString(string,12,&font,PointF(0,0),&SolidBrush(Color(100,255,0,0)));
graphics.DrawString(string,12,&font,RectF(0,0,100,500),&StringFormat(),&SolidBrush(Color(100,0,255,0)));
graphics.MeasureString(string, 12, &font, layoutRect, &boundRect);
// Draw a rectangle that represents the size of the string.
graphics.DrawRectangle(&Pen(Color(255, 255, 0, 0)), boundRect);

//高度为0可以自动测量高度
layoutRect = RectF(0, 0, 500, 0);
graphics.MeasureString(string, 12, &font, layoutRect, &boundRect);
// Draw a rectangle that represents the size of the string.
graphics.DrawRectangle(&Pen(Color(255, 0, 255, 0)), boundRect);
}


3

Status MeasureString(
[in]       const WCHAR *string,
[in]       INT length,
[in]       const Font *font,
[in, ref]  const PointF &origin,
[in]       const StringFormat *stringFormat,
[out]      RectF *boundingBox
) const;

1的带StringFormat的版本
VOID Example_MeasureString5(HDC hdc)
{
Graphics graphics(hdc);
// Set up the string.
WCHAR string[] = L"Measure Text";
Font font(L"Arial", 16);
PointF origin(0.0f, 0.0f);
StringFormat format;
format.SetAlignment(StringAlignmentCenter);
RectF boundRect;
// Measure the string.
graphics.DrawString(string,12,&font,PointF(0,0),&format,&SolidBrush(Color(100,255,0,0)));
graphics.MeasureString(string, 12, &font, origin, &format, &boundRect);
// Draw a rectangle that represents the size of the string.
graphics.DrawRectangle(&Pen(Color(255, 0, 0, 0)), boundRect);
}


4

Status MeasureString(
[in]       const WCHAR *string,
[in]       INT length,
[in]       const Font *font,
[in, ref]  const RectF &layoutRect,
[in]       const StringFormat *stringFormat,
[out]      RectF *boundingBox,
[out]      INT *codepointsFitted,
[out]      INT *linesFilled
) const;

2的加强版,可以测量指定区域显示下的字符的个数
VOID Example_MeasureString2(HDC hdc)
{
Graphics graphics(hdc);
// Set up the string.
WCHAR string[] = L"Measure Text";
Font font(L"Arial", 16);
RectF layoutRect(0.0f, 0.0f, 70, 50.0f);
StringFormat format;
format.SetAlignment(StringAlignmentFar);
RectF boundRect;
// Measure the string.
int codepointsFitted;
int linesFilled;
graphics.DrawString(string,12,&font,layoutRect,&format,&SolidBrush(Color(255,0,0,0)));
graphics.MeasureString(string, 12, &font, layoutRect, &format, &boundRect,&codepointsFitted,&linesFilled);
// Draw a rectangle that represents the size of the string.
graphics.DrawRectangle(&Pen(Color(255, 0, 0, 0)), boundRect);
WCHAR *count = new WCHAR[100];
swprintf(count,100 , L"codepointsFitted:%d   linesFilled:%d",codepointsFitted,linesFilled);
graphics.DrawString(L"字符串Measure Text,长度12",-1,&font,PointF(0,70),&SolidBrush(Color(255,0,0,0)));
graphics.DrawString(count,-1,&font,PointF(0,90),&SolidBrush(Color(255,0,0,0)));
}


5

Status MeasureString(
[in]       const WCHAR *string,
[in]       INT length,
[in]       const Font *font,
[in, ref]  const SizeF &layoutRectSize,
[in]       const StringFormat *stringFormat,
[out]      SizeF *size,
[out]      INT *codepointsFitted,
[out]      INT *linesFilled
) const;

4的RectF换成了SizeF,其他一样,不要位置只要大小,其实位置没有什么用,所以4很少用到同上同上
MeasureCharacterRanges() 获得字符串的特定字符的显示位置

Status MeasureCharacterRanges(
[in]       const WCHAR *string,
[in]       INT length,
[in]       const Font *font,
[in, ref]  const Rectf &layoutRect,
[in]       const StringFormat *stringFormat,
[in]       INT regionCount,
[out]      Region *regions
) const;

测量字符的显示区域
VOID MeasureCharRanges(HDC hdc)
{
Graphics graphics(hdc);

// Brushes and pens used for drawing and painting
SolidBrush blueBrush(Color(255, 0, 0, 255));
SolidBrush redBrush(Color(100, 255, 0, 0));
Pen        blackPen(Color(255, 0, 0, 0));

// Layout rectangles used for drawing strings
RectF   layoutRect_A(20.0f, 20.0f, 130.0f, 130.0f);
RectF   layoutRect_B(160.0f, 20.0f, 165.0f, 130.0f);
RectF   layoutRect_C(335.0f, 20.0f, 165.0f, 130.0f);

// Three different ranges of character positions within the string
CharacterRange charRanges[3] = { CharacterRange(3, 5),
CharacterRange(15, 2),
CharacterRange(30, 15), };

// Font and string format to apply to string when drawing
Font         myFont(L"Times New Roman", 16.0f);
StringFormat strFormat;

// Other variables
Region* pCharRangeRegions; // pointer to CharacterRange regions
short   i;                 // loop counter
INT     count;             // number of character ranges set
WCHAR   string[] = L"The quick, brown fox easily jumps over the lazy dog.";

// Set three ranges of character positions.
strFormat.SetMeasurableCharacterRanges(3, charRanges);

// Get the number of ranges that have been set, and allocate memory to
// store the regions that correspond to the ranges.
count = strFormat.GetMeasurableCharacterRangeCount();
pCharRangeRegions = new Region[count];

// Get the regions that correspond to the ranges within the string when
// layout rectangle A is used. Then draw the string, and show the regions.
graphics.MeasureCharacterRanges(string, -1,
&myFont, layoutRect_A, &strFormat, count, pCharRangeRegions);
graphics.DrawString(string, -1,
&myFont, layoutRect_A, &strFormat, &blueBrush);
graphics.DrawRectangle(&blackPen, layoutRect_A);
for ( i = 0; i < count; i++)
{
graphics.FillRegion(&redBrush, pCharRangeRegions + i);
}

// Get the regions that correspond to the ranges within the string when
// layout rectangle B is used. Then draw the string, and show the regions.
graphics.MeasureCharacterRanges(string, -1,
&myFont, layoutRect_B, &strFormat, count, pCharRangeRegions);
graphics.DrawString(string, -1,
&myFont, layoutRect_B, &strFormat, &blueBrush);
graphics.DrawRectangle(&blackPen, layoutRect_B);
for ( i = 0; i < count; i++)
{
graphics.FillRegion(&redBrush, pCharRangeRegions + i);
}

// Get the regions that correspond to the ranges within the string when
// layout rectangle C is used. Set trailing spaces to be included in the
// regions. Then draw the string, and show the regions.
strFormat.SetFormatFlags(StringFormatFlagsMeasureTrailingSpaces);
graphics.MeasureCharacterRanges(string, -1,
&myFont, layoutRect_C, &strFormat, count, pCharRangeRegions);
graphics.DrawString(string, -1,
&myFont, layoutRect_C, &strFormat, &blueBrush);
graphics.DrawRectangle(&blackPen, layoutRect_C);
for ( i = 0; i < count; i++)
{
graphics.FillRegion(&redBrush, pCharRangeRegions + i);
}
// Delete memory for the range regions.
delete [] pCharRangeRegions;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: