背景:我有一个小视频播放应用程序,其 UI 灵感来自古老的 Sasami2k,刚刚更新为使用 VMR9(即Direct3D9 与 DirectShow)并且不太不稳定。目前,它是一个使用原始 Win32 的 C++ 应用程序,这是必要的:各种工具包都一文不值。尤其是 WPF,由于其空域限制而无法实现。

好的,现在 D3DImage 已经存在,混合和匹配 D3D/VMR9/DirectShow 和 WPF 可能是可行的。考虑到过去对 Win32 的不可扩展性的不满,这似乎是一件好事。

但你知道,我在这里的第一个障碍就跌倒了。

使用 Win32,我(非常容易)创建了一个无边框窗口,它可以调整大小,按比例调整大小,捕捉到屏幕边缘,并在最大化时占据整个屏幕(包括任务栏区域)。这是一个视频应用程序,所以这些都是非常理想的属性。

好的,那么,如何使用 WPF 做同样的事情呢?

在 Win32 中,我使用:wm_getminmaxinfo控制最大化行为WM_NCHITTEST,以控制调整大小边框WM_MOVING以控制snap-to-screen-edges wm_sizing以控制调整大小的纵横比

但是,看看 WPF,似乎各种事件来得太晚了,除非我误解了文档?

例如,我不知道何时在移动中,因为 LocationChanged 表示它仅在窗口移动后才会触发(这为时已晚)。类似地,似乎 StateChanged 仅在窗口恢复/最大化后才会触发(当我需要最大化之前的信息,以告诉系统正确的最大化大小时)。

我似乎完全忽略了系统在哪里告诉我有关调整大小的信息。命中测试也是如此。

那么,呃,我是否在这里遗漏了一些东西,或者我别无选择,只能回到挂钩这个东西的 wndproc ?我可以在不挂接 WndProc 的情况下做我想做的事吗?

如果我必须使用 WndProc,我不妨坚持使用现有的代码库;我想要更简单、更清晰的 UI 代码,而放弃 WndProc 是实现这一目标的基础。

如果我确实必须挂钩 WndProc,我不得不想——为什么?Win32 具有调整大小/大小、移动/移动、位置改变/位置改变的窗口消息,它们都很有用。为什么 WPF 不复制同一组事件?这似乎是功能上不必要的差距。

另外,这意味着 WPF 与特定的 USER32 相关实现相关联。这意味着 MS 无法(例如在 Windows 7 或 8 中)反转显示层以使 WPF 成为“本机”并为旧版应用程序模拟 HWND 和 WndProcs,尽管这正是 MS 应该做的。

有帮助吗?

解决方案

我似乎完全忽略了系统在哪里告诉我有关调整大小的信息。命中测试也是如此。

对于调整大小你确实错过了 尺寸已改变 事件。AFAIK 遗憾的是没有 OnSizeChanging、OnLocationChanging 和 OnStateChanging 事件 窗户 在.NET中


我看到了那个,但据我所知,它仅在大小更改后触发,而我需要在调整大小期间触发该事件。除非我误读了文档,并且它实际上会连续启动?

它不会连续发射,但您可以使用 调整大小开始调整大小结束 事件并能够做到这一点。


它们不是 WinForms 事件吗?

嗯,你是对的。

其他提示

好吧,回答我自己的问题,我错过了装饰者(在我所做的任何搜索中都没有回来,所以看起来他们并没有像他们应该的那样广为人知)。

不幸的是,它们看起来比 WndProc 覆盖更复杂,但我认为应该可以手动处理它们来做我想做的事情。

在代码中,您可以将 WindowStyle 属性设置为“None”,将 WindowsState 设置为“Maximized”

我不确定 Xaml 会是什么样子。

您是否可以覆盖 ArrangeOverride 和/或 MeasureOverride 以弥补那些丢失的调整大小事件?测量是第一遍,当布局需要调整新尺寸时发生,因此它有点像尺寸更改事件。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top