GlyphRun和光标的确切位置(WPF)

GlyphRun和光标的确切位置(WPF),wpf,glyphrun,Wpf,Glyphrun,我想在鼠标光标的位置画一个文本。 因为我需要非常高的性能,所以我想使用GlyphRun。 一切都很好,但不幸的是,我的文本略低于光标 有人能帮我修改此方法以消除垂直偏移吗 我的代码: void MyDrawer_MouseMove(object sender, MouseEventArgs e) { Test1(); } void Test1() { MyDrawer.DeleteVisual(Dv); MyDrawer.Cursor = C

我想在鼠标光标的位置画一个文本。 因为我需要非常高的性能,所以我想使用GlyphRun。 一切都很好,但不幸的是,我的文本略低于光标

有人能帮我修改此方法以消除垂直偏移吗

我的代码:

void MyDrawer_MouseMove(object sender, MouseEventArgs e)
{
    Test1();            
}

void Test1()
{
    MyDrawer.DeleteVisual(Dv);
    MyDrawer.Cursor = Cursors.Cross;
    string text = "Hello Word";
    double size = 40;
    Dv = new DrawingVisual();
    using (var dc = Dv.RenderOpen())
    {
        Typeface typeface = new Typeface("Arial");
        if (typeface.TryGetGlyphTypeface(out GlyphTypeface glyphTypeface))
        {
            ushort[] glyphIndexes = new ushort[text.Length];
            double[] advanceWidths = new double[text.Length];

            for (int i = 0; i < text.Length; i++)
            {
                ushort glyphIndex = glyphTypeface.CharacterToGlyphMap[text[i]];
                glyphIndexes[i] = glyphIndex;
                double width = glyphTypeface.AdvanceWidths[glyphIndex] * size;
                advanceWidths[i] = width;
            }

            Point origin = Mouse.GetPosition(MyDrawer);
            //Move text belowe the cursor
            origin = new Point { X = origin.X, Y = origin.Y + (glyphTypeface.Baseline * size) };
            GlyphRun glyphRun = new GlyphRun(glyphTypeface, 0, false, size,
            glyphIndexes, origin, advanceWidths, null, null, null, null,
            null, null);

            dc.DrawGlyphRun(Brushes.Red, glyphRun);
            MyDrawer.AddVisual(Dv);
        }
    }
}
void MyDrawer\u MouseMove(对象发送器,MouseEventArgs e)
{
Test1();
}
void Test1()
{
MyDrawer.DeleteVisual(Dv);
MyDrawer.Cursor=Cursors.Cross;
string text=“Hello Word”;
双倍尺寸=40;
Dv=新绘图可视化();
使用(var dc=Dv.RenderOpen())
{
字体=新字体(“Arial”);
if(typeface.TryGetGlyphTypeface(out Glyphype GlyphType))
{
ushort[]glyphIndexes=新的ushort[text.Length];
double[]advanceWidths=新的double[text.Length];
for(int i=0;i

当然,这只是一个测试,实际上它不会影响光标,但指示的点和文本将比本例中的要多得多。

我在搜索相同问题时碰到了这个问题

Glyph内容(GlyphRun)被包装在一个黑盒子中。
黑盒子的顶部有一点填充物

像这样:

//获取框大小
var blackBoxHeight=字形字体。高度*字体大小;
//以获取实际的字符高度
var characterHeight=字形字体。基线*字体大小;
//把填充物放进黑盒子里
var blackBoxPadding=blackBoxHeight-characterHeight;
//设置点向上画一点(跳过填充)
origin.Y-=黑盒填充;
//创建glyph
var run=新的GlyphRun
(
字形字体:字形字体,
二级:0,
伊斯戴威:错,
renderingEmSize:fontSize,
像素分辨率:1.0f,
指数:指数,
基线原点:原点,/*包含填充偏移的点*/
进阶宽度:宽度,
字符偏移量:null,
字符:null,
deviceFontName:null,
clusterMap:null,
caretStops:null,
语言:空
);

是什么阻止您从origin.Y中减去适当的金额?如果你真的需要“非常高的性能”,不要每次都创建一个新的DrawingVisual。我无法确定这个转移发生在哪里,所以我很难切断未知值。也许这个链接可以帮助别人解决我的问题:是的,问题是要切断的“适当数量”是多少:(它当然是GlyphTypeface提供的值之一,例如它的基线。我想是的,但我已经应用了这个属性:Y=origin.Y+(GlyphTypeface.Baseline*size)`