zoukankan      html  css  js  c++  java
  • gdi、gdi+文本相关函数

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

  • 相关阅读:
    ASP.NET Core 中间件(Middleware)详解
    .NET Core 使用RSA算法 加密/解密/签名/验证签名
    【Other】希腊诸神大全-中英文名称
    【架构】分布式追踪系统设计与实现
    【架构】SpringCloud 注册中心、负载均衡、熔断器、调用监控、API网关示例
    【SpringCloud】Netflix源码解析之Ribbon:负载均衡策略的定义和实现
    【Docker】基于docker+etcd+confd + haproxy构建高可用、自发现的web服务
    【架构】Kubernetes和Spring Cloud哪个部署微服务更好?
    【Linux】Linux中 “there are stopped jobs”问题的解决方案
    【架构】分布式系统雪崩效应处理方案
  • 原文地址:https://www.cnblogs.com/wangjixianyun/p/2839782.html
Copyright © 2011-2022 走看看