C语言的图形操作和鼠标控制技巧

一、图形操作基本简介
1. 必要的头文件
#include <dos.h>阴道血管肉瘤
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <graphics.h>
2. 必须的系统变量
int    GraphDriver;   
int    GraphMode;       
double AspectRatio;   
中国学术期刊全文数据库
int    MaxX, MaxY;       
int    MaxColors;       
int    ErrorCode;
struct palettetype palette;   
3. 初始化图形界面初始化出错处理关闭图形界面
GraphDriver = DETECT;
initgraph( &GraphDriver, &GraphMode, " " );
initgraph( &GraphDriver, &GraphMode,  “d:\\tc" );
ErrorCode = graphresult();         
if( ErrorCode != grOk ){
printf(" Graphics System Error: %s\n", grapherrormsg( ErrorCode ) );
exit( 1 );
}
closegraph();       
/* Return the system to text mode    */
4. 取得必须的信息
getpalette( &palette );       
MaxColors = getmaxcolor() + 1;    dspace
MaxX = getmaxx();
MaxY = getmaxy();
AspectRatio = (double)xasp / (double)yasp;
5. 一些常用的画图函数
outtext( buffer ),outtextxy(x,y,buffer)
line(x0,y0,x1,y1);linerel( );lineto( )
circle(int x, int y, int radius); arc( )
bar(int l, int t, int r, int b);bar3d( );
moveto(int x, int y);moverel(dx,dy);getx( )
putpixel(x,y,color); getpixel(x,y)
setcolor( );setbkcolor( );getcolor( );getbkcolor
outtext( buffer ),outtextxy(x,y,buffer)
line(x0,y0,x1,y1);linerel( );lineto( )
circle(int x, int y, int radius); arc( )
bar(int l, int t, int r, int b);bar3d( );
moveto(int x, int y);moverel(dx,dy);getx( )
putpixel(x,y,color); getpixel(x,y)
setcolor( );setbkcolor( );getcolor( );getbkcolor( );
看联机帮助,或参见下面的部分文字
显示器是个人计算机的重要组成部分。随着计算机硬件的发展,现在有不同的显示器及其适配器用在个人计算机系统中。常用的显示器有CGA,Herclus,EGA,VGA,SVGA,TVGA等等。显示模式有两种,文本模式和图象模式,DOS操作系统中默认的是文本模式。在图形模式中,整个屏幕按显示器的分辨率分成点阵,EGA可以是643*350640*200的点阵,CGA年降水量可以是640*200320*200的点阵,VGA则可以640*200*16,或640*480*16,本程序中用的就是后一种(VGAHI)。
  因为图形显示器种类很多,控制方式各异,要显示图形,必须先装入相应的图形驱动程序。其次每一种图形显示器,又具有不同的图形显示模式。要显示图形前必须决定选用哪一种显示模式,这些就是图形系统的初始化工作。 反之,在退出应用程序时,要恢复原来
的文本模式,要退出图形系统。
图形系统初始化程序如下:
Boolean InitG(void)
{ int errorcode;
errorcode = registerbgidriver(EGAVGA_driver);
/* report any registration errors */
if (errorcode < 0)
{ cout<<"\a\nGraphics error: "<<grapherrormsg(errorcode);
  return false;
}
int gd=DETECT,gm;
initgraph(&gd,&gm,"");
errorcode=graphresult();
if(errorcode!=grOk){
  cerr<<'\a'<<endl<<grapherrormsg(errorcode)<<endl;
  return false;
}
return true;
}
其中registerbgidriver(EGAVGA_driver)函数用于告诉连接程序,在连接时,把EGAVGA的驱动程序装入执行程序中。
Initgraph( int *gd,int *gm, char*)函数用于图形系统的初始化。Gd,gm分别表示图形驱动器
和图形模式。Gd=DETECT,告诉初始化函数自动探测显示器的类型。
Graphresult(),grapherrormsg(int errorcode)用于检测图形系统初始化是否正确,若不正确则打印错误原因。
本程序中的输出全部是在图形模式下,用到了画点(putpixle(int x,int y,int color),画线(line(int x1,int y1,int x2,int y2),lineto(int x,int y),坐标移动及提取(moveto(int x,int y), getx(), gety(), getmaxx(), getmaxy())设置颜(setcolor(int color),setbkcolor(int color), getcolor(), getmaxcolor())画框、设置点线的样式等等。
图形系统的退出用closegraph()函数实现。
二、鼠标操作简介
1. 鼠标简介
鼠标系统实际上由两个主要元素组成:鼠标机制和称作鼠标驱动程序的内存驻留程序。鼠标驱动程序提供与鼠标通信所需的全部低级支持。此外,它自动维持鼠标光标位置和发现是否按下了某个键。一旦装入驱动程序,鼠标就可以被随后执行的任意程序使用。
2. 鼠标驱动程序的主要功能
可以通过PC中断33H访问鼠标和鼠标驱动程序的各种功能。所选择的特定函数依赖于中断时AX寄存器的值。三个其它寄存器(BXCXDX)用于把各种参数传送给鼠标例程。同样,鼠标函数使用这四个寄存器把鼠标的位置和按钮的状态返回给调用函数。
女性百科
功能
输入值
输出值
功能调用
初始化
AX BX
AX=0000
显示光标
AX=0001
隐藏光标
AX=0002
读取状态
BXCXDX
AX=0003
设置位置
CX、DX
AX=0004
设置光标
BXCXDX
AX=0009
X范围
CX DX
AX=0007
Y范围
CX DX
AX=0008
光标范围北京全路通信信号研究设计院
CX DX SI DI
AX=0010
中断程序
CX ESDX
AX=000C
3. 鼠标功能调用方法
TC通过INT33H中断来编制基本函数,有三种常用方法:
嵌入汇编程序,如:ASM CLI清中断
利用全程变量赋予寄存器值,然后通过函数geninterrupt()调用中断实现
利用联合类型REGSSREGS通过函数int86(),int86x()调用中断,原型在在dos.h
注意一下例程中预定义了如下全局变量:
#define true 1
#define false 0
int visual=false; /* to tell whether the mouse icon is visual and init as false*/
4. 鼠标的初始化
InitMouse()
{ union REGS regs;
ax=0;
int86(0x33,®s,®s);
ax==0)
return false;
else return true;}
5. 鼠标光标的显示与隐藏
HideCur()
{ union REGS regs;
if(visual){
ax=2;
int86(0x33,®s,®s);
visual=false;
}}
ShowCur()
{ union REGS regs;
if(!visual){ 
ax=1;
int86(0x33,®s,®s);
visual=true;
}}
在鼠标驱动程序中,鼠标的显示状态用0值表示,隐藏用负值表示,每调用一次显示功能则该值加一,每调用一次隐藏功能,则该值减一。这样,在多次调用了驱动程序的隐藏鼠标光标功能后,再调用显示鼠标光标功能时,将不能正常显示鼠标光标。需要加入了一个visual布尔型变量,来取代驱动程序中的数值。
6. 读取按钮状态,读取或设置光标位置
Status(int*x,int*y,int*status)
{    union REGS regs;
ax=3;
int86(0x33,®s,®s);
*;
*dx;
*bx;
}
其中XY为光标位置
status&1左键状态,1为按下,0为未按
status&2右键状态,1为按下,0为未按
status&4中键状态,1为按下,0为未按
要注意循环检测时的抖动现象,可增加一些空循环或延时来清除剩余的按键信号。
例如:下面程序段,当鼠标移动时画线到当前的鼠标位置,当按左键时定义画线的启始位置,按右键时结束作图。
int working=true;
int x,y,status;
while(working){
    Status(&x,&y,&status);
    If(status&1)/*left button pressed*/
        moveto(x,y);/* move to current mouse position*/

本文发布于:2024-09-25 02:21:04,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/352200.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:鼠标   驱动程序   光标   显示   模式
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议