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!