Windows窗体UserControl覆盖未被调用
-
02-07-2019 - |
题
我正在创建一个从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!
不隶属于 StackOverflow