献给初学编程的礼物⑶C语言
2000-4-6
这是C语言系列的最后一篇文章,下次我将讲解一些关于window下VB编程的一些技巧.
首先我们来分析一下计算机的组成部分,在输入输出部分的设备我们主要接触的有输出:显示
器、打印机,输入:键盘、鼠标
显示器方面就是我上几次讲的图形方式,对于打印机不作要求
键盘上次用keykey()这样一个函数就可以完成检测按键的功能呢
对于鼠标,鼠标是一个现在用得非常广的一个输入设备,在C语言中是如何对它进行控制呢?
事实上在计算机上有一种叫中断服务例程的代码,它提供中断号来进行计算机的控制。
而鼠标就是调用了其中的33号中断。
因为涉及比较深,所以有兴趣朋友可以仔细看下面的程序,对于初学者可以将下面的代码作
为一个库函数来调用。事实上以下代码是十分经典的,即使是自己要写一个C程序,依然可以
用这段代码。
首先要申请一个寄存器变量
union REGS r;
那么怎样去调用中断呢?
事实上是很简单的
在CPU寄存器组中分AX、BX、CX、DX,
在编程时只要先对这些变量附上相应的值,再调用中断号就行了
这些对应的值就代表对应的某些功能,这些值可以在许多书上找到参考表的。
下面以鼠标为例看看中断的调用
在运行之前要执行mouse.com,驱动鼠标。执行后鼠标并不显示出来。
现在要显示鼠标:
在参考表中是这样描述的
------------
入口参数 出口参数
AX=0001显示光标 无 无
AX=0003取光标位置与状态钮 BX(b=0;左键,b=2右键...)
------------
显示鼠标:
r.x.ax=1int86(0x33,&x,&x)
检测鼠标
r.x.ax=3int86(0x33,&x,&x)
if(r.x.bx=1) {当左键按下时完成的程序.....}
if(r.x.bx=2)
.....
事实上就这么简单!任何一个中断的调用者是这么简单。
下面的程序是比较规范的经典的鼠标函数。
就不一一界绍了。
#include<graphics.h>
#include "dos.h"
union REGS r;
typedef struct
{unsigned int shape[32];
char hotx;
char hoty;
}Shape;
Shape hand=
{{ 0xe7ff,0xc3ff,0xc3ff,0xc07f,0xc00f,0xc001,0xc001,0xc001,
0x8001,0x8001,0x8001,0xc003,0xc003,0xe007,0xe007,0xe007,
0x1800,0x2400,0x2400,0x2580,0x26b0,0x26d6,0x2232,0x2222,
0x4222,0x4002,0x4002,0x2004,0x2004,0x1ff8,0x1008,0x1ff8},0,0};
void mouseshape(Shape sp)
{_BX=sp.hotx;
_CX=sp.hoty;
_ES=FP_SEG(&sp.shape);
_DX=FP_OFF(&sp.shape);
_AX=0x09;
geninterrupt(0x33);
}
void mouse_IQR(int *num,int *bx,int *cx,int *dx) /*33H鼠标中断核心函数*/
{
r.x.ax=*num; /*寄存器初始化*/
r.x.bx=*bx;
r.x.cx=*cx;
r.x.dx=*dx;
int86(0x33,&r,&r); /*中断调用*/
*bx=r.x.bx;
*cx=r.x.cx;
*dx=r.x.dx;
*num=r.x.ax;
}
void init_mouse() /*鼠标初始化,检验是否安装鼠标驱动程序*/
{
int num=0;
mouse_IQR(&num,&num,&num,&num);
if(num!=-1)
{
printf("Mouse not installed!");
exit(1);
}
}
void show_mouse() /*鼠标显示函数*/
{
int num=1;
mouse_IQR(&num,&num,&num,&num);
}
void off_mouse() /*鼠标关闭函数*/
{
int num=2;
mouse_IQR(&num,&num,&num,&num);
}
void home(int *x,int *y) /*鼠标状态检验函数*/
{
int button=0,num;
num=3;
mouse_IQR(&num,&button,x,y);
}
int left_press() /*鼠标左键状态检验函数,按下则返回1*/
{
int bx=0,num=3;
mouse_IQR(&num,&bx,&num,&num);
return bx&1;
}
int right_press() /*鼠标左键状态检验函数,按下则返回1*/
{
int bx=0,num=3;
mouse_IQR(&num,&bx,&num,&num);
return bx&2;
}
/*main()
{
int gd=DETECT,gm;
initgraph(&gd,&gm,"");
init_mouse();
show_mouse();
mouseshape(hand_2);
for(;;)
{
if(left_press()==1) break;
}
mouseshape(hand);
getch();
off_mouse();
closegraph();
exit(1);
}*/
main()中你可以测试一下。
在程序中有这样的段代码
Shape hand=
{{ 0xe7ff,0xc3ff,0xc3ff,0xc07f,0xc00f,0xc001,0xc001,0xc001,
0x8001,0x8001,0x8001,0xc003,0xc003,0xe007,0xe007,0xe007,
0x1800,0x2400,0x2400,0x2580,0x26b0,0x26d6,0x2232,0x2222,
0x4222,0x4002,0x4002,0x2004,0x2004,0x1ff8,0x1008,0x1ff8},0,0};
这是什么呀?
这是鼠标的样式你可以自定义的鼠标的形状的。
这是一个手的形状。
0x表示这是十六进制,e7ff事实上就是1110011111111111
你可以用把上面的所有数字一行一行翻译成二进制,从第三排的是掩码。作用是什么自己试
一下。
最后这些组成的就是一个手的形状*^_^*
所以你可以把你要的16*16点阵的图形变成的鼠标形状的。
[总结]★★★★★★★★★★
总之,在C语言里要灵活运用自己的已有的函数,和“抄”别人的函数,这都是十分有效
的学习方法。
对于初学者不必太急于求成,上面提供的代码可能对你们来说是比较深了一点,但是当
你继续学,等你计算机基础及硬件基础到了一定的时候,你会突然发现“原来是这么的简单
”。
学会自学是一个很好的学习方法,计算机最主要的就是自学,从老师手里学的应该是学
习计算机的方法,而为是书本上已有的东西。
学会分析别人的源程序,也是一个更好的学习方法,我就曾仔细读了一个四千多行的C代
码,足足40页纸。即使看不懂,要学会看看得懂的地方,学会别人的程序结构、技巧。慢慢
地你也就会把不懂的也看懂了.
计算机语言都是一通百通的。不论是C、basic、fox还是什么。
还有一点是关于学编程有什么用?
我觉得即使一个初学计算机的人都应该学习一下编程。为什么?因为编程涉及到计算机
每一个领域。从操作到应用。不论你是否能编出什么像样的东西出来,你都可以学到一些更
有用的东西。当你编程有一定的基础,你就可以操作几乎所有的应用软件,有时我自己第一
次在用别人想的应用软件时,就会问自己这个软件是用什么写的?如果是我,我应该怎么编
?我应该在哪方面做得更好?
记得我当初学计算机的时候,用的是dos操作系统,第一次上机,进入的画面是一个黑色
的屏幕,键盘放在那,当时我们只是学了计算机有基本知识,知道计算机的组成、分类,操
作学都没学过。
我在寝室的时候听到过三个字的单词“dir”和一个“cd”,我摸着键盘找到了这三个键
d--i--r.计算机上刷地显示出来了一个英文的列表。许多人围了上来“你学过计算机吧?”
。其实我当然也不明白这个单词的意义。但是学习就是从这里开始的。不停地上机反复地验
证,这是一个学习的方法。dir/s 许多人都没用过即使是当时高年级的学生但是我试出来了
,是试出来的!计算机就是要有一种探索的精神在,对于未知的领域不一试又怎能学会呢。
事实,计算机上的东西只要试一试就会知道了,特别是现在的window操作就是这样,举个简
单的例子,在word中输入公式,我从未看过书,只是听过有人说过有一个叫公式输入法的东
东。当一次有人问我怎样输入公式,可怜呀一个单位的人都不知道。我试了半小时,可就是
没试出来,即使我现在知道怎么用了,我依然后悔,为什么这么多简单的东西,我竟然不会
用,其实就是一个简单的的插入对象的方法呀。
记住“试”是一个很有用的学问!
这里就讲这么多了,因为VB的范例涉及我正在写的一个软件,稍后写完了,我会将VB中
很多有特色的技术在这个范例中介绍出来的。
另,请需要讲下出的朋友请回复一下。为什么反反复复都要提到这个问题呢?因为对于
不同的初学者这篇系列可能讲得有点深。但是如果大家有这个要求的话。我会继续讲下去的
。
欢迎支持《编程技术》版,我是版主rosesnow。
同时感谢《新手上路》的三位版主谢谢,你们的支持!
-----永远的rosesnowOICQ:2546716
主页:rosesnow.heha.net
::∴★∵**☆.∴★∵**☆
.█████.☆.∵★∵∴☆
.█田█田█.*☆.∴★∵
.█田█田█.★∵∴☆.★∵∴
.█田█田█.同一个星空下★..**
.█田█田█.望著天空的星星雨**☆
.█████.你可会想起我是你的好朋友?
◢██□██◣.此刻我送予你這一句“愿我们友谊永固”~~~~~*^_^*
::∴★∵**☆.∴★∵**☆