如何在两个不相邻的区域上画一个字符串
Posted
技术标签:
【中文标题】如何在两个不相邻的区域上画一个字符串【英文标题】:How to draw a string on two not adjacent areas 【发布时间】:2019-01-26 11:11:09 【问题描述】:我不知道 GDI32 中是否有任何方法可以在表单上的两个不相邻区域(比如说矩形)上绘制字符串?
如果到达第一个矩形的边缘,文本应自动拆分,如示例图片所示。 感谢您的帮助。
【问题讨论】:
在屏幕外将其绘制成一个足够宽的矩形,然后将其中的部分复制到您的最终布局中(假设您真的打算将文本拆分到一个字符,这是非常不寻常的,请考虑适当的自动换行)。如需有用的答案,请限制为 c# 或 vb,以及 GDI 或 GDI+,并包含您目前获得的代码。 谢谢,我就是这么想的。我想知道是否有“本机”方法,例如在一个区域上添加多个不相邻的矩形,然后在其上绘制一些文本 如果你构建一个区域,所有在间隙中绘制的东西都会丢失,而不是保留。因此,您将需要两个具有不同边界矩形的 drawtext/string 调用,或者将位图切成两部分并调用 drawImage 两次。 这是否意味着某种字幕(运行文本)?还是静态的?无论如何,您需要一个大于打印区域的矩形。计算 hidden 矩形中打印的字符串长度与可见区域大小之间的差异。第二个字符串,打印在另一个 hidden 矩形中,显示在其余部分。标签在这里很有用;他们有一个 Paint() 事件,因此完全支持 GDI。您既可以根据计算出的位置打印字符串,也可以移动矩形(可能会闪烁,需要双缓冲)。 【参考方案1】:一个例子,使用两个Labels
和一个TrackBar
。TrackBar
确定一个标签内的字符串位置,每次移动字符串时,它都会反映在第二个标签上。
这种级联效果是使用第二个Label的.Invalidate()方法产生的,该方法是从第一个标签Paint()事件中调用的。
我在这里只使用Graphics.MeasureString() 和Graphics.DrawString()。 您也可以使用相关的TextRenderer 方法,但在标签中的度量是相同的。
结果的可视化表示:
float stringLength = 0F;
string loremIpsum = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.";
StringFormat MarqueeFormat = new StringFormat(StringFormatFlags.NoWrap | StringFormatFlags.FitBlackBox)
Alignment = StringAlignment.Near,
Trimming = StringTrimming.None
;
private void lblMarquee1_Paint(object sender, PaintEventArgs e)
SizeF stringSize = e.Graphics.MeasureString(loremIpsum, ((Control)sender).Font, -1, MarqueeFormat);
PointF stringLocation = new PointF(trackBar1.Value, (((Control)sender).Height - stringSize.Height) / 2);
stringLength = ((Control)sender).ClientRectangle.Width - stringLocation.X;
e.Graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAliasGridFit;
e.Graphics.DrawString(loremIpsum, ((Control)sender).Font, Brushes.Black, stringLocation, MarqueeFormat);
lblMarquee2.Invalidate();
private void lblMarquee2_Paint(object sender, PaintEventArgs e)
SizeF stringSize = e.Graphics.MeasureString(loremIpsum, ((Control)sender).Font, -1, MarqueeFormat);
PointF stringLocation = new PointF(-stringLength, (((Control)sender).Height - stringSize.Height) / 2);
e.Graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAliasGridFit;
e.Graphics.DrawString(loremIpsum, ((Control)sender).Font, Brushes.Black, stringLocation, MarqueeFormat);
private void trackBar1_ValueChanged(object sender, EventArgs e)
lblMarquee1.Invalidate();
【讨论】:
以上是关于如何在两个不相邻的区域上画一个字符串的主要内容,如果未能解决你的问题,请参考以下文章