none
DirectWriteでExtTextOut()のように背景を塗りつぶすには RRS feed

  • 質問

  • http://msdn.microsoft.com/ja-jp/library/dd941709%28v=VS.85%29.aspx

    こちらにあるサンプルにあるCustomTextRenderer.cppのDrawGlypRunでID2D1Geometry.GetBounds()でグリフと内接する四角形を取得し、青色で塗りつぶしました

    ExtTextOut()で背景を塗りつぶした時のようになるのかと思っていたのですが、小文字を表示した時と大文字を表示した時で選択領域の高さが違うという結果になってしまいました

    ExtTextOut()と同じような結果を得るような方法があったら教えてほしいです



     

    2011年2月25日 16:31

回答

  • フォントのアセントの値をベースラインから引いたところを原点とし、ベースラインにディセントの値を足したところ高さとしたら解決しました

        public Result DrawGlyphRun(object clientDrawingContext, float baselineOriginX, float baselineOriginY, MeasuringMode measuringMode, GlyphRun glyphRun, GlyphRunDescription glyphRunDescription, ComObject clientDrawingEffect)
        {
          var brushColor = new Color4(1,0,0,0);
          Color4 backColor = new Color4();
    
          if (clientDrawingEffect != null && clientDrawingEffect is ColorDrawingEffect)
          {
            brushColor = (clientDrawingEffect as ColorDrawingEffect).Color;
            backColor = (clientDrawingEffect as ColorDrawingEffect).backColor;
          }
    
          var brush = new SolidColorBrush(_renderTarget, backColor);
          float[] advance;
          GlyphOffset[] offests;
          short[] indics = glyphRun.ToArrays(out advance,out offests);
          GlyphMetrics[] metrics= glyphRun.FontFace.GetDesignGlyphMetrics(indics, glyphRun.IsSideways);
    
          RectangleF rect = new RectangleF(baselineOriginX,
            baselineOriginY - glyphRun.FontSize * glyphRun.FontFace.Metrics.Ascent / glyphRun.FontFace.Metrics.DesignUnitsPerEm,
            baselineOriginX,
            baselineOriginY + glyphRun.FontSize * glyphRun.FontFace.Metrics.Descent / glyphRun.FontFace.Metrics.DesignUnitsPerEm);
          for (int i = 0; i < glyphRun.Items.Length; i++)
          {
            rect.Right = rect.Left + advance[i];
            _renderTarget.FillRectangle(rect, brush);
            rect.Left += advance[i];
          }
          brush.Dispose();
    
          brush = new SolidColorBrush(_renderTarget, brushColor);
    
          _renderTarget.DrawGlyphRun(new System.Drawing.PointF(baselineOriginX, baselineOriginY), ref glyphRun, brush, measuringMode);
    
          brush.Dispose();
    
          return SharpDX.Result.Ok;
        }
    
    

    • 回答としてマーク 山本春海 2011年4月4日 2:00
    2011年3月29日 5:56