在已经绘制的自定义控件上绘制

时间:2019-03-13 15:42:01

标签: winforms

我创建了几个自UserControl继承的自定义.NET Winform控件。其中一个,ArrowButton,与另一个名为CustomButton的稍微简单一些的属性共享许多属性。 ArrowButton本质上是CustomButton,但是在文本旁边绘制了一个箭头。它们当前都在UserControl基础上添加了一个通用Button,然后具有Paint事件调用函数,在ArrowButton的情况下,该函数绘制渐变背景,自定义文本和箭头图形。这很好。

但是后来我开始考虑让ArrowButton使用CustomButton而不是普通按钮是有意义的,以便从中获取背景和文本,而ArrowButton要做的就是在其上方绘制箭头

我用CustomButton替换了ArrowButton中的Button。到目前为止,一切都很好。但是,当它运行时,它看起来就像一个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 :(得分:0)

我想出了自己的解决方案,据我所知它是一个好的解决方案。与我在类似问题中看到的基于透明度或基于区域裁剪的解决方法相比,感觉要简单得多。

我将其添加到CustomButton:

virtual void ExtraChildDraw(Graphics^ grph) {}

在我的CustomButton绘画事件函数的末尾,我将其调用并传入我一直使用的PaintEventArgs-> Graphics参考。由于它使用基类中函数的默认版本,因此它无需执行任何其他操作。

然后在ArrowButton或我要创建的CustomButton的任何其他子类中,我重写该函数,并在CustomButton的基础上进行所有我想添加的额外2D绘制。它可以很好地工作,甚至可以在VStudio设计器中正确显示。