Server/MarqueeLabel.cs
changeset 34 59bfa4ebcbbb
parent 33 1363bda20171
child 35 f3893924a6eb
     1.1 --- a/Server/MarqueeLabel.cs	Sat Aug 16 11:15:42 2014 +0200
     1.2 +++ b/Server/MarqueeLabel.cs	Sun Aug 17 22:30:30 2014 +0200
     1.3 @@ -19,6 +19,8 @@
     1.4          private SolidBrush iBrush;
     1.5          private SizeF iTextSize;
     1.6          private SizeF iSeparatorSize;
     1.7 +        private SizeF iScrollSize;
     1.8 +        //private ContentAlignment iRequestedContentAlignment;
     1.9  
    1.10          [Category("Appearance")]
    1.11          [Description("Separator in our scrolling loop.")]
    1.12 @@ -82,6 +84,7 @@
    1.13              PixelsLeft = 0;
    1.14              CurrentPosition = 0;
    1.15              iBrush = new SolidBrush(ForeColor);
    1.16 +            //iRequestedContentAlignment = TextAlign;
    1.17          }
    1.18  
    1.19          public void UpdateAnimation(DateTime aLastTickTime, DateTime aNewTickTime)
    1.20 @@ -92,10 +95,18 @@
    1.21                  return;
    1.22              }
    1.23  
    1.24 +            /*
    1.25              while (CurrentPosition > (iTextSize.Width + iSeparatorSize.Width))
    1.26              {
    1.27                  CurrentPosition -= ((int)(iTextSize.Width + iSeparatorSize.Width));
    1.28              }
    1.29 +             */
    1.30 +
    1.31 +            while (CurrentPosition > iScrollSize.Width)
    1.32 +            {
    1.33 +                CurrentPosition -= (int)iScrollSize.Width;
    1.34 +            }
    1.35 +
    1.36  
    1.37              PixelsLeft += aNewTickTime.Subtract(aLastTickTime).TotalSeconds * PixelsPerSecond;
    1.38  
    1.39 @@ -148,36 +159,36 @@
    1.40              switch (ca)
    1.41              {
    1.42                  case ContentAlignment.TopCenter:
    1.43 -                    format.Alignment = StringAlignment.Near;
    1.44 -                    format.LineAlignment = StringAlignment.Center;
    1.45 +                    format.Alignment = StringAlignment.Center;
    1.46 +                    format.LineAlignment = StringAlignment.Near;
    1.47                      break;
    1.48                  case ContentAlignment.TopLeft:
    1.49                      format.Alignment = StringAlignment.Near;
    1.50                      format.LineAlignment = StringAlignment.Near;
    1.51                      break;
    1.52                  case ContentAlignment.TopRight:
    1.53 -                    format.Alignment = StringAlignment.Near;
    1.54 -                    format.LineAlignment = StringAlignment.Far;
    1.55 +                    format.Alignment = StringAlignment.Far;
    1.56 +                    format.LineAlignment = StringAlignment.Near;
    1.57                      break;
    1.58                  case ContentAlignment.MiddleCenter:
    1.59                      format.Alignment = StringAlignment.Center;
    1.60                      format.LineAlignment = StringAlignment.Center;
    1.61                      break;
    1.62                  case ContentAlignment.MiddleLeft:
    1.63 -                    format.Alignment = StringAlignment.Center;
    1.64 -                    format.LineAlignment = StringAlignment.Near;
    1.65 +                    format.Alignment = StringAlignment.Near;
    1.66 +                    format.LineAlignment = StringAlignment.Center;
    1.67                      break;
    1.68                  case ContentAlignment.MiddleRight:
    1.69 +                    format.Alignment = StringAlignment.Far;
    1.70 +                    format.LineAlignment = StringAlignment.Center;
    1.71 +                    break;
    1.72 +                case ContentAlignment.BottomCenter:
    1.73                      format.Alignment = StringAlignment.Center;
    1.74                      format.LineAlignment = StringAlignment.Far;
    1.75                      break;
    1.76 -                case ContentAlignment.BottomCenter:
    1.77 -                    format.Alignment = StringAlignment.Far;
    1.78 -                    format.LineAlignment = StringAlignment.Center;
    1.79 -                    break;
    1.80                  case ContentAlignment.BottomLeft:
    1.81 -                    format.Alignment = StringAlignment.Far;
    1.82 -                    format.LineAlignment = StringAlignment.Near;
    1.83 +                    format.Alignment = StringAlignment.Near;
    1.84 +                    format.LineAlignment = StringAlignment.Far;
    1.85                      break;
    1.86                  case ContentAlignment.BottomRight:
    1.87                      format.Alignment = StringAlignment.Far;
    1.88 @@ -208,6 +219,8 @@
    1.89              CurrentPosition = 0;
    1.90              LastTickTime = DateTime.Now;
    1.91              PixelsLeft = 0;
    1.92 +            //Reset text align
    1.93 +            //TextAlign = iRequestedContentAlignment;
    1.94  
    1.95              //For all string measurements and drawing issues refer to the following article:
    1.96              // http://stackoverflow.com/questions/1203087/why-is-graphics-measurestring-returning-a-higher-than-expected-number
    1.97 @@ -217,11 +230,23 @@
    1.98              iStringFormat = GetStringFormatFromContentAllignment(TextAlign);
    1.99              iTextSize = g.MeasureString(Text, Font, Int32.MaxValue, iStringFormat);
   1.100              iSeparatorSize = g.MeasureString(Separator, Font, Int32.MaxValue, iStringFormat);
   1.101 +            //Scroll width is the width of our text and our separator without taking kerning into account since
   1.102 +            //both text and separator are drawn independently from each other.
   1.103 +            iScrollSize.Width = iSeparatorSize.Width + iTextSize.Width;
   1.104 +            iScrollSize.Height = Math.Max(iSeparatorSize.Height, iTextSize.Height); //Not relevant for now
   1.105 +            //We don't want scroll with to take kerning into account so we don't use the following
   1.106 +            //iScrollSize = g.MeasureString(Text + Separator, Font, Int32.MaxValue, iStringFormat);
   1.107  
   1.108              if (NeedToScroll())
   1.109              {
   1.110                  //Always align left when scrolling
   1.111 -                iStringFormat.Alignment = StringAlignment.Near;
   1.112 +                //Somehow draw string still takes into our control alignment so we need to set it too
   1.113 +                //ContentAlignment original = TextAlign;
   1.114 +                TextAlign = ContentAlignment.MiddleLeft;
   1.115 +                //Make sure our original text alignment remain the same even though we override it when scrolling
   1.116 +                //iRequestedContentAlignment = original; 
   1.117 +                //iStringFormat will get updated in OnTextAlignChanged
   1.118 +                //iStringFormat.Alignment = StringAlignment.Near;
   1.119              }
   1.120          }
   1.121  
   1.122 @@ -242,7 +267,7 @@
   1.123          protected override void OnTextAlignChanged(EventArgs e)
   1.124          {
   1.125              iStringFormat = GetStringFormatFromContentAllignment(TextAlign);
   1.126 -
   1.127 +            //iRequestedContentAlignment = TextAlign;
   1.128              base.OnTextAlignChanged(e);
   1.129  
   1.130          }
   1.131 @@ -253,18 +278,20 @@
   1.132              e.Graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.SingleBitPerPixelGridFit;
   1.133              if (NeedToScroll())
   1.134              {
   1.135 -                //Draw it all in a single call
   1.136 +                //Draw it all in a single call would take kerning into account
   1.137 +                //e.Graphics.TranslateTransform(-(float)CurrentPosition, 0);
   1.138 +                //e.Graphics.DrawString(Text + Separator + Text, Font, iBrush, ClientRectangle, iStringFormat);
   1.139 +
   1.140 +                //Doing separate draw operation allows us not to take kerning into account between separator and string
   1.141 +                //Draw the first one
   1.142                  e.Graphics.TranslateTransform(-(float)CurrentPosition, 0);
   1.143 -                e.Graphics.DrawString(Text + Separator + Text, Font, iBrush, ClientRectangle, iStringFormat);
   1.144 -                //Draw the first one
   1.145 -                //e.Graphics.TranslateTransform(-(float)CurrentPosition, 0);
   1.146 -                //e.Graphics.DrawString(Text, Font, iBrush, ClientRectangle, iStringFormat);
   1.147 +                e.Graphics.DrawString(Text, Font, iBrush, ClientRectangle, iStringFormat);
   1.148                  //Draw separator
   1.149 -                //e.Graphics.TranslateTransform(iTextSize.Width, 0);
   1.150 -                //e.Graphics.DrawString(Separator, Font, iBrush, ClientRectangle, iStringFormat);
   1.151 +                e.Graphics.TranslateTransform(iTextSize.Width, 0);
   1.152 +                e.Graphics.DrawString(Separator, Font, iBrush, ClientRectangle, iStringFormat);
   1.153                  //Draw the last one
   1.154 -                //e.Graphics.TranslateTransform(iSeparatorSize.Width, 0);
   1.155 -                //e.Graphics.DrawString(Text, Font, iBrush, ClientRectangle, iStringFormat);
   1.156 +                e.Graphics.TranslateTransform(iSeparatorSize.Width, 0);
   1.157 +                e.Graphics.DrawString(Text, Font, iBrush, ClientRectangle, iStringFormat);
   1.158              }
   1.159              else
   1.160              {