excel学习库

excel表格_excel函数公式大全_execl从入门到精通

Windows目前(2018)到底有多少种窗口滚动的API?有没有实现平滑滚动的可能?

抱歉这个问题太过琐碎。只是希望各位专家在任何相关方面能够指点一二就好。我对GUI编程这方面很不了解所以很多描述不严谨的还请见谅。 =================== 目前Windows10上的触屏(触摸板)体验可谓是千差万别。在好的硬件+UWP上可以实现极致的界面滚动甚至平移体验,而大把从MFC到Winform到WPF的界面的则有各种奇葩的表现。 对于触摸屏+Precision Touchpad来说, 第一档:所有UWP应用(套壳除外), 支持无极滚动(双方向)无极缩放,响应自然迅速。还有和UWP同样处理的Win32界面,如PowerPoint, Excel, IE等(但是word,onenote就不是!Word会完全无视Precision Touchpad,直接按普通触控板加入夸张的衰减和延迟,不支持无极缩放。但是这两者在触屏上的表现又几乎接近UWP) 第二档:有无极滚动,但是响应慢一点,不跟手,顿挫,掉帧,回弹反馈没有或不自然。通常也不支持无极缩放。触屏和触摸板的手感还很不相同。例子:资源管理器, 任务管理器(以前还支持触控板的无极滚动,现在只有触屏可以了),Chrome, Office软件的菜单部分, Onedrive客户端。 第三档:没有连贯的动画,只能整行滚动,但是手感比较自然,有惯性。大量内置Win32界面都是如此。例如记事本,CMD,MMC组件,在其他应用中打开的资源管理器等 第四档:没有连贯的动画,滚动的幅度也不一致。完全不跟手,触控板操作痛苦,触摸屏甚至完全无视。常见于非Windows原生平台应用,如采用Java的MATLAB,等。 那么非UWP应用,到底能不能通过调用UWP滚动相应的API来实现完美的滚动和缩放?我猜是可以的,因为除了微软自家的Office和IE, 我还在一些完全不以体验为主的小众软件上见到过和UWP一样的滚动和缩放体验。但是为什么这样的软件如此之少,而且有些界面支持有些界面就不支持了。为什么PowerPoint Excel支持的,Word却又不支持了? 非UWP平台实现无极滚动是不是有没有一些根本上无法克服的技术难度?因为除了正确识别并相应触控板、触摸屏事件,还必须有足够的UI刷新率和低延迟。WinForm和WPF平台有能稳定30或60帧并且即使刷新的能力吗?如果强行实现会不会开销又太大?另外一些年代久远的GUI想必是不可能了,比如那种显示内容只能整行移动的界面,无论如何也做不出动画吧。 非Windows平台,如Java,Qt等,是不是只能完全靠自己来模拟UWP的手感(像OneDrive同步界面那样)?理论上有可能模拟的一样吗(界面响应延迟、刷新率够不够?) Windows 10 处理触屏和触摸板事件,能不能做到至少响应一致?像现在着这样一个可以平滑响应、另外一种只能按鼠标滚轮处理的情况完全是因为考虑不周吧? 作者:巢鹏链接:https://www.zhihu.com/question/275793801/answer/382807653来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 先说个结论,第三方非UWP能不能做到跟Edge一样的滚动,其实是可以的,但是限制会很多,文档例子很少,基本上软件都不可能去选择这样的技术。 UWP真不懂这块我就忽略了。 先说说会有什么输入设备,以下这些输入设备都是Chromium支持的,但是我不是都做过: 1. 鼠标 2. 触摸板Precision Touchpad 3. 触摸屏 4. 非标准的触摸板 5. 键盘 6. Wacom触摸板和笔 7. Windows的笔,Windows Stylus 9. 小红帽 10. 游戏手柄 触摸屏我没有做过Windows从系统上来那一层,Linux的倒是做过。4以后的我都没有碰过,小红帽在Linux我倒是搞过,在Windows我猜也是上来也是模拟鼠标设备,但是我不确定。笔和Wacom我们组的小姐姐搞得比较多,她也玩知乎,大家可以试试钓她出来。 另外还有些非Windows的输入设备,比如: 1. Chromebook的触摸板 2. Mac的触摸板 3. Mac的那条touchbar 3. Daydream手柄 这些我在这里可能会提到,但是不会展开。 先说说有什么处理输入的方法吧,其实MSDN是有文档的 User Interaction 1. MouseEvent,MouseEvent大家都知道是什么是吧。但是MouseEvent没有那么简单。 2. TouchEvent,这个也很直观就是触摸屏的事件。 3. PointerEvent,新的API,现在推荐用于替代MouseEvent和TouchEvent,而且也支持Windows的笔。 4. Direct Manipulation,这个是用来处理触摸屏和触摸板的,而且可以把鼠标键盘事件搞到DComp。 5. Interaction Context,这个我不懂,等懂的朋友来吧。 6. RawInput,直接读从驱动上来的信号,要用需要知道驱动上来的格式。游戏手柄就是这么做的。 好了说完了设备,说完了API,那就可以开始把这些连在一起说了,幻想我们开始开发一个客户端的程序。 最简单的,就处理MouseEvent,反正正常用户就只用鼠标,那鼠标事件上来怎么处理呢,首先看是纵向的还是横向的滚轮,然后读offset,Windows对于鼠标上来一下就是120,只有正负的区别。至于对应软件要滚多少,就看开发者了,你可以滚一行,可以滚若干的px。反正按方向走就对了。 OK,接下来用户多了,开始提意见,求支持触摸屏,好那就开始做TouchEvent。对于滚动Touch先来一个TouchDown,然后来个TouchMove,最后是个TouchUp,看着很简单是不是。nave了,首先想想,方向,这里还是只有4个方向吗,不是了。另外要滚多少,要滚Move那么多。如果有多个可滚动元素TouchDown那一下打在两个可滚动的元素的边要怎么搞。这应该还好吧,下面来个恶心的,如果我在Move的时候,再来一个手指呢,如果第二手指再动一下,然后拉起第一个手指,继续动第二手指。接下来再来,如果页面在滚动TouchUp怎么办。页面是不是还要因为惯性继续滚一段。好吧,这听上去挺恶心的是不是,以后你们提要求的时候想想开发者的蛋有多疼好吗。当然了微软还有一套WM_GESTURE,可以帮忙解决手势的问题。 好了,大家又开始投诉了,你滚动好生硬哦,滚一下滚轮就跳一下,很不平滑。要平滑怎么办,加动画,插值,怎么插,把120分成n份,然后每帧播放1份,知道播放完毕或者下一个滚轮事件到来。好像听着挺简单的但是n要取值多少呢,下一个滚轮事件来的时候还没播放完的怎么办,一次播玩还是丢弃。这里就需要慢慢调参数了。而且每个用户心中都有他的滚轮,一调就有人来骂,傻逼会不会搞,我要换别的了。 来到Win8.1,Mac已经搞了很久的触摸板了,Windows终于领悟到这东西要搞一下,但是Windows给触摸板夹带了很多的私货。比如触摸板的事件如果不进去Direct Manipulation的话会被fallback到MouseEvent,现在MouseEvent不可以认为只有120,可以为任意值,这没关系,但是如何分开事件是来自滚轮还是触摸板,如果是滚轮我们上面说了要走平滑动画,当触摸板有精确的滚动的时候,我们很显然是不应该再搞动画了,试试文档里面的Input Source Identification和PointerType你就会发现都是不行的。再比如一开始就只有UWP,比如一开始必须要跟DComp搞一起。这就很限制了。其实Windows并没有把你所有的路都关掉,起码你还可以走RawInput,只是没有告诉报文结构而已嘛。在这个时间内,大家都发现了Edge滚动好流畅啊,只有Edge能支持触摸板啊。 到了Win10,Windows悄悄地添加了一个事件DM_POINTERHITTEST。有了这个事件,就可以不走DComp拿到Direct Manipulation的事件。看上去世界已经很美好是不是,然而并不是。如果你认真读完Direct Manipulation的文档,你会知道DM_POINTERHITTEST一定会比OnContentUpdate早,然而不一定。里面有这个惯性滚动的选项,但是这个不能控制最长惯性滚动时间。还有不少事件顺序和转换的问题我就不说了。 其实我们还是希望触摸板能回到常规的事件序列,比如变成跟触摸屏一样每个手指出一个pointer,然后给出正确的PointerType。惯性滚动能给个初速度这样就太棒了。 现在我们差不多说完了输入事件处理。当我们能拿到合适的事件,就可以开始处理了,滚动其实没有大家想象中的那么简单。拿浏览器来说滚动要先做HitTest,知道要滚那个Element,知道了以后要看这个Element有没有JS听wheel或者scroll,有的话发出事件,JS处理以后,可能JS还会取消这次滚动,然后就可以滚动,所谓滚动是什么东西,最简单的就是重绘。当然重绘有不同级别的这就是优化的问题了。这里就不再展开。 柚子自媒www.yzzmt.top

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

«    2024年12月    »
1
2345678
9101112131415
16171819202122
23242526272829
3031
控制面板
您好,欢迎到访网站!
  查看权限
网站分类
搜索
最新留言
    文章归档
      友情链接