背景:我有一个小的视频播放应用程序,其 UI 灵感来自古老的 Sasami2k,刚刚更新为使用 VMR9(即 Direct3D9 和 DirectShow)并且不太不稳定。目前,它是一个使用原始 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 应该做的。