1

背景:我有一个小的视频播放应用程序,其 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 应该做的。

4

4 回答 4

3

好的,为了回答我自己的问题,我想念 Adorners(在我所做的任何搜索中都没有回来,所以它们似乎并没有像他们应该的那样广为人知)。

不幸的是,它们似乎比 WndProc 覆盖要复杂得多,但我认为应该可以对它们进行处理以执行我想要的操作。

于 2008-08-29T01:31:41.527 回答
1

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

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

于 2008-08-26T11:54:35.330 回答
1

而且我似乎完全忽略了系统告诉我调整大小的位置。同样的命中测试。

对于调整大小,您确实缺少SizeChanged事件。AFAIK 遗憾的是,.NET中的窗口上没有 OnSizeChanging、OnLocationChanging 和 OnStateChanging 事件


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

它不会连续触发,但您可能可以使用ResizeBeginResizeEnd事件并能够做到这一点。


它们不是 WinForms 事件吗?

嗯,你是对的。

于 2008-08-26T12:12:58.407 回答
0

您能否覆盖 ArrangeOverride 和/或 MeasureOverride 以弥补那些缺少的调整大小事件?Measure 是第一遍,当布局需要调整新尺寸时发生,所以它有点像尺寸更改事件。

于 2008-12-10T19:31:41.447 回答