【发布时间】:2008-08-26 10:51:34
【问题描述】:
背景:我有一个小视频播放应用程序,其 UI 灵感来自古老的 Sasami2k,刚刚更新为使用 VMR9(即带有 DirectShow 的 Direct3D9)并且不太不稳定。目前,它是一个使用原始 Win32 的 C++ 应用程序,这是必要的:各种工具包都不值得一提。尤其是 WPF,由于其空域限制,无法实现。
好的,既然存在 D3DImage,那么混合和匹配 D3D/VMR9/DirectShow 和 WPF 可能是可行的。鉴于过去对 Win32 不可扩展性的不满,这似乎是件好事。
但是你知道,我在这里的第一个障碍就跌倒了。
使用 Win32,我(非常容易)创建了一个无边框窗口,该窗口可调整大小、按比例调整大小、对齐屏幕边缘,并在最大化时占据整个屏幕(包括任务栏区域)。这是一个视频应用,所以这些都是非常理想的属性。
好的,那么,如何对 WPF 做同样的事情?
在 Win32 中,我使用: WM_GETMINMAXINFO 控制最大化行为 WM_NCHITTEST 控制调整边框大小 WM_MOVING 控制对齐屏幕边缘 WM_SIZING 控制调整纵横比
但是,查看 WPF 似乎各种事件来得太晚了,除非我误解了文档?
例如,我不知道我什么时候移动,因为 LocationChanged 说它仅在窗口移动后触发(为时已晚)。 同样,StateChanged 似乎只在窗口恢复/最大化后触发(当我需要最大化之前的信息时,告诉系统正确的最大化大小)。
而且我似乎完全忽略了系统告诉我调整大小的位置。命中测试也是如此。
那么,呃,我是在这里遗漏了什么,还是我别无选择,只能退回去挂钩这个东西的 wndproc?我可以在不挂钩 WndProc 的情况下做我想做的事吗?
如果我必须使用 WndProc,我不妨坚持使用我现有的代码库;我想要更简单、更干净的 UI 代码,而摆脱 WndProc 是这方面的基础。
如果我必须挂钩 WndProc,我不得不想知道--为什么? Win32 有 sizing/sized、moving/moved、poscharging/poschanged 窗口消息,它们都很有用。为什么 WPF 不复制同一组事件?这似乎是功能上不必要的差距。
另外,这意味着 WPF 与特定的 USER32 相关的实现相关联。这意味着 MS 不能(例如在 Windows 7 或 8 中)反转显示层以使 WPF“原生”并模拟旧应用程序的 HWND 和 WndProcs——即使这正是 MS 应该做的。
【问题讨论】: