Рисование над пользовательским элементом управления, который уже рисует - PullRequest
0 голосов
/ 13 марта 2019

Я создал несколько пользовательских элементов управления .NET Winform, которые наследуются от UserControl. Один из них, ArrowButton, имеет много общих свойств с другим, немного более простым, под названием CustomButton. ArrowButton - это, по сути, CustomButton, но со стрелкой, нарисованной рядом с текстом. Оба они в настоящее время добавляют общую кнопку в базу UserControl, а затем имеют функции вызова событий Paint, которые рисуют градиентный фон, настраиваемый текст и графику стрелок в случае ArrowButton. Это отлично работает.

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

Я заменил кнопку в ArrowButton на CustomButton. Все идет нормально. Но когда он запускается, он просто выглядит как CustomButton, а часть стрелки никогда не рисуется. Насколько я могу судить, код рисования в ArrowButton не вызывается. Или, возможно, закрашивается кнопкой CustomButton.

Так можно ли сначала рисовать CustomButton, а затем ArrowButton поверх него аддитивным способом? И если это так, я должен делать это, используя

void InitializeComponent(void) 
{
this->CustmBtn = (gcnew CustomButton());
....
this->CustmBtn->Paint += gcnew System::Windows::Forms::PaintEventHandler(this, &ArrowButton::ArrowBtn_Paint);

переопределить OnPaint () или использовать другой метод? Я работаю в C ++ / CLI, но примеры C #, вероятно, тоже будут работать.

Редактировать - Дополнительные детали: Я изменил ArrowButton для наследования от CustomButton вместо UserControl. Это определенно похоже на путь, так как я могу автоматически наследовать все свойства из CustomButton, и он все еще отлично работает в конструкторе VStudio. Тем не менее, он по-прежнему отказывается рисовать стрелку. И я подтвердил (используя вызовы Console :: WriteLine ()), что и функция события Paint, и мои функции переопределения OnPaint (), где я пытаюсь сделать рисование стрелок, никогда не вызывают вообще.

1 Ответ

0 голосов
/ 14 марта 2019

Я придумал собственное решение и, насколько я могу судить, хорошее.Чувствует себя намного проще, чем обходные пути на основе прозрачности или обрезки по регионам, которые я видел в похожих вопросах.

Я добавил это в CustomButton:

virtual void ExtraChildDraw(Graphics^ grph) {}

В конце моей краски CustomButtonФункция события, которую я вызываю, и передает ссылку на PaintEventArgs-> Graphics, которую я там использовал.Поскольку он использует версию функции по умолчанию в базовом классе, он не делает ничего лишнего.

Затем в ArrowButton или любом другом дочернем классе, который я хочу сделать из CustomButton, я перезаписываю функцию и выполняю все дополнительные 2Dживопись я хочу добавить поверх того, что делает CustomButton.Он отлично работает и даже корректно отображается в конструкторе VStudio.

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