如何计算空白字符串的浮点宽度,实现无空白文本绘制?
我不清楚如何计算字符串对应的浮点宽度值,现有代码如下:
float x = 300.0F; Dictionary<short, string> stringDict = new Dictionary<short, string>(); Dictionary<short, string> whiteSpace = new Dictionary<short, string>(); string row1 = new String(' ', 67); whiteSpace.Add(1, row1); stringDict.Add(1, rtBox.Substring(12, 31).Replace("\n", " ")); graphicsObj.DrawString(whiteSpace[i] + stringDict[i], drawFont, drawBrush, x, y, drawFormat);
我期望实现的效果是直接通过空白字符串的宽度偏移X坐标,省略空白绘制:
graphicsObj.DrawString(stringDict[i], drawFont, drawBrush, x + whiteSpace[i]的浮点宽度, y, drawFormat);
但我尝试了以下代码却无法生效,文本完全没有在X轴上移动:
for (short i = 1; i <= 28; i++) { SizeF rowSize = graphicsObj.MeasureString(whiteSpace[i], drawFont); float widthRow = rowSize.Width; graphicsObj.DrawString(stringDict[i], drawFont, drawBrush, x + widthRow, y, drawFormat); y += 15.0F; }
你用MeasureString获取宽度的思路是对的,没生效大概率是细节没处理到位,我给你梳理几个关键问题和修复方案:
必须同步传入
StringFormat参数
你绘制文本时用了drawFormat,但测量宽度的时候没传!StringFormat里的对齐方式、trimming规则、字符间距等都会直接影响文本的测量宽度和实际绘制位置。修改测量代码:// 传入drawFormat,第三个参数设为int.MaxValue表示不限制文本宽度,测量完整字符串的真实宽度 SizeF rowSize = graphicsObj.MeasureString(whiteSpace[i], drawFont, int.MaxValue, drawFormat);确保渲染上下文和字体完全一致
要保证MeasureString和DrawString使用同一个Graphics对象(你这里的graphicsObj没问题),而且drawFont没有被中途修改——如果字体的大小、样式变了,测量的宽度肯定和实际绘制的对不上。验证空白字符串的有效性
检查whiteSpace[i]是不是真的包含你预期的空格数(比如67个),有没有被其他代码意外修改成空字符串或者其他内容?可以加个调试输出确认:Console.WriteLine($"空白字符串长度:{whiteSpace[i].Length},测量宽度:{rowSize.Width}");如果长度正常但宽度接近0,可能是
Graphics.TextRenderingHint的设置影响了测量精度,或者某些特殊字体对连续空格的处理有异常(不过默认字体不会有这个问题)。检查
StringFormat的对齐方式
如果drawFormat.Alignment被设置成了StringAlignment.Far或者StringAlignment.Center,那么DrawString会以你传入的X坐标为基准做对齐,而不是以文本左边缘为起点。这种情况下即使X坐标正确,视觉上也会看起来没偏移。可以强制设置对齐方式为左对齐:drawFormat.Alignment = StringAlignment.Near;
最常见的问题就是没同步StringFormat参数,补上之后应该就能看到文本正确偏移了。
内容的提问来源于stack exchange,提问作者Kuba Do

