DOS编程:鼠标交互编程完整实例
Contents
说明
INT 33h 各功能号的速查可以看《DOS 鼠标中断 33h》,配合调用方式的讲解可以看《Turbo C键盘鼠标交互编程详解》。这篇写一个能直接跑起来的完整鼠标程序,包含自定义光标和事件回调两种常见写法。
完整示例:鼠标画图程序
用左键拖动画线,右键退出,这是最基础也最常见的鼠标交互程序结构。
|
|
几个容易踩的坑:
- INT 33h 的功能号在 AX 里,不是 AH——这是历史遗留的特殊约定,跟大多数 BIOS 中断不一样,写错了功能不会触发但也不会报错,调试起来很隐蔽。
- 鼠标坐标系统是独立的虚拟坐标,默认范围通常是 0-639 x 0-199(对应文本模式或某些图形模式),不一定和你
initgraph()之后的实际分辨率一致。进入图形模式后最好显式调用AX=07h/AX=08h设置移动范围,锚定到当前分辨率:
|
|
- 每次画完线都调用
line(),鼠标指针本身也需要重绘——驱动会自己处理指针的显示/隐藏刷新,不需要手动hide_cursor()再show_cursor(),否则拖动时指针会闪烁得很明显。
自定义图形光标(AX=09h)
默认的箭头指针在某些场合(比如做 CAD 类精确取点的软件)不够用,需要自定义十字光标或者位图光标。
|
|
热点(hot spot)的概念很重要:一个 16x16 的十字光标,视觉中心是第 8 行第 8 列,但如果你希望"点击坐标"对应的是光标最尖端的那个像素(比如画图软件里的笔尖),热点就要设成尖端的偏移量,不是图形的几何中心。
事件驱动:鼠标回调函数(AX=0Ch)
上面的例子都是轮询(每次循环主动查询鼠标状态),CPU 占用高。更高效的方式是注册一个回调函数,鼠标驱动检测到事件时自动调用:
|
|
这个回调函数的执行环境跟《DOS下TSR程序实现原理》里讲的中断服务程序限制几乎一样——鼠标驱动是通过 IRQ 触发内部逻辑再转调你注册的回调,本质上处于类中断上下文,DOS 服务不可重入的限制同样适用。标准做法同样是"回调只做最简单的标志位/坐标记录,复杂逻辑丢到主循环处理"。
相关阅读
Author 软件开发大郭
LastMod 2021-10-18