一、图形操作基本简介
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*350或640*200的点阵,CGA年降水量
可以是640*200或320*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寄存器的值。三个其它寄存器(BX、CX和DX)用于把各种参数传送给鼠标例程。同样,鼠标函数使用这四个寄存器把鼠标的位置和按钮的状态返回给调用函数。
功能 | 输入值 | 输出值 | 功能调用 |
女性百科初始化 | 无 | 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 ES:DX | 无 | AX=000C |
| | | |
3. 鼠标功能调用方法
用TC通过INT33H中断来编制基本函数,有三种常用方法:
嵌入汇编程序,如:ASM CLI清中断
利用全程变量赋予寄存器值,然后通过函数geninterrupt()调用中断实现
利用联合类型REGS,SREGS通过函数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;
}
其中X,Y为光标位置
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*/