* UIScrollingText: 重写滚动逻辑
This commit is contained in:
parent
1d633229e1
commit
cb7e3d338f
@ -19,6 +19,7 @@
|
|||||||
* 2020-06-29: V2.2.6 新增控件
|
* 2020-06-29: V2.2.6 新增控件
|
||||||
* 2021-07-16: V3.0.5 增加属性控制开启滚动
|
* 2021-07-16: V3.0.5 增加属性控制开启滚动
|
||||||
* 2022-03-19: V3.1.1 重构主题配色
|
* 2022-03-19: V3.1.1 重构主题配色
|
||||||
|
* 2023-02-23: V3.3.2 重写滚动逻辑
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
@ -33,10 +34,10 @@ namespace Sunny.UI
|
|||||||
public class UIScrollingText : UIControl
|
public class UIScrollingText : UIControl
|
||||||
{
|
{
|
||||||
private readonly Timer timer;
|
private readonly Timer timer;
|
||||||
private int XPos = int.MinValue;
|
private int XPos = 0;
|
||||||
private int XPos1 = int.MaxValue;
|
private int XPos1 = 0;
|
||||||
private int interval = 200;
|
private int interval = 200;
|
||||||
private int TextWidth = int.MinValue;
|
private int TextWidth = 0;
|
||||||
|
|
||||||
public UIScrollingText()
|
public UIScrollingText()
|
||||||
{
|
{
|
||||||
@ -64,7 +65,7 @@ namespace Sunny.UI
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
[DefaultValue(false), Description("点击暂停滚动"), Category("SunnyUI")]
|
[Browsable(false), DefaultValue(false), Description("点击暂停滚动"), Category("SunnyUI")]
|
||||||
public bool ClickPause
|
public bool ClickPause
|
||||||
{
|
{
|
||||||
get; set;
|
get; set;
|
||||||
@ -72,8 +73,8 @@ namespace Sunny.UI
|
|||||||
|
|
||||||
private void Reset()
|
private void Reset()
|
||||||
{
|
{
|
||||||
XPos = int.MinValue;
|
XPos = 0;
|
||||||
XPos1 = int.MaxValue;
|
XPos1 = 0;
|
||||||
Invalidate();
|
Invalidate();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -118,44 +119,27 @@ namespace Sunny.UI
|
|||||||
|
|
||||||
private void Timer_Tick(object sender, EventArgs e)
|
private void Timer_Tick(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
if (XPos == int.MinValue)
|
if (ScrollingType == UIScrollingType.RightToLeft)
|
||||||
{
|
{
|
||||||
Invalidate();
|
XPos -= Offset;
|
||||||
}
|
if (XPos + TextWidth < 0)
|
||||||
else
|
|
||||||
{
|
|
||||||
if (ScrollingType == UIScrollingType.RightToLeft)
|
|
||||||
{
|
{
|
||||||
|
XPos = XPos1;
|
||||||
XPos -= Offset;
|
XPos -= Offset;
|
||||||
if (XPos + TextWidth < 0)
|
|
||||||
{
|
|
||||||
XPos = XPos1 - Offset;
|
|
||||||
XPos1 = int.MaxValue;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ScrollingType == UIScrollingType.LeftToRight)
|
|
||||||
{
|
|
||||||
XPos += Offset;
|
|
||||||
if (XPos > Width)
|
|
||||||
{
|
|
||||||
XPos = XPos1 + Offset;
|
|
||||||
XPos1 = int.MaxValue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Invalidate();
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
protected override void OnMouseDoubleClick(MouseEventArgs e)
|
if (ScrollingType == UIScrollingType.LeftToRight)
|
||||||
{
|
|
||||||
if (ClickPause)
|
|
||||||
{
|
{
|
||||||
timer.Enabled = !timer.Enabled;
|
XPos += Offset;
|
||||||
|
if (XPos > Width)
|
||||||
|
{
|
||||||
|
XPos = XPos1;
|
||||||
|
XPos += Offset;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
base.OnMouseDoubleClick(e);
|
Invalidate();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -168,60 +152,40 @@ namespace Sunny.UI
|
|||||||
SizeF sf = g.MeasureString(Text, Font);
|
SizeF sf = g.MeasureString(Text, Font);
|
||||||
int y = (int)((Height - sf.Height) / 2);
|
int y = (int)((Height - sf.Height) / 2);
|
||||||
|
|
||||||
if (XPos == int.MinValue)
|
if (TextWidth != (int)sf.Width)
|
||||||
{
|
{
|
||||||
XPos = (int)((Width - sf.Width) / 2);
|
XPos = 0;
|
||||||
TextWidth = (int)sf.Width;
|
TextWidth = (int)sf.Width;
|
||||||
}
|
}
|
||||||
|
|
||||||
g.DrawString(Text, Font, ForeColor, XPos, y);
|
|
||||||
|
|
||||||
if (ScrollingType == UIScrollingType.LeftToRight)
|
if (ScrollingType == UIScrollingType.LeftToRight)
|
||||||
{
|
{
|
||||||
if (TextWidth <= Width)
|
if (XPos + TextWidth > Width && TextWidth < Width - offset)
|
||||||
{
|
{
|
||||||
if (XPos + TextWidth > Width)
|
XPos1 = XPos - Width + offset;
|
||||||
{
|
g.DrawString(Text, Font, ForeColor, XPos1, y);
|
||||||
XPos1 = XPos - Width;
|
|
||||||
g.DrawString(Text, Font, ForeColor, XPos1, y);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (XPos > 0)
|
XPos1 = -TextWidth + offset;
|
||||||
{
|
|
||||||
if (XPos1 == int.MaxValue)
|
|
||||||
XPos1 = Offset - TextWidth;
|
|
||||||
else
|
|
||||||
XPos1 += Offset;
|
|
||||||
|
|
||||||
g.DrawString(Text, Font, ForeColor, XPos1, y);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
g.DrawString(Text, Font, ForeColor, XPos, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ScrollingType == UIScrollingType.RightToLeft)
|
if (ScrollingType == UIScrollingType.RightToLeft)
|
||||||
{
|
{
|
||||||
if (TextWidth <= Width)
|
if (XPos < 0 && TextWidth < Width - offset)
|
||||||
{
|
{
|
||||||
if (XPos < 0)
|
XPos1 = Width + XPos - offset;
|
||||||
{
|
g.DrawString(Text, Font, ForeColor, XPos1, y);
|
||||||
XPos1 = Width + XPos;
|
|
||||||
g.DrawString(Text, Font, ForeColor, XPos1, y);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (XPos + TextWidth < Width - Offset)
|
XPos1 = Width - offset;
|
||||||
{
|
|
||||||
if (XPos1 == int.MaxValue)
|
|
||||||
XPos1 = Width - Offset;
|
|
||||||
else
|
|
||||||
XPos1 -= Offset;
|
|
||||||
|
|
||||||
g.DrawString(Text, Font, ForeColor, XPos1, y);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
g.DrawString(Text, Font, ForeColor, XPos, y);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user