(请保留-> 作者: 罗冰   https://blog.csdn.net/luobing4365)

进行了上一篇博客所描述的各种实验,相关的代码基本都已经搭建好了,我们可以着手进行对GUI界面的鼠标支持了。

UEFI对开发者提供中断支持,所有异步操作都可以通过Event来完成。Simple Pointer Procotol也提供了对此机制的支持,根据文档中函数的说明,构建如下的函数:

图1 鼠标GUI函数

Line8-Line10的四个函数是主力工作的函数:初始化鼠标图像initMouseArrow;检查是否有鼠标事件触发CheckMouseEvent;获取鼠标消息GetMouseState;更新鼠标状态putMouseArrow。

相比之前Legacy BIOS下构建的鼠标驱动,这个简化得太多了,不由得想安慰一下苦苦调试的当年的我。

程序构建

一些相对较老的BIOS,对鼠标支持得还不是很好,不过去定位Simple Pointer Protocol的时候,还是能定位到。这种情况对代码逻辑没有什么影响,只是无法在GUI界面上支持鼠标了。

另外一个问题是,前一篇中挖下的问题坑:RelativeMovementX、RelativeMovementY和USB HID协议中的逻辑位移量有什么区别和联系。我个人的猜测是,没有什么直接联系。这是两个不同架构体系下,对鼠标位移量的不同表达。

在UEFI下,鼠标位置的移动,应该结合Mode->ResolutionX、Mode->ResolutionY来综合考虑。如果以像素单位,鼠标的位移公式应该为RelativeMovmentX * MouseRegulator/ResolutionX(Y轴的计算公式类似)。其中,MouseRegulator为用户定义的调节因子,用来调节鼠标移动的灵敏度。

比如,在我的程序中,我将调节因子设为了8。

图2 图形模式下鼠标显示

程序逻辑很简单:当用户鼠标左键和右键同时按下,退出while循环。在循环体中,如果发生了鼠标事件,则获取鼠标的信息。计算出位移值,更新鼠标位置,同时更新鼠标图像。

也许是因为汇编程序写得比较多,对程序的运行效率我比较执着。计算位移量时,也简化了计算过程,主要通过移位计算来实现。其中,右移xScale和yScale分别代表ResolutionX和ResolutionY的除法计算。

测试中发现,ResolutionX一般都是2^n,所以将其幂n计算出来了。采用这种方法,不用去关心恼人的类型转换,代码也简化了很多。

程序运行

和上一篇一样,鼠标的程序无法在模拟环境下运行。编译成X64的UEFI app,在实际机器上运行效果如下(intel NUC6CAY):(视频太大了,无法转换为2M以下的GIF图像,我将视频放在了gitee上了- 20190703鼠标程序演示.mp4)

图3 在NUC6CAY上运行鼠标程序

我在能找到的几个平台上都试了下,特别是2016年之后的机器,支持得都很好。至此,鼠标的支持工作就完成了。

为了便于在模拟环境上演示,添加了一段代码,用键盘方向键来控制鼠标图标的移动。与鼠标控制代码共存,也工作得很好,下面是在模拟环境下运行的情况(此时不支持鼠标,只能通过键盘方向键控制)

图4 键盘控制鼠标图标

3 One More Thing

在实际的商业产品中,“颜值”非常重要,如何激起用户的购买欲望,除去功能性满足要求外,产品的外观占据的比重比我们想象的要大得多。

我有段时间特别沉迷于图像特效的处理,也试着把隔离卡的底层界面做得有透明感,仿照苹果的UI做了一些设计。当时的Leader笑我不务正业,做完后的程序最终也没有用到产品上。

在我自己的开源项目Foxdisk的开发中,终于一偿夙愿。把我喜欢的一些特效,比如图像的渐隐、渐出;图标透明、字体自动阴影、亮化和暗化等等,都实现了出来。

人的本性终究是按捺不住的啊~~

实际上,本篇博客中的代码实现,鼠标图标就是透明的,在Gif图中可以看出。其实原理也比较简单,组合之后,能实现很多有意思的效果。

我在UEFI代码中实现了一部分特效功能,下一篇就来聊聊这个。

Gitee地址:https://gitee.com/luobing4365/uefi-explorer
项目代码位于:/
21 Mouse-GUI 下

UEFI开发探索31–鼠标GUI构建相关推荐

  1. UEFI开发探索11 – 鼠标前传

    (请保留-> 作者: 罗冰   https://blog.csdn.net/luobing4365) 这篇博客不是要写鼠标的历史,而是记录在很久以前,在Legacy BIOS下,我写鼠标驱动(B ...

  2. UEFI开发探索97 – EDK2模拟器搭建网络环境

    (请保留-> 作者: 罗冰 https://blog.csdn.net/luobing4365) EDK2模拟器搭建网络环境 1 搭建EDK2开发环境 1)工具安装 2)下载代码库 3)更新子模 ...

  3. UEFI开发探索85- YIE002USB开发板(08 制作HID设备)

    (请保留-> 作者: 罗冰 https://blog.csdn.net/luobing4365) YIE002USB开发板之制作HID设备-编程 1 YIE002-STM32的USB编程 2 调 ...

  4. UEFI开发探索99 – UEFI Shell下截屏工具

    (请保留-> 作者: 罗冰 https://blog.csdn.net/luobing4365) UEFI Shell下截屏工具 1 PrintScreenLogger的代码结构 1)Print ...

  5. UEFI开发探索QA – 问题辑录(持续更新)

    最近正在尝试在Unbutu16上搭建开发和调试环境,其中过程一言难尽,到现在也没完成到符合我要求的程度. 正是因为遇到障碍,我今天早上回到Win10+UDK2018的环境下,想重新编译下AppPkg, ...

  6. UEFI开发探索95 – 弹跳小游戏

    (请保留-> 作者: 罗冰 https://blog.csdn.net/luobing4365) UEFI下的弹跳小游戏 1 Bounce游戏 1.1 游戏架构 1.2 移植和编写代码 1)编写 ...

  7. UEFI开发探索32 – 有趣的图像特效

    (请保留-> 作者: 罗冰   https://blog.csdn.net/luobing4365) PhotoShop和ACD See中,有各种对图像进行特效处理的功能,我在大学的时候就很着迷 ...

  8. UEFI开发探索100 – 《UEFI编程实践》发布啦

    (请保留-> 作者: 罗冰 https://blog.csdn.net/luobing4365) <UEFI编程实践>发布 1 内容简介 第一部分 UEFI环境搭建及UEFI应用构建 ...

  9. UEFI开发探索02 – 环境搭建1

    (请保留->作者:罗冰 ) 开发初期的目的就是做出可以在pci rom上跑的Oprom,当然是在uefi bios下.我的计划大致如下: 1 搭建完整的编译环境,了解使用哪些库进行编译: 2 我 ...

  10. UEFI开发探索81- YIE002USB开发板(04 制作HID设备)

    (请保留-> 作者: 罗冰 https://blog.csdn.net/luobing4365) YIE002USB开发板之制作HID设备-USB系统概述 1 USB规范简介 2 软件工程师眼中 ...

最新文章

  1. Centos7上yum安装redis
  2. LeetCode 94. 二叉树的中序遍历(中序遍历)
  3. python not in range1002无标题_Python中偶尔遇到的细节疑问(一):去除列名特殊字符、标准差出现nan、切片索引可超出范围、range步长、众数...
  4. 【MatConvNet】配置GPU
  5. HTML静态网页--图片热点
  6. C++ tbb::atomic
  7. java 学习资料总结
  8. Android车牌识别SDK
  9. PowerDesigner如何自定义报表模板
  10. python学习(判断某年某月某日)
  11. js html监听ctrl v,js监听组合按键
  12. 今日头条、抖音创始人张一鸣
  13. 如何在php中显示170cm,身高 158cm,怎么穿才能像 170cm?
  14. 蓝牙核心技术概述(一):蓝牙概述
  15. 用卡尔曼滤波器跟踪导弹
  16. 时间频度和时间复杂度
  17. 【新闻早知道】10月13日 星期日
  18. 《寒蝉鸣泣之时:携带版》游戏截图
  19. android+汉王手写引擎,汉王推键盘输入引擎 从手写专家到输入法专家
  20. 局域网限制网速软件_Oka WiFi测网速 for Mac(网络测速软件)

热门文章

  1. 免费版本的mysql与收费版本的区别
  2. 主流强化学习算法论文综述:DQN、DDPG、TRPO、A3C、PPO、SAC、TD3
  3. Xshell远程连接Linux失败
  4. Linux 备份与恢复
  5. Ubuntu/Linux备份/还原系统
  6. 利用Vmware workstation安装MS-DOS使用Turbo C 2.0
  7. 手游修改 wpe封包 fiddler抓包 逆向破解 gg修改 哪种最厉害?
  8. Linux移植wifi驱动
  9. 【Unity】NGUI下载与导入
  10. SQL注入攻击原理与几种防御方式