Windows窗体UserControl覆盖未被调用

时间:2008-09-29 21:56:11

标签: wpf winforms c++-cli user-controls onpaint

我正在创建一个从UserControl派生的Windows窗体控件,以嵌入到WPF应用程序中。我一般都遵循this link中给出的程序。

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来说还是新手,所以它很可能是显而易见的......

2 个答案:

答案 0 :(得分:2)

除非您使用OnPaint方法构建适当的样式,否则UserControl通常不会在SetStyle中调用UserPaint。您需要将OnPaint样式设置为true才能调用SetStyle(ControlStyles::UserPaint, true);

OnPaint


更新

我最近自己遇到过这个问题并且开始寻找答案。我想在绘画期间执行一些计算(以利用绘画消息的独特处理)但我并不总是接到OnPaint的调用。

在使用Reflector挖掘之后,我发现只有在相应的WM_PAINT消息的剪切矩形不为空时才会调用UserControl。我的OnPaint实例有一个子控件,它填满了整个客户区域,因此将其全部剪切掉了。这意味着剪切矩形为空,因此没有WndProc调用。

我通过覆盖WM_PAINT并直接为{{1}}添加处理程序来解决这个问题,因为我找不到另一种方法来实现我想要的目标。

答案 1 :(得分:1)

我解决了这个问题,万一有人感兴趣。这是因为我的WinForms控件嵌入在ViewBox中。我把它改成了网格并立即开始获取绘画事件。我想在询问有关WPF的问题时,您应该始终在问题中包含XAML!