【发布时间】:2013-12-14 19:03:44
【问题描述】:
我正在开发一个 由
D2D、DWrite和Wic支持的 UI 库,用于 (SDK API) 本机 C++ 桌面应用程序 (如没有 XAML,没有WinRT,只是老式的 C++)。我已经准备好编写一个无窗口用户界面,为我的C++工具提供更现代的(如本世纪的外观)。
我本质上是一名支持者,因此我在 UI 上花费的时间最少,并且主要与 Windows 标准和通用控件以及一些自定义绘制的 GDI 东西进行交互。总之,没什么好看的。
我目前正在尝试使用 D2D,我有兴趣了解 UI 动画的标准方式。就像当您将鼠标悬停在使边框有点发光的按钮上,或者 UI 元素由于交互而平滑移动时,或者某些东西从屏幕上消失时。 (想想 jQuery 淡入淡出、滑动和在 UX 经济中如此简短但有意义的动画)
想到这里,我想到了两种在 UI 中处理动画的方法:
- 独立线程处理动画队列的计算,同时 UI 线程绘制结果。每次交互都会将动画作业放入队列中,线程会计算内容并在元素被绘制之前重新定位它们。
- 使用 same-thread Timers 来调度和迭代动画。
alternate Thread Worker 方法似乎是一个不错的方法……但在更新视觉属性时需要一些互锁,因此在实际绘制时不会发生这种情况,以保持一致。
现在,对于单线程 UI...计时器似乎是解决方案。这确保绘图不能与动画计算重叠。但对我来说,这感觉很尴尬。我很不习惯单线程的生活方式。 :)
还有其他方法吗?或者推荐哪种方法?我希望能提供有关现有实现细节或阅读材料的任何信息。
PS:如果反对者或要求关闭的人真的能给出一个理由,我将不胜感激。 (1) 如果你不知道我在问什么,那就继续吧……这绝对不是你的问题。 (2) 如果这对您来说太明显/太简单,请回答。 --- 我没有看到第三个原因,除非你是巨魔。 --- 或者这是一个非常愚蠢的问题,但正如我所说,我是一个十年以上的支持者,所以我可以侥幸逃脱。
【问题讨论】:
-
在线程之间分割这类事情的问题在于它很容易以令人讨厌的颤抖告终。如果你没有很多工作要做,那么多线程就没有意义。
-
@Spudd86 所以...
timers?! -
您可能想看看Ncurses 以获得良好的衡量标准。它是终端应用程序的 UI 库。另请参阅:Ncurses on Windows.
-
@Domi :) 谢谢,但如果 UI 足够,我会使用 XML/JSON 配置文件。我实际上正在开发类似于 Metro UI(现代 UI)的 UI。所以,没有 DOS/终端的东西。它被标记为 Direct2D... - PS:如果你在开玩笑,这是一个非常好的笑话!
-
UI 样式和动画的当前标准是两年前的标准。这动作很快,UI 造型时尚具有冰箱里牛奶的生存技能。当今可用的优秀工具丝毫没有赋予它权力,这些工具可以用相对较少的努力快速改变它。由设计师而不是程序员,这样的工具不包括 C++。它使用您的 not 列表中的内容。承诺在一两年后变得糟糕的大量代码更改是错误的。
标签: c++ windows animation user-interface direct2d