2014-06-16 16 views
-2

規則很簡單:如何抽取另一種顏色的每一行?

第一行紅色第二行綠色第三行紅色。 我有一個變量,名爲m_text,它的格式是這樣的:

m_text format

紅色第二行中的第一行是時間&日期爲綠色。 然後有一個空的/空間線,然後是第三行紅色第四行綠色然後空/空行。 而所有的線條都是一樣的。第一個以紅色第二個綠色,然後每一行以紅色和綠色紅色綠色紅色綠色。

可變_colors是顏色[]

在用戶控件代碼頂部我沒有:

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); 
       } 
      } 

拉繩線也以顏色的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 i之後得到的是:

DrawString result

拉繩顏色在紅第二的第一行綠線,空行/空行,然後是綠色的第四行,但它應該是紅色。

它應該是這樣的:在紅

文本行(第一行),那麼日期&時間線爲綠色。 空行.... 紅色文本行(第四行)然後是日期&綠色的時間行。

我該如何解決?

編輯

這是我在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

+0

僅供參考,關於你的第一個截圖 - [你可以使用剪切工具捕獲上下文菜單](http://blogs.technet .COM/b/migreene /存檔/ 2007/05/12 /如何使用的最剪斷工具對捕獲合作ntext-menus.aspx)就像你擁有的一樣。它可能比目前的圖片更具可讀性。 – Default

回答

0

空行包含在m_text,所以他們使用了紅色的實例(3號線,例如)或綠色(例如第6行)。您可以對new SolidBrush(_colors[i % _colors.Length])使用與i不同的變量,並且只有在m_text [i]的長度大於零時才增加它。

+0

xpda我現在試過了,請看看我的問題在底部我加了我現在嘗試的但仍然沒有按照例外工作。 – user3739928

+0

我不確定c#中的字符串長度是否包含在長度中的空零字符?如果是,請檢查它是否大於1.如果不是,空字符串中可能還有其他非打印字符,如回車,換行,製表符,空格等。也許使用修剪功能? – xpda

0

你想在紅色和時間日期變更線在綠線的內容,而你使用foreach關鍵字來控制顏色可供選擇,但你忽略了一件事!!!,

他們是空字符串數組您在

文本行 - 紅色

數據&時間線 - 綠色

「」 - 弦空你設置爲紅色

文本行 - 綠色!

數據&時間線 - 紅!

你可以用if關鍵字來判斷,如果(m_text [i] == string.Empty)則忽略或跳過這一行。

+0

Vincent我試過這個:if(m_text [i]!= string.Empty) e.Graphics.DrawString(m_text [i],drawFonts1,new SolidBrush(_colors [i%_colors.Length]),pt); },但不是每兩行工作在紅色,然後兩個綠色。 – user3739928

+0

文森特更新我的問題與我試過的和我得到的截圖。 – user3739928

+0

請嘗試將代碼更改爲if(m_text [i] .Length <= 0){continue;},並且您最好設置一個要監視的中斷點,以確定此關鍵字是否運行? – Vincent

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 

} 

這個循環將把第一個和第二線和跳過第三等 你可以嘗試它,並反饋回來:)

+0

chouaib我在添加另一種顏色之前嘗試過使所有文字閃爍。 – user3739928

+0

你是什麼意思眨眼?它是否在紅 - 綠 - 白之間不穩定地切換? – chouaib

相關問題