c# - SetTextCharacterExtra 函数不适用于特定字体/字体大小的 DrawText 函数
问题描述
我正在使用wingdi 函数打印文本,并通过SetTextCharacterExtra 函数设置字符间距。我正在使用TextRenderer.DrawText方法来绘制内部使用wingdi函数的文本。我的问题是,字符间距不适用于某些文本 - 我注意到它不适用于更大的字体大小。我也直接尝试了DrawText函数而不是 TextRenderer.DrawText 但仍然没有运气。
这是字符间距未应用于Special
文本的输出。我尝试了不同的间距(-2、-3、-4、-5),但没有运气。我也更改了字体类型,但输出仍然相同。如果您注意到字符间距适用于其他文本,如Huggies Infant Boy 96pk
、Was $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();
}
解决方案
推荐阅读
- spark-ar-studio - 视频纹理 Spark AR 在设备上运行时崩溃
- python - 无法使用 python scrapy 框架在 postgre 中插入日期
- sapui5 - 如何在智能表中绑定自定义过滤器值
- sql-server - 使用新硬件升级 TFS SQL Server 数据层
- scala - Spark数据框从一行中选择一列
- multithreading - 即使 TTask 是,TThread 也无法识别。(System.Threading 在使用接口部分)
- javascript - 如何在html中创建指向单点的蜘蛛图
- python - FailedPreconditionError(参见上面的回溯):GetNext() 失败,因为迭代器尚未初始化
- android - TextView SetText 不刷新 UI Android 上的文本
- android - (Android) 从 BLE 设备的自定义特征中获取数据的问题