我有一些关于重写 Windows 窗体/NativeWindow 的 WndProc 方法的问题。
WndProc 和 DefWndProc 之间到底有什么区别(编辑:我之前以为它被称为“DefaultWndProc”)?我只能重写 WndProc,但是 DefWndProc 是做什么用的,我可以随时调用它?
在我的重写方法中在哪里调用 base.WndProc ?或者我应该调用 DefWndProc 来代替?我想到了以下立场:
protected override void WndProc(ref Message m)
{
// 1st: I call the base handler at the start, in front of my handling.
// Are there disadvantages here?
base.WndProc(ref m);
switch (m.Msg)
{
case (int)WindowsMessage.Paint:
// 2nd: Do whatever you want to do now. I could also place
// base.WndProc for each message manually here, at a point I
// can control myself. It makes the method a little messy
// since I have several base calls for each message I handle.
base.WndProc(ref m);
break;
default:
// 3rd: If I put it here, it never gets called for messages I
// have handled. I think it is disastrous for specific
// messages which need additional handling of the system.
base.WndProc(ref m);
}
}
// 4th: Or put it here. It gets called even after messages I have
// already handled. If I made some drawings in WM_PAINT, doesn't
// calling the system's default method draw "over" my paintings?
// And is this really needed?
base.WndProc(ref m);
}
你有什么建议吗?是否存在最好的情况,或者它是否很大程度上取决于我处理的消息?
WndProc 和 DefaultWndProc 到底有什么区别?
没有名为“DefaultWndProc”的方法,我假设您正在谈论 DefWndProc。这个问题很难回答,因为两者之间几乎没有什么区别。 DefWndProc() 方法对应于用 C 等语言编写代码的方式,调用 base.WndProc() 的能力是 .NET 特有的。他们做同样的事情,调用窗口的原始窗口过程,但有一点小小的区别。 base.WndProc() 方法能够完全改变消息,DefWndProc() 只能改变 Message.Result 值。我想不出这有什么关系。
Control.WndProc() 的 MSDN 库文章有助于消除疑虑,它规定如果重写该方法,则应始终使用 base.WndProc()。
Default WndProc 是做什么用的,我可以随时调用它?
专注于该短语的“任何时间”部分,这很少是正确的做法。您几乎应该始终调用 SendMessage() 以将消息发送到窗口。调用 DefWndProc() 仅应在以下情况下使用故意地想要绕过自定义 WndProc() 方法。那是很少见的。
在我的重写方法中在哪里调用 base.WndProc ?
这取决于您想要完成什么。有以下三种基本策略:
- 看着那(这
m
参数并实现您自己的自定义行为,然后调用 base.WndProc()。这是最常见的方式,应该是您的默认选择。
- 首先调用base.WndProc(),然后更改
m
参数或执行代码来自定义消息的默认处理。这适用于某些类型的消息,WM_NCHITTEST 是最好的例子。如果您需要绘画,您的 WM_PAINT 情况是另一种情况top默认窗口过程绘制的内容,那么您必须这样做。
- 根本不调用base.WndProc()。如果您完全自定义消息处理并且不想使用默认行为,则适用。对于过滤消息来说非常常见,这就是 KeyPressEventArgs.Handled 的工作原理。
究竟哪个项目符号合适需要深入了解消息的正常处理方式。这完全取决于您从中派生的特定控件和特定消息,因此不可能提供通用指导。然而,错误几乎总是很容易诊断出来。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)