Контроль как, когда и если нарисованы дочерние элементы управления (.NET) - PullRequest
1 голос
/ 29 марта 2019

Я пишу приложение в .NET, которое имеет интерфейс плагина.Этот интерфейс плагина предоставляет несколько способов рисовать информацию (элементы управления) на поверхности окна приложения.Хотя есть несколько причин, по которым я это делаю, основная причина заключается в том, чтобы обеспечить настраиваемую раскраску текста, либо с помощью графики, либо непосредственно манипулируя цветом текста, основываясь на цвете фона.Я делаю это с помощью «текстовой маски», которая представляет собой черно-белое растровое изображение, работающее как «альфа-карта», чтобы метод Paint знал, где применять изменения текстуры / цвета.

ПлагинРазработчик имеет возможность использовать обычный текст (например, с меткой), текст маски (который рисуется в маске, а не как обычный элемент управления), ИЛИ разрешать пользователю решать.Для этого я предоставил модифицированный класс меток, который можно нарисовать «нормально» (когда текстовая маска не установлена ​​для элемента управления) или текстовую маску, когда пользователь или разработчик решит (в зависимости от того, чторазработчик плагина хочет предложить пользователю). Вот код класса, чтобы вы понимали, как это делается:

public class MaskingLabel : Label
{
    private static readonly SolidBrush maskBrush = new SolidBrush(Color.White);
    public Bitmap Mask { get; set; }
    public MaskingLabel() : base() { }
    protected override void OnPaint(PaintEventArgs e)
    {
        if (Mask == null)   
            base.OnPaint(e);
        else
        {
            Graphics g = Graphics.FromImage(Mask);
            g.DrawString(Text, Font, maskBrush, Location);
        }
    }
}

Проблема, с которой я сталкиваюсь, состоит в том, что этот подход требует, чтобы я управлял элементами управления вочень конкретный порядок, так что форма нарисована правильно. Мне нужно найти наиболее эффективный подход, чтобы выполнить задачи, перечисленные ниже, в указанном порядке. Я подумал о трех возможностях, обсуждаемых далее. Для справки, этот порядок вкакие задачи необходимо выполнить:

  1. Все элементы управления «MaskingLabel», для которых для растрового объекта задана маска, должны быть нарисованы первыми, чтобы маска создавалась до следующего шага.
  2. Маска применяется к фоновому изображению.
  3. Полученное изображение отображается в видеy аналогично тому, как будет нарисован фон (за исключением того, что он изменяется первым).
  4. Остальные элементы управления нарисованы как обычно.

Есть ли способ для менячтобы убедиться, что это происходит без разделения элементов управления вручную?Мое первое предположение - нет.Таким образом, ниже у меня есть несколько предположений о том, как мне поступить.Я надеялся, что кто-то, обладающий более глубокими знаниями GDI +, сможет предложить некоторую информацию.

  1. Одна из идей, которая пришла мне в голову, заключается в рисовании замаскированных элементов управления во время метода OnPaintBackground.Тем не менее, я не хочу тратить время, рисуя элементы управления дважды.Это означает, что мне нужно будет отфильтровать, какие элементы управления нарисованы во время основного метода рисования, что фактически приводит нас к варианту 2 (FAIK):
  2. Я могу вручную отфильтровать элементы управления, которые рисуют маску, чтобы онине добавляются в элемент управления.Мой вопрос здесь, хотя бы, будут ли они вообще нарисованы?Могу ли я заставить их вручную вызывать метод OnPaint?
  3. Если это не сработает, то, возможно, я смогу создать отдельный производный элемент управления панели, который будет служить дочерним элементом управления "фоном", который действует как фоновое изображениечто можно сделать первым?

РЕДАКТИРОВАТЬ (с частью ответа) : после публикации я понял, что у меня уже есть часть решения, встроенная в мой проект,Тем не менее, я думаю, что это законный вопрос, поэтому если кто-то может добавить понимание помимо того, что я сделал в моем описании ниже, это приветствуется.

В частности, мой проект имеет только два элемента управления, которые добавляются в«корневая» форма: полоса, которая идет вверх (закреплена сверху, когда она показана), и прозрачная панель, занимающая остальное пространство (с установленным стилем заливки для заполнения).Поэтому мое решение было бы добавить элементы управления маской в ​​основную форму и добавить все остальные на панель. Остается решить только одну оставшуюся проблему: как сделать так, чтобы панель и панель отображались в последнюю очередь? (как часть шага 4 в первом списке?)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...