Windows窗体UserControl覆盖不被调用

时间:2020-03-06 14:53:57  来源:igfitidea点击:

我正在创建派生自UserControl的Windows Forms控件,以嵌入到WPF应用程序中。我通常遵循此链接中给出的步骤。

public ref class CTiledImgViewControl : public UserControl
{
...

virtual void OnPaint( PaintEventArgs^ e ) override;

...
};

在我的CPP文件中:

void CTiledImgViewControl::OnPaint( PaintEventArgs^ e )
{
    UserControl::OnPaint(e);
    // do something interesting...
}

一切都会编译并运行,但是永远不会调用OnPaint方法。

有什么想法要寻找吗?我已经使用C ++做了很多工作,但是对于WinForms和WPF来说是相当新的东西,因此它很可能是显而易见的...

解决方案

除非我们使用SetStyle方法构造适当的样式,否则通常不会在UserControl中调用OnPaint。我们需要将UserPaint样式设置为true才能调用OnPaint。

SetStyle(ControlStyles::UserPaint, true);

更新

我最近亲自遇到了这个问题,然后去寻找答案。我想在绘画过程中执行一些计算(以利用绘画消息的独特处理方式),但我并不总是能接到" OnPaint"的电话。

在研究了Reflector之后,我发现只有在相应的" WM_PAINT"消息的剪切矩形不为空的情况下才调用" OnPaint"。我的UserControl实例具有一个子控件,该子控件填充了整个客户端区域,因此将其全部裁剪。这意味着剪切矩形为空,因此没有" OnPaint"调用。

为了解决这个问题,我重写了WndProc并直接为WM_PAINT添加了一个处理程序,因为我找不到其他实现我想要的方法。

如果有人感兴趣,我已解决了这个问题。这是因为我的WinForms控件被嵌入到ViewBox中。我将其更改为网格并立即开始获取绘画事件。我猜想在问有关WPF的问题时,应该始终在问题中包括XAML!