Как объединить прокрутку и прозрачность выделения в элемент управления надписью - PullRequest
0 голосов
/ 20 июня 2019

Я обнаружил следующие два элемента управления меткой, которые отдельно обрабатывают выделение текста в метке, а также для того, чтобы метка была частично прозрачной. Они работают очень хорошо по отдельности, но у меня проблемы с объединением их в один элемент управления, учитывая мой ограниченный C #.

Кто-нибудь может дать мне несколько подсказок?

Прозрачная этикетка:

public class LabelTransparent : Label
    {
        private int opacity;
        public Color clrTransparentColor;
        public LabelTransparent()
        {
            this.clrTransparentColor = Color.Blue;
            this.opacity = 50;
            this.BackColor = Color.Transparent;
        }
        protected override void OnPaint(PaintEventArgs e)
        {
            if (Parent != null)
            {
                using (var bmp = new Bitmap(Parent.Width, Parent.Height))
                {
                    Parent.Controls.Cast<Control>()
                          .Where(c => Parent.Controls.GetChildIndex(c) > Parent.Controls.GetChildIndex(this))
                          .Where(c => c.Bounds.IntersectsWith(this.Bounds))
                          .OrderByDescending(c => Parent.Controls.GetChildIndex(c))
                          .ToList()
                          .ForEach(c => c.DrawToBitmap(bmp, c.Bounds));


                    e.Graphics.DrawImage(bmp, -Left, -Top);
                    using (var b = new SolidBrush(Color.FromArgb(this.Opacity, this.TransparentBackColor)))
                    {
                        e.Graphics.FillRectangle(b, this.ClientRectangle);
                    }
                    e.Graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;
                    TextRenderer.DrawText(e.Graphics, this.Text, this.Font, this.ClientRectangle, this.ForeColor, Color.Transparent);
                }
            }
        }

        public int Opacity
        {
            get { return opacity; }
            set { if (value >= 0 && value <= 255) opacity = value; this.Invalidate(); }
        }
        public Color TransparentBackColor
        {
            get { return clrTransparentColor; }
            set { clrTransparentColor = value; this.Invalidate(); }
        }
        [Browsable(false)]
        public override Color BackColor
        {
            get { return Color.Transparent; }
            set { base.BackColor = Color.Transparent; }
        }
    }

Прокрутка шатёр:

public class LabelMarquee : Label
    {
        private int CurrentPosition { get; set; }
        private Timer Timer = new Timer();
        private Graphics grText;
        private float fTextPixels;

        public int ScrollSpeed
        {
            get { return this.Timer.Interval; }
            set { try { this.Timer.Interval = value; } catch (Exception) { this.Timer.Interval = 15; } }
        }                
        public LabelMarquee()
        {
            UseCompatibleTextRendering = true;
            grText = this.CreateGraphics();
            Timer.Tick += new EventHandler(Timer_Tick);
            Timer.Start();
        }
        void Timer_Tick(object sender, EventArgs e)
        {
            fTextPixels      = grText.MeasureString(this.Text, this.Font).Width;
            if (CurrentPosition < -this.fTextPixels) CurrentPosition = Width;
            else CurrentPosition -= 1;

            Invalidate();
        }
        protected override void OnPaint(PaintEventArgs e)
        {
            e.Graphics.TranslateTransform((float)CurrentPosition, 0);
            base.OnPaint(e);
        }
        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                if (Timer != null)
                    Timer.Dispose();
            }
            Timer = null;
        }
    }
...