首页 > 解决方案 > SetTextCharacterExtra 函数不适用于特定字体/字体大小的 DrawText 函数

问题描述

我正在使用wingdi 函数打印文本,并通过SetTextCharacterExtra 函数设置字符间距。我正在使用TextRenderer.DrawText方法来绘制内部使用wingdi函数的文本。我的问题是,字符间距不适用于某些文本 - 我注意到它不适用于更大的字体大小。我也直接尝试了DrawText函数而不是 TextRenderer.DrawText 但仍然没有运气。

在此处输入图像描述

这是字符间距未应用于Special文本的输出。我尝试了不同的间距(-2、-3、-4、-5),但没有运气。我也更改了字体类型,但输出仍然相同。如果您注意到字符间距适用于其他文本,如Huggies Infant Boy 96pkWas $32.00和 等。

有谁知道这里发生了什么?

更新:这是重现此问题的示例代码:

[DllImport("User32.dll", SetLastError = true, CharSet = CharSet.Auto)] public static extern bool DrawText(IntPtr hdc, string text, int length, ref RECT rect, int 格式);

    [DllImport("Gdi32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
    public static extern bool ExtTextOut(IntPtr hdc, int x, int y, uint options, IntPtr lprect, StringBuilder lpString, uint c, IntPtr lpDx);

    [DllImport("gdi32.dll", CharSet = CharSet.Auto)]
    internal static extern int SetTextCharacterExtra(IntPtr hdc, int nCharExtra);

    public const int ETO_OPAQUE = 0x0002;

    static void PrintByTextRenderer()
    {
        PrintDocument pd = new PrintDocument();
        pd.PrintPage += new PrintPageEventHandler(delegate (Object sender, PrintPageEventArgs e)
        {
            var str = "Drawing Text with Avenir Black";
            var font = new Font("Avenir Black", 140, new FontStyle());          // Calibri
            var rect = new Rectangle(200, 20, 4000, 400);

            IntPtr hPrinterDC = e.Graphics.GetHdc();
            if (hPrinterDC != IntPtr.Zero)
            {
                var nCharExtra = -5;
                SetTextCharacterExtra(hPrinterDC, nCharExtra);

                RECT rc = new RECT(rect.X, rect.Y, rect.Right, rect.Bottom);

                //// METHOD 1 - winapi fn : DrawText : Intercharacter Spacing not working
                //var flags = TextFormatFlags.HorizontalCenter | TextFormatFlags.VerticalCenter | TextFormatFlags.WordBreak | TextFormatFlags.NoClipping;
                //DrawText(hPrinterDC, str, str.Length, ref rc, (int)flags);

                //// METHOD 2 - winapi fn : ExtTextOut : Intercharacter Spacing is working properly
                //ExtTextOut(hPrinterDC, rc.left, rc.top, ETO_OPAQUE, IntPtr.Zero, new StringBuilder(str), (uint)str.Length, IntPtr.Zero);

                e.Graphics.ReleaseHdc(hPrinterDC);

                //// METHOD 3 - TextRenderer.DrawText : Intercharacter Spacing not working
                TextRenderer.DrawText(e.Graphics, str, font, rect, Color.Black);
            }
        });
        pd.Print();
    }

标签: c#winapidrawingsystem.drawingdrawtext

解决方案


推荐阅读