【问题标题】:Windows Forms UserControl overrides not being calledWindows 窗体 UserControl 覆盖未被调用
【发布时间】:2008-09-29 21:56:10
【问题描述】:

我正在创建一个从 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 还是很陌生,所以这很明显......

【问题讨论】:

  • 我在自己的工作中发现了类似的问题后更新了我的答案。我希望它有所帮助。

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


【解决方案1】:

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

SetStyle(ControlStyles::UserPaint, true);


更新

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多