鼠标指针主要有二种表现形式:文本鼠标和图形鼠标。文本鼠标又分为软指针和硬指针。软指针是用各种字符来作鼠标指针,而硬指针是用方块光标的大小来表示鼠标指针,其效果类似于INT 10H之功能01H——设置光标类型。
图形鼠标的表现形式与文本鼠标相比就显得更加丰富多彩,可用各种不同的指针形状来反映系统当前所处的工作状态和所能进行的操作。在Windows操作系统及其应用程序中使用了很多指针形状的变化来表达各种有用信息。
鼠标的文本软指针与图形指针的形成过程相一致,它需要两部分信息:象素掩码和光标掩码。其指针形成过程如下:
1)、用象素掩码与当前鼠标所处位置的象素信息进行“逻辑与”运算;
2)、光标掩码与步骤1的运算结果再进行“异或”操作,该操作所得到的16×16位的0/1信息就构成了当前鼠标指针的形状。
假设象素掩码为全0。全0的象素掩码与屏幕上的显示信息“逻辑与”后,所得结果仍为全0,全0的运算结果再和“光标掩码”进行“异或”操作,这时,所得结果显然与“光标掩码”完全一样,所以,看到的鼠标指针形状就是光标掩码所表达的指针形状。
综合上述,可得结论:若象素掩码为全0,那么,鼠标的形状就是16×16位光标掩码所表示的指针形状,鼠标所到之处就看不到该区域内(16×16点阵范围)的其它显示信息。
在Windows操作系统及其应用程序中,在16×16点阵范围内,除了看不见被各种形状指针覆盖的部分之外,还能看见其它小区域,这是因为鼠标的“象素掩码”取其“光标掩码”的反相点阵所致。感兴趣的读者可验证或证明之。
设置鼠标硬指针的中断功能使用方式:
MOV BX, 1 ;硬指针 MOV CX, 01H ;鼠标硬指针的起始扫描线 MOV DX, 0FH ;鼠标硬指针的结束扫描线 MOV AX, 0AH ;设置文本鼠标指针 INT 33H
设置鼠标软指针的中断功能使用方式:
MOV BX, 0 ;软指针 MOV DL, 'A' ;用字符'A'作为鼠标指针符号 MOV DH, 07FH ;置鼠标的颜色 MOV CX, 0 ;置象素位掩码 MOV AX, 0AH INT 33H ;设置文本鼠标指针
设置鼠标软指针的中断功能使用方式:
…… PMask DW 16 dup() ;象素位掩码,PMask可以是~CMask CMask DW 16 dup() ;光标掩码,二者紧相邻 …… MOV AX, DS MOV ES, AX LEA DX, PMask ;ES:DX=象素位掩码的起始地址 MOV BX, 0 MOV CX, 0 ;在鼠标指针范围内,(0,0)点为指示点 MOV AX, 09H INT 33H ;设置图形鼠标指针
例8.11 在屏幕的右上角动态显示文本鼠标的位置,即:鼠标的任何移动都将马上显示其所处位置,按鼠标左键结束程序的运行。
解:
.MODEL SMALL, C .DATA OldAddr DD ? MSG LABEL BYTE XMSG DB 'X=' ;显示方式:X=** Y=** XASC DW ? DB ' ' YMSG DB 'Y=' YASC DW ? Count EQU $-MSG .STACK 128 .CODE ClsScr PROC ;清除整个屏幕 ClsScr MOV AX, 0600H MOV BH, 30H MOV CX, 0 MOV DX, 184FH INT 10H RET ENDP ;把两位十进制数Data转换成字符串放入以首地址Desc开始的缓冲区之中 BTOAsc PROC USES AX CX DI Data:WORD, Desc:PTR BYTE BTOAsc MOV AX, Data MOV DI, Desc MOV word ptr [DI], 2020H ;赋两个空格 MOV CL, 10 DIV CL OR AL, 30H MOV [DI], AL INC DI OR AH, 30H MOV [DI], AH RET ENDP ;把当前鼠标位置(CX,DX)显示在屏幕右上角,该子程序在本程序被设置为鼠标移动事 ;件的中断处理程序,所以,只要鼠标一移动,该子程序马上就被执行。 DispPos PROC FAR DispPos SHR CX, 3 SHR DX, 3 INVOKE BTOAsc, CX, ADDR XASC INVOKE BTOAsc, DX, ADDR YASC MOV AH, 02H MOV BH, 0 MOV DX, 046H INT 10H ;设置字符串的显示位置 MOV AH, 40H MOV BX, 01H MOV CX, COUNT LEA DX, MSG INT 21H ;显示鼠标位置的字符串 RET ENDP .STARTUP CALL ClsScr MOV AX, 00 INT 33H .IF AX != 00 MOV AX, 01H INT 33H ;显示鼠标指针 MOV AX, CS MOV ES, AX LEA DX, DispPos MOV AX, 14H MOV CX, 1 ;把子程序DispPos设置成鼠标 INT 33H ;移动事件的中断服务程序 MOV word ptr OldAddr, DX MOV word ptr OldAddr+2, ES ;保存原移动事件处理程序的入口地址 .REPEAT MOV AX, 03H INT 33H .UNTIL BX==1 ;按下鼠标左键 MOV AX, 02H INT 33H ;隐藏鼠标指针 .ENDIF MOV DX, word ptr OldAddr MOV ES, word ptr OldAddr+2 MOV CX, 1 MOV AX, 0CH INT 33H ;恢复原鼠标移动的中断服务程序 CALL ClsScr .EXIT 0 END
例8.12 编写可随时修改文本鼠标指针符号的程序,即要求:在程序运行过程中,随时在键盘上按什么字符,即以该字符为鼠标指针符号。
解:
.MODEL SMALL .CODE .STARTUP MOV AX, 00 INT 33H ;初始化鼠标 .IF AX != 00 MOV AX, 01H INT 33H MOV BX, 0 MOV DL, 'A' ;用字符’A’作为鼠标指针符号 MOV DH, 07FH ;设置鼠标的颜色 MOV CX, 0H MOV AX, 0AH INT 33H ;设置文本鼠标指针 .REPEAT MOV AH, 01H INT 16H JZ next ;无键盘按键,则转到后面 MOV AH, 00H INT 16H ;读键盘按键 MOV BX, 0 MOV DL, AL ;设置当前按键为鼠标指针符号 MOV DH, 7FH MOV CX, 0 MOV AX, 0AH INT 33H next: MOV AX, 03H INT 33H .UNTIL BX==1 MOV AX, 02H INT 33H .ENDIF .EXIT 0 END
读者可把例8.11和8.12结合在一起,使之:一方面,可动态显示鼠标的位置,另一方面,也可随时修改文本鼠标的指针符号。
改变图形鼠标指针是许多计算机使用者体现其个性的方法之一,读者可参考例8.12和前面的“图形指针的设置”部分的叙述,编写一个显示自己设计的鼠标指针的程序。在学习了有关文件操作知识之后,还可利用现有的鼠标指针文件来显示鼠标指针。