【问题标题】:Painting over a custom control that already paints在已经绘制的自定义控件上绘制
【发布时间】:2019-03-13 15:42:01
【问题描述】:

我创建了几个继承自 UserControl 的自定义 .NET Winform 控件。其中之一是 ArrowButton,它与另一个稍微简单的称为 CustomButton 的属性共享许多属性。 ArrowButton 本质上是 CustomButton,但在文本旁边绘制了一个箭头。目前,它们都向 UserControl 基础添加了一个公共 Button,然后让 Paint 事件调用函数,在 ArrowButton 的情况下绘制渐变背景、自定义文本和箭头图形。这工作正常。

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

我将 ArrowButton 中的 Button 替换为 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() 覆盖函数,我试图做箭头绘制的地方根本不会被调用。

【问题讨论】:

    标签: winforms


    【解决方案1】:

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

    我将此添加到 CustomButton:

    virtual void ExtraChildDraw(Graphics^ grph) {}
    

    在我的 CustomButton 绘制事件函数结束时,我调用它并传入我一直在那里使用的 PaintEventArgs->Graphics 参考。由于它使用基类中函数的默认版本,所以它没有做任何额外的事情。

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

    【讨论】:

      猜你喜欢
      • 2017-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多