我正在创建一个从UserControl派生的Windows窗体控件,以嵌入到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来说还是新手,所以它很可能是显而易见的......

有帮助吗?

解决方案

OnPaint 通常不会在 UserControl 中调用,除非在使用 SetStyle 方法构造时设置适当的样式。您需要将 UserPaint 样式设置为true,以便 OnPaint 被调用。

SetStyle(ControlStyles::UserPaint, true);

结果

更新

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

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

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

其他提示

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top