C# WinForms рендер строки (ссылки) в Label

Кустарю контрол который сможет быть частично выбирабельным. Наверное аналог ричбокса но требуется чтобы он не проявлял GUI TextBox …
В общем нужен какой то аналог Label но чтобы части текста могли функционировать как ссылки.

Ничего лучше не придумал как накидать контрол. Но вот какая то хрень.
Текст рендерит, есть функционал который может выделить прямоугольники нужных фрагментов текста. Но вот не пойму как перерисовать эти фрагменты чтобы идеально сочетались с отображением исходной строки.

Вот репэинт:

// тут еще куча кода но он не влияет на результат.
StringFormat stringFormat2 = new StringFormat(StringFormatFlags.FitBlackBox);
           
            e.Graphics.DrawString(measureString.Substring(0,5), drawFont, Brushes.Magenta, lt2, stringFormat2);

Суть в том что не могу понять какие параметры надо задать для формата строки.

image

Строка “First” по идее должна полностью накладываться на синий. Но мало того что он рисует со сдвигом по X на -1 это еще поправимо …
Но он не рисует букву t … Пробую разные форматы но он упорно отказывается… Кто нибудь знает какой формат строки нужен?

В общем как всегда с помощью костылей и такой то матери работает. ХЗ почему но вот код.

 public List<string> SelectPhrases = new List<string>()
        {
            "one","Two","ThREE", "econ", "THIS"
        };
....

 string measureString = "this one string and two string and three strings and Second ranges";
            Font stringFont = new Font("Times New Roman", 16.0F);

            List<CharacterRange> characterRanges = new List<CharacterRange>();
            foreach (var slPh in SelectPhrases)
            {
                string tmp = measureString.ToLower();
                int offset = 0;
                int st = tmp.IndexOf(slPh.ToLower(), offset);
                while (st != -1)
                {
                    characterRanges.Add(new CharacterRange(st, slPh.Length));
                    offset += slPh.Length;
                    st = tmp.IndexOf(slPh, offset, StringComparison.OrdinalIgnoreCase);
                }
            }

            StringFormat stringFormat = new StringFormat(StringFormatFlags.FitBlackBox | StringFormatFlags.NoClip | StringFormatFlags.NoWrap);
            stringFormat.Alignment = StringAlignment.Center;
            stringFormat.LineAlignment = StringAlignment.Center;
            stringFormat.SetMeasurableCharacterRanges(characterRanges.ToArray());

            var layt = e.Graphics.MeasureString(measureString, Font, Size, stringFormat);
            RectangleF layout = new RectangleF(Width / 2 - layt.Width / 2, Height / 2 - layt.Height / 2, layt.Width, layt.Height);
            var drawFont = new Font(Font, FontStyle.Underline);
            e.Graphics.DrawString(measureString, drawFont, BlockTextColor, layout, stringFormat);

            // Measure two ranges in string.

            Region[] stringRegions = e.Graphics.MeasureCharacterRanges(measureString, drawFont, layout, stringFormat);

            for (int i = 0; i < stringRegions.Length; i++)
            {
                var measRect = stringRegions[i];
                //RectangleF measureRect1 = stringRegions[0].GetBounds(e.Graphics);
                RectangleF measureRect1 = measRect.GetBounds(e.Graphics);
                e.Graphics.FillRectangle(new SolidBrush(BackColor), measureRect1);
                //e.Graphics.DrawRectangle(new Pen(Color.Red, 1), Rectangle.Round(measureRect1));

// почему то -2 и +5 дало удобоваримый результат ... 
                RectangleF lt2 = new RectangleF(measureRect1.X-2, layout.Y, measureRect1.Width + 5, measureRect1.Height);
                StringFormat stringFormat2 = new StringFormat(StringFormatFlags.FitBlackBox | StringFormatFlags.NoClip | StringFormatFlags.NoWrap);

                e.Graphics.DrawString(measureString.Substring(characterRanges[i].First, characterRanges[i].Length), drawFont, Brushes.Magenta, lt2, stringFormat2);
            }
            return;

В винформс есть LinkLabel, можно их рядом положить. Думаю это проще и надежнее.

А HTML не подошел? C# рендеринг тегов HTML WinForms

UPD: а, точнее в LinkLabel оказывается можно несколько в одном (LinkArea).

Где же вы раньше были … )))

А может знаете еще как можно в Awesomium повесить event на каждый щелчок на ссылку??

3 сообщения было перенесено в новую тему: Как в Awesomium повесить event на каждый клик на ссылку?

Сообщение было перемещено в эту тему: Как в Awesomium повесить event на каждый клик на ссылку?