我只想让win32控件忽略所有移动和调整大小的操作。这可能吗?
基本上我在Winforms应用程序中托管旧的win32控件,但主应用程序正在调整大小并在使用某些命令时移动此控件。我希望窗口基本上忽略这些或者对这些操作免疫。
答案 0 :(得分:1)
我不确定我是否理解您当前设计背后的理由,正如评论中所讨论的那样。由于您似乎拥有所有代码,为什么不(A)组合它以便创建控件的项目也是负责管理它的人,或者(B)更改它以便您不移动/调整大小当你显然不想控制时。但是我相信你有理由按照自己的方式去做,而且我没有足够的信息来强烈坚持。
我还可以继承它吗?因为我不是从头开始创建这个控件,所以它已经存在了。
是的,从技术上讲,您可以继承任何控件,但除非您拥有它,否则不应该。当然,这并不意味着您拥有控件的代码,它只意味着您拥有所创建对象的所有权。我意识到这很令人困惑,但我想不出用文字解释它的更好方法。
那么一个例子怎么样。 Windows附带了一大堆常用控件,鼓励应用程序使用。您的应用程序不拥有任何这些控件的代码 - 它驻留在Windows附带的DLL中。但是因为你是创建和使用这些控件的人,所以你有权将它们子类化以修改它们的行为。
不确定如何将此控件子类化?我只有它的hwnd句柄,就是这样。
在Win32中给出控件子类化控件的两种标准方法是here。这些方法中的任何一种都是一个不错的选择。
基本上,您只是用自定义窗口过程替换现有的窗口过程。这将首先被调用,允许您做任何你想做的事情。您可以使用该消息,也可以将其传递给链中的下一个窗口过程。这可能是也可能不是默认的窗口过程,具体取决于窗口是否先前是子类,但这对您来说无关紧要。
当然,您需要编写大量的P / Invoke代码才能使其正常工作。检查pinvoke.net寻求帮助(但不要盲目依赖他们的声明,我已经看到很多不正确的。)
确保在销毁窗口之前取消分组。一个常见的错误是忘记自己清理。