那么WPF中我对此缺少什么?

时间:2008-08-26 10:51:34

标签: wpf winapi

背景:我有一个小视频播放应用程序的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已经获得了大小/大小,移动/移动,变换/变换窗口消息,它们都很有用。为什么WPF不会复制同一组事件?这似乎是功能上的一个不必要的差距。

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

4 个答案:

答案 0 :(得分:3)

好的,为了回答我自己的问题,我错过了Adorners(从未回复过我做过的任何搜索,所以看起来它们并不像他们应该的那样广为人知。)

不幸的是,它们似乎比WndProc覆盖更复杂,但我认为应该有可能将它们用来做我想做的事。

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

  

我似乎完全忽略了系统告诉我调整大小的地方。同样是热门测试。

为了调整大小,你确实错过了SizeChanged事件。 AFAIK遗憾的是,.NET中的Window上没有OnSizeChanging,OnLocationChanging和OnStateChanging事件


  

我看到了那个,但据我所知,只有在尺寸发生变化后才开火,而我需要在调整大小时触发事件。除非我误读了文档和它   实际上连续发射?

它不会连续发射但您可以使用ResizeBeginResizeEnd事件并且能够执行此操作。


  

他们不是WinForms活动吗?

嗯,你是对的。

答案 3 :(得分:0)

您是否可以覆盖ArrangeOverride和/或MeasureOverride来弥补那些丢失的调整大小事件?测量是第一次通过,并且在布局需要针对新尺寸进行调整时发生,因此它有点像尺寸变化事件。