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;
}





