当前位置: 首页 > news >正文

屏幕边缘上有趣的 1 个像素,看不见、摸不到

如果你的屏幕分辨率是 1920×1080,那么一个全屏的窗口程序尺寸是多少呢?想都不用想,是 1920×1080。

那么输入设备输入的坐标是多少呢?是 X∈[0, 1919] ?还是 X∈[1, 1920] ?还是 X∈[0, 1920]


本文内容

    • 鼠标输入与触摸输入
    • 有趣的 1 像素
    • 防踩坑秘籍

鼠标输入与触摸输入

一个有趣的问题,因为 1920×1080 分辨率的屏幕,其横向只有 1920 个像素,也就是说如果需要区分一个像素,那么只需要 1920 个数值就够了。这意味着 X∈[0, 1919] 或者 X∈[1, 1920] 的取值范围就能表示横向的所有像素了。

那么实际上最左侧的点的输入数值是多少呢?最右侧的点的输入数值是多少呢?

我写了一个最大化全屏的程序专门用来测试鼠标和触摸输入的数值是多少。

鼠标输入

▲ 在鼠标输入的情况下,最右侧其实是 1919(我的屏幕是 2560×1080,所以最右侧是 2559)

测量的时候,鼠标是直接往右移动到底,移到不能动为止。

那么在触摸输入的时候又如何?

触摸输入

▲ 在触摸输入的情况下,最右侧是 1920(我的屏幕是 2560×1080,所以最右侧是 2560)

测量的时候,是让手指近乎在屏幕外触摸,不断触摸到能够在屏幕上看到的最小或最大值为止。

有趣的 1 像素

发现上面实验中有趣的现象了吗?明明只有 1920×1080 的屏幕分辨率,窗口明明只有 1920×1080 那么大,鼠标下收到正常范围内的输入坐标,而触摸下我们能收到超出我们窗口大小 1 像素的触摸事件!

问题并没有完——

如果说,触摸给了你超出窗口大小的坐标,那么你能如何使用这个坐标呢?虽然程序里收到什么坐标都无所谓(至少不崩),但如果你真拿它来渲染,就会在屏幕之外。

更有趣的是,虽然你能收到这个“在屏幕边缘之外”的坐标,但这个消息并不总会发送到你的程序里。更多的时候,你的程序根本就不会收到这个触摸事件,于是我们也就不能在程序里面更新窗口上显示的坐标到 1920 了,就像鼠标一样。

于是,你可能遇到的问题是:

  1. 如果你在屏幕的左侧边缘触摸,你的程序可以一直收到触摸事件,你能够得到正确的响应;
  2. 如果你在屏幕的右侧边缘触摸,你将仅能偶尔收到零星的刚好超出窗口大小的触摸坐标,大多数时候收不到触摸事件,于是你可能无法获知用户在屏幕右侧边缘进行触摸。

防踩坑秘籍

林德熙小伙伴告诉我说可以特意把窗口的尺寸做大一个像素。我试过了,确实能够让触摸在整个屏幕上生效,但对于双屏用户来说,就能在另外一个屏幕上看到“露馅儿”了的窗口,对于我这种强迫症患者来说,显然是不能接受的。

我的建议是,并不需要对这种情况进行什么特殊的处理。


我的博客会首发于 https://blog.walterlv.com/,而 CSDN 会从其中精选发布,但是一旦发布了就很少更新。

如果在博客看到有任何不懂的内容,欢迎交流。我搭建了 dotnet 职业技术学院 欢迎大家加入。

知识共享许可协议

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名吕毅(包含链接:https://walterlv.blog.csdn.net/),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。

相关文章:

  • 在 MSBuild 编译过程中操作文件和文件夹(检查存在/创建文件夹/读写文件/移动文件/复制文件/删除文件夹)
  • 在 WPF 程序中应用 Windows 10 真•亚克力效果
  • 推荐 .NET/C# 开发者安装的几款代码分析插件或对应的代码分析 NuGet 包
  • 在 HTML 超链接上添加可交互的 ToolTip
  • 在移动端打开 Google 的网页快照
  • 为自己搭建的博客添加可切换的暗色和亮色主题
  • 如何编写基于 Microsoft.NET.Sdk 的跨平台的 MSBuild Target(附各种自带的 Task)
  • 让你编写的控件库在 XAML 中有一个统一的漂亮的命名空间(xmlns)和命名空间前缀
  • Sdk 风格的 csproj 对 WPF/UWP 支持不太好?有第三方 SDK 可以用!MSBuild.Sdk.Extras
  • 为博客或个人站点的 Markdown 添加 LaTeX 公式支持
  • 如何让 .NET Core 命令行程序接受密码的输入而不显示密码明文
  • 如何编写 WPF 的标记扩展 MarkupExtension,即便在 ControlTemplate/DataTemplate 中也能生效
  • PasswordVault —— 在 UWP 应用中安全地保存密码
  • 如何在 MSBuild Target(Exec)中报告编译错误和编译警告
  • 将 .NET Core 项目打一个最简单的 NuGet 源码包,安装此包就像直接把源码放进项目一样
  • 4个实用的微服务测试策略
  • C# 免费离线人脸识别 2.0 Demo
  • eclipse的离线汉化
  • es6(二):字符串的扩展
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • JS数组方法汇总
  • 订阅Forge Viewer所有的事件
  • 高性能JavaScript阅读简记(三)
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 实现菜单下拉伸展折叠效果demo
  • kubernetes资源对象--ingress
  • # Pytorch 中可以直接调用的Loss Functions总结:
  • #Lua:Lua调用C++生成的DLL库
  • #QT项目实战(天气预报)
  • $.ajax中的eval及dataType
  • (附源码)springboot“微印象”在线打印预约系统 毕业设计 061642
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (学习日记)2024.01.19
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • **PHP二维数组遍历时同时赋值
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .net core Swagger 过滤部分Api
  • .net Signalr 使用笔记
  • @SpringBootApplication 包含的三个注解及其含义
  • [C++]:for循环for(int num : nums)
  • [C++]二叉搜索树
  • [C++]高精度 bign (重载运算符版本)
  • [ComfyUI进阶教程] animatediff视频提示词书写要点
  • [Contest20180313]灵大会议
  • [HTTP]HTTP协议的状态码
  • [JS设计模式]Prototype Pattern
  • [Linux] Boot分区满了的处理方法 The volume boot has only 0 bytes disk space remaining
  • [one_demo_3]漩涡递增矩阵
  • [POJ2411]Mondriaan's Dream
  • [Sdoi2010]地精部落
  • [Servlet 4]Bean与DAO设计模式
  • [Spring] IOC控制反转/DI依赖注入详细讲解
  • [Swift] Enum 好用, Enum 可以更易用
  • [Tomcat问题]--使用Tomcat 10.x部署项目时,出现实例化Servlet类[xxx]异常