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 {