我怎么能用另一种颜色DrawString每一行?

时间:2014-06-16 04:31:08

标签: c# .net winforms

规则很简单:

红色第二行的第一行,红色的第三行。 我有一个名为m_text的变量,它的格式如下:

m_text format

红线的第一行是第二行,是绿色的时间和日期。 然后有一个空/空行,然后是红色第四行的第三行,绿色,然后是空/空行。 所有线路都一样。第一个是红色的第二个绿色,然后每一行是红色和绿色的红色,绿色是红绿色。

变量_colors是Color []

在UserControl代码顶部我做了:

Color[] _colors;
string[] m_text = new string[0];

然后:

public void ScrollerColors(Color[] colors)
        {
            _colors = colors;
        }

然后:

public Color[] ColorLines
        {
            get
            {
                return this._colors;
            }
            set
            {
                this._colors = value;
            }
        }

然后滚动文本:

public string TextToScroll
        {
            get 
            {
                return string.Join("\n", m_text);
            }
            set 
            {
                string buffer = value;

                m_text = buffer.Split(new char[1] { '\n' });
            }
        }

然后在OnPaint活动中我有:

private void OnPaint(object sender, PaintEventArgs e)
        {
            e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;

            e.Graphics.FillRectangle(new SolidBrush(this.BackColor), this.ClientRectangle);

            int visibleLines = 0;

            Font drawFonts1 = new Font("Arial", 20, FontStyle.Bold, GraphicsUnit.Pixel);


            for (int i = m_text.Length - 1; i >= 0; i--)
            {

                Point pt = new Point((int)((this.ClientSize.Width - e.Graphics.MeasureString(m_text[i], m_font).Width) / 2),
                    (int)(m_scrollingOffset + this.ClientSize.Height - (m_text.Length - i) * m_font.Size));

                if ((pt.Y + this.Font.Size > 0) && (pt.Y < this.Height))
                {
                    visibleLines++;
                }
                if (_colors != null)
                {
                    e.Graphics.DrawString(m_text[i], drawFonts1, new SolidBrush(_colors[i % _colors.Length]), pt);
                }
            }

DrawString线也为m_text中的红色和绿色线条着色。

这就是我在form1中使用它的方式:

在form1的顶部:

scroller1.TextToScroll = combindedString;
ListColors();

combindedString是将在m_text中的文本。

然后在底部的form1中我有这个方法:

private void ListColors()
        {
            List<Color> allColors = new List<Color>();
            KnownColor[] colors = (KnownColor[])Enum.GetValues(typeof(KnownColor));
            foreach (KnownColor knowColor in colors)
            {
                Color color = Color.FromKnownColor(knowColor);
                allColors.Add(color);
            }
            scroller1.ColorLines = new Color[] { Color.Red, Color.Green };
        }

使用DrawString后得到的结果是:

DrawString result

DrawString将红色第二行中的第一行显示为绿色,然后是空格/空行,然后将第四行显示为绿色,但应为红色。

应该是这样的:

红色的文本行(第一行),然后是绿色的日期和时间行。 空行.... 红色的文本行(第四行),然后是绿色的日期和时间行。

我该如何解决?

修改

这是我在OnPaint事件中更改的内容:

if (_colors != null)
                {
                    if (m_text[i].Length > 0)
                    {
                        coloring += 1;
                    }
                    e.Graphics.DrawString(m_text[i], drawFonts1, new SolidBrush(_colors[coloring % _colors.Length]), pt);
                }

着色是int。

但我仍然得到红色的两条绿色的两条线。

还试过文森特解决方案:

if (m_text[i] == string.Empty)
                    {
                    }
                    else
                    {
                        e.Graphics.DrawString(m_text[i], drawFonts1, new SolidBrush(_colors[i % _colors.Length]), pt);
                    }

但我得到的是:

DrawString

3 个答案:

答案 0 :(得分:0)

空行包含在m_text中,因此它们会使用红色(例如第3行)或绿色(例如第6行)的实例。对于new SolidBrush(_colors[i % _colors.Length]),您可以使用与i不同的变量,并且仅当m_text [i]的长度大于零时才增加它。

答案 1 :(得分:0)

您希望红色和时间日期行中的内容行为绿色,并且您使用Foreach关键字来控制替代颜色,但是您忽略了一件事!!!,

他们的数组中的字符串为空

文字行 - 红色

数据&amp;时间线 - 绿色

&#34;&#34; - 您设置为红色的字符串为空

文字行 - 绿色!!

数据&amp;时间线 - 红色!!

你可以使用if if来判断if(m_text [i] == string.Empty)然后忽略或跳过这一行。

答案 2 :(得分:0)

如果您有这种恒定格式(红线,绿线,空行)?为什么不用3种颜色!?

让我们说红色,绿色,白色,红色,绿色,白色,红色......

如果你把它改成了这个流,我相信空字符串(内部)希望打印在white中,但oopsss没有字符串! :D所以它只是跳到next字符串和next颜色,绝对是喜欢的RED ET VOILA!

编辑1 另一种方法: 我只是注意到你可以通过简单地在绘制时在循环中跳转索引来消除空行:

for (int i = m_text.Length - 1; i >= 0; i--)
{
if((m_text.Length-i)%3 == 0) continue;
// keep the other part of your loop untouched

}

此循环将处理第1行和第2行并跳过第3行,依此类推 你可以尝试一下并喂我们吗:)。