0

我正在创建一个从 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 还是很陌生,所以它很可能是显而易见的......

4

2 回答 2

2

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

SetStyle(ControlStyles::UserPaint, true);


更新

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

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

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

于 2008-09-29T23:13:26.097 回答
1

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

于 2008-09-30T14:13:05.090 回答