C语言鼠标的操作函数集

合集下载

c获取鼠标坐标的各种方法

c获取鼠标坐标的各种方法

c获取鼠标坐标的各种方法获取鼠标坐标在编写一些程序中是非常常见的需求,它是实现一些事件或功能的基础。

本文将介绍在C语言环境下,获取鼠标坐标的各种方法。

一、使用Windows API函数Windows API函数是Windows操作系统提供的一种函数库,它可以访问操作系统的各种资源和功能。

对于Windows系统,可以使用Windows API函数获取鼠标坐标。

步骤如下:1.包含Windows API的头文件:#include <Windows.h>2.在程序主函数中,调用GetCursorPos函数获取鼠标坐标。

POINT point;GetCursorPos(&point);printf("Current mouse position is (%d,%d)\n", point.x, point.y);这里POINT是Windows API中用于表示坐标的数据类型,GetCursorPos是获取鼠标坐标的函数。

二、使用标准ASCII码值在C语言中,标准ASCII码值为十进制整数,可以使用getch()函数获取用户输入的字符的ASCII码值。

步骤如下:1.包含获取输入字符的头文件:#include <conio.h>2.在程序主函数中,使用getch()函数获取用户输入的ASCII码值。

int ch;printf("Please move your mouse and press any key to get the coordinates:\n");ch = getch();if (ch != 0xE0 && ch != 0){printf("Could not get the mouse coordinates.\n");return 1;}int x = getch();int y = getch();printf("Current mouse position is (%d,%d)\n", x, y);这里使用了两次getch()函数获取用户输入的ASCII码值,第一次获取到的是0xE0或0的标识位,第二次和第三次获取到的是鼠标当前坐标的ASCII码值。

C语言设备驱动编程入门

C语言设备驱动编程入门

C语言设备驱动编程入门C语言设备驱动编程是一项常见的技术,用于编写操作系统的设备驱动程序。

设备驱动程序是操作系统与硬件设备之间的桥梁,它负责将用户操作转化为硬件设备能够理解和执行的指令。

本文将介绍C语言设备驱动编程的基本概念和入门知识,帮助读者了解并入门这一重要的编程技术。

一、设备驱动程序概述设备驱动程序是操作系统的一部分,它与操作系统内核紧密结合,用于实现对硬件设备的控制和管理。

设备驱动程序通常由硬件设备制造商提供,或者由操作系统开发者开发。

它负责处理硬件设备与操作系统之间的通信,使得用户能够方便地操作硬件设备。

设备驱动程序可以分为字符设备驱动和块设备驱动两种类型。

字符设备驱动用于处理流式数据的设备,如键盘、鼠标等;块设备驱动用于处理以块为单位的数据的设备,如硬盘、U盘等。

不同类型的设备驱动程序在实现上有所不同,但都需要用C语言编写。

二、设备驱动程序的基本结构设备驱动程序的基本结构包括设备初始化、设备打开、设备关闭和设备读写等函数。

下面我们逐步介绍这些函数的作用和实现方法。

1. 设备初始化函数设备初始化函数负责对设备进行初始化,包括设备的寄存器配置、中断设置等。

在这个函数中,我们需要了解硬件设备的相关规格和特性,并根据需要进行适当的配置。

2. 设备打开函数设备打开函数在设备被用户程序打开时被调用,它负责向操作系统申请资源,并进行相应的设置,例如打开文件、分配内存等。

3. 设备关闭函数设备关闭函数在设备被用户程序关闭时被调用,它负责释放设备所占用的资源,如释放文件占用的内存、关闭文件等。

4. 设备读写函数设备读写函数是设备驱动程序的核心部分,它负责设备与用户程序之间的数据交换。

设备读函数用于从设备中读取数据,设备写函数用于向设备中写入数据。

三、设备驱动程序的编写步骤编写设备驱动程序需要经过以下几个步骤:1. 了解硬件设备在编写设备驱动程序之前,我们需要详细了解硬件设备的规格和特性,包括硬件寄存器的地址、中断向量等。

getmousemsg函数

getmousemsg函数

getmousemsg函数GetMouseMsg函数是C语言中用于获取鼠标消息的一个重要函数。

它可以在Windows和DOS环境下获取鼠标消息,利用它可以实现许多有关鼠标的应用。

下面是GetMouseMsg函数的使用步骤:一、头文件及参数说明使用GetMouseMsg函数需要引入以下头文件:#include<graphics.h>//graphics.h库文件提供了getmouse、clearmouseclick和下列类型结构的定义:struct mousestatus{int x,y;//鼠标的x,y坐标int buttons;//表示鼠标键的状态};也需要了解以下参数的含义:int[左键][右键][中键];1 = 按下鼠标键0 = 松开鼠标键二、初始化在使用GetMouseMsg函数前,需要初始化鼠标信息。

初始化时需要传入图形界面的路径。

initgraph(int *graphicedriver , int *graphmode , char*path);三、获取鼠标消息在初始化完成之后,我们就可以调用GetMouseMsg函数获取鼠标的消息。

GetMouseMsg函数的返回值是一个结构体类型,包含鼠标的坐标和状态信息。

例子:while(1){mousestatus m;m=getmouse();if(m.buttons==1){putpixel(m.x,m.y,WHITE);}}四、清除鼠标单击在使用鼠标单击之后,需要清除鼠标单击状态。

void clearmouseclick(int kind);kind是指鼠标键类型,具体取值如下:1:左键2:右键3:中键-1:清除所有单击消息五、结束程序当程序完成后,需要调用closegraph函数关闭图形界面。

closegraph();总之,使用GetMouseMsg函数可以轻易实现鼠标监听和菜单交互等应用。

c语言中任意形状鼠标的实现方法

c语言中任意形状鼠标的实现方法

c语言中任意形状鼠标的实现方法在C语言中,可以使用图形库来实现任意形状的鼠标。

例如,Windows平台下,可以使用WinAPI中的CreateCursor函数来自定义鼠标形状。

具体步骤如下:1. 定义一个CURSORINFO结构体,包含鼠标图像的参数,例如宽度、高度、热点(即鼠标指针在图像中的位置)等。

2. 使用CreateCursor函数创建自定义鼠标图案,函数的参数为CURSORINFO结构体指针,返回一个HCURSOR类型的句柄。

3. 使用SetCursor函数将自定义的鼠标图案设为当前鼠标图案,函数的参数为HCRUSOR类型的句柄。

下面是一个示例代码,实现一个自定义的鼠标图案:```#include <windows.h>int main() {// 定义鼠标图像参数int width = 32;int height = 32;int xHotspot = 16;int yHotspot = 16;BYTE andMask[128] = {0xFF};BYTE xorMask[128] = {0};// 创建光标HCURSOR hCursor = CreateCursor(GetModuleHandle(NULL),xHotspot, yHotspot, width, height, andMask, xorMask); // 设为当前鼠标光标SetCursor(hCursor);// 进入消息循环MSG msg;while (GetMessage(&msg, NULL, 0, 0)) {TranslateMessage(&msg);DispatchMessage(&msg);}return 0;}```该示例创建了一个宽度和高度都为32像素、热点在中心位置的光标,并将其设为当前光标,程序进入消息循环。

你可以自己定义鼠标图案,更改示例中的andMask和xorMask数组来实现。

c 钩子函数

c 钩子函数

c 钩子函数
在C语言中,钩子函数(hook function)通常是指可以被其他程序或系统调用的回调函数。

它通常会注册到某个框架或库中,当特定事件发生时会被调用。

例如,在Windows操作系统中,可以使用钩子函数来拦截特定的消息、键盘输入、鼠标事件等,实现一些特殊的功能,比如监控用户行为、加强系统安全等。

在这种情况下,钩子函数需要注册到操作系统的钩子链中,等待事件发生时被调用。

在编写C语言程序时,可以自己实现钩子函数,将其注册到自己的程序某个模块中,等待触发特定事件时被调用。

例如,在一个计算器程序中,可以注册一个钩子函数在用户按下某个快捷键时自动执行某些计算操作。

总之,钩子函数是一种非常灵活的编程技术,可以让程序更加智能化、自适应化。

计算器编程c语言

计算器编程c语言

计算器编程 c语言用C语言设计计算器程序源代码#include <dos.h> /*DOS接口函数*/#include <math.h> /*数学函数的定义*/#include <conio.h> /*屏幕操作函数*/函数*/#include <stdio.h> /*I/O#include <stdlib.h> /*库函数*/变量长度参数表*/#include <stdarg.h> /*图形函数*/#include <graphics.h> /*字符串函数*/#include <string.h> /*字符操作函数*/#include <ctype.h> /*#define UP 0x48 /*光标上移键*/#define DOWN 0x50 /*光标下移键*/#define LEFT 0x4b /*光标左移键*/#define RIGHT 0x4d /*光标右移键*/#define ENTER 0x0d /*回车键*/void *rar; /*全局变量,保存光标图象*/使用调色板信息*/struct palettetype palette; /*int GraphDriver; /* 图形设备驱动*/int GraphMode; /* 图形模式值*/int ErrorCode; /* 错误代码*/int MaxColors; /* 可用颜色的最大数值*/int MaxX, MaxY; /* 屏幕的最大分辨率*/double AspectRatio; /* 屏幕的像素比*/void drawboder(void); /*画边框函数*/初始化函数*/void initialize(void); /*计算器计算函数*/void computer(void); /*改变文本样式函数*/ void changetextstyle(int font, int direction, int charsize); /*窗口函数*/void mwindow(char *header); /*/*获取特殊键函数*/int specialkey(void) ;设置箭头光标函数*//*int arrow();/*主函数*/int main(){设置系统进入图形模式 */initialize();/*运行计算器 */computer(); /*系统关闭图形模式返回文本模式*/closegraph();/*/*结束程序*/return(0);}/* 设置系统进入图形模式 */void initialize(void){int xasp, yasp; /* 用于读x和y方向纵横比*/GraphDriver = DETECT; /* 自动检测显示器*/initgraph( &GraphDriver, &GraphMode, "" );/*初始化图形系统*/ErrorCode = graphresult(); /*读初始化结果*/如果初始化时出现错误*/if( ErrorCode != grOk ) /*{printf("Graphics System Error: %s\n",显示错误代码*/grapherrormsg( ErrorCode ) ); /*退出*/exit( 1 ); /*}getpalette( &palette ); /* 读面板信息*/MaxColors = getmaxcolor() + 1; /* 读取颜色的最大值*/MaxX = getmaxx(); /* 读屏幕尺寸 */MaxY = getmaxy(); /* 读屏幕尺寸 */getaspectratio( &xasp, &yasp ); /* 拷贝纵横比到变量中*/计算纵横比值*/ AspectRatio = (double)xasp/(double)yasp;/*}/*计算器函数*/void computer(void){定义视口类型变量*/struct viewporttype vp; /*int color, height, width;int x, y,x0,y0, i, j,v,m,n,act,flag=1;操作数和计算结果变量*/float num1=0,num2=0,result; /*char cnum[5],str2[20]={""},c,temp[20]={""};定义字符串在按钮图形上显示的符号 char str1[]="1230.456+-789*/Qc=^%";/**/mwindow( "Calculator" ); /*显示主窗口 */设置灰颜色值*//*color = 7;getviewsettings( &vp ); /* 读取当前窗口的大小*/width=(vp.right+1)/10; /* 设置按钮宽度 */设置按钮高度 */height=(vp.bottom-10)/10 ; /*/*设置x的坐标值*/x = width /2;设置y的坐标值*/y = height/2; /*setfillstyle(SOLID_FILL, color+3);bar( x+width*2, y, x+7*width, y+height );/*画一个二维矩形条显示运算数和结果*/setcolor( color+3 ); /*设置淡绿颜色边框线*/rectangle( x+width*2, y, x+7*width, y+height );/*画一个矩形边框线*/设置颜色为红色*/setcolor(RED); /*输出字符串"0."*/outtextxy(x+3*width,y+height/2,"0."); /*/*设置x的坐标值*/x =2*width-width/2;设置y的坐标值*/y =2*height+height/2; /*画按钮*/for( j=0 ; j<4 ; ++j ) /*{for( i=0 ; i<5 ; ++i ){setfillstyle(SOLID_FILL, color);setcolor(RED);bar( x, y, x+width, y+height ); /*画一个矩形条*/rectangle( x, y, x+width, y+height );sprintf(str2,"%c",str1[j*5+i]);/*将字符保存到str2中*/outtextxy( x+(width/2), y+height/2, str2);移动列坐标*/x =x+width+ (width / 2) ;/*}y +=(height/2)*3; /* 移动行坐标*/x =2*width-width/2; /*复位列坐标*/}x0=2*width;y0=3*height;x=x0;y=y0;gotoxy(x,y); /*移动光标到x,y位置*/显示光标*/arrow(); /*putimage(x,y,rar,XOR_PUT);m=0;n=0;设置str2为空串*/strcpy(str2,""); /*当压下Alt+x键结束程序,否则执行下面的循环while((v=specialkey())!=45) /**/{当压下键不是回车时*/while((v=specialkey())!=ENTER) /*{putimage(x,y,rar,XOR_PUT); /*显示光标图象*/if(v==RIGHT) /*右移箭头时新位置计算*/if(x>=x0+6*width)如果右移,移到尾,则移动到最左边字符位置*//*{x=x0;m=0;}else{x=x+width+width/2;m++;否则,右移到下一个字符位置*/} /*if(v==LEFT) /*左移箭头时新位置计算*/if(x<=x0){x=x0+6*width;m=4;} /*如果移到头,再左移,则移动到最右边字符位置*/else{x=x-width-width/2;m--;} /*否则,左移到前一个字符位置*/if(v==UP) /*上移箭头时新位置计算*/if(y<=y0){y=y0+4*height+height/2;n=3;} /*如果移到头,再上移,则移动到最下边字符位置*/else{y=y-height-height/2;n--;} /*否则,移到上边一个字符位置*/if(v==DOWN) /*下移箭头时新位置计算*/if(y>=7*height){ y=y0;n=0;} /*如果移到尾,再下移,则移动到最上边字符位置*/else{y=y+height+height/2;n++;} /*否则,移到下边一个字符位置*/putimage(x,y,rar,XOR_PUT); /*在新的位置显示光标箭头*/ }将字符保存到变量c中*/c=str1[n*5+m]; /*判断是否是数字或小数点*/if(isdigit(c)||c=='.') /*{如果标志为-1,表明为负数*/if(flag==-1) /*{将负号连接到字符串中*/strcpy(str2,"-"); /*flag=1;} /*将标志值恢复为1*/将字符保存到字符串变量temp中*/ sprintf(temp,"%c",c); /*将temp中的字符串连接到str2中*/strcat(str2,temp); /*setfillstyle(SOLID_FILL,color+3);bar(2*width+width/2,height/2,15*width/2,3*height/2);显示字符串*/outtextxy(5*width,height,str2); /*}if(c=='+'){将第一个操作数转换为浮点数*/num1=atof(str2); /*将str2清空*/strcpy(str2,""); /*做计算加法标志值*/act=1; /*setfillstyle(SOLID_FILL,color+3);bar(2*width+width/2,height/2,15*width/2,3*height/2);显示字符串*/outtextxy(5*width,height,"0."); /*}if(c=='-'){如果str2为空,说明是负号,而不是减号*/ if(strcmp(str2,"")==0) /*设置负数标志*/flag=-1; /*else{将第二个操作数转换为浮点数*/num1=atof(str2); /*将str2清空*/strcpy(str2,""); /*act=2; /*做计算减法标志值*/setfillstyle(SOLID_FILL,color+3);画矩形*/ bar(2*width+width/2,height/2,15*width/2,3*height/2); /*显示字符串*/outtextxy(5*width,height,"0."); /*}}if(c=='*'){将第二个操作数转换为浮点数*/num1=atof(str2); /*strcpy(str2,""); /*将str2清空*/做计算乘法标志值*/act=3; /*setfillstyle(SOLID_FILL,color+3); bar(2*width+width/2,height/2,15*width /2,3*height/2);显示字符串*/outtextxy(5*width,height,"0."); /*}if(c=='/'){将第二个操作数转换为浮点数*/num1=atof(str2); /*strcpy(str2,""); /*将str2清空*/做计算除法标志值*/act=4; /*setfillstyle(SOLID_FILL,color+3);bar(2*width+width/2,height/2,15*width/2,3*height/2);outtextxy(5*width,height,"0."); /*显示字符串*/}if(c=='^'){将第二个操作数转换为浮点数*/num1=atof(str2); /*将str2清空*/strcpy(str2,""); /*做计算乘方标志值*/act=5; /*设置用淡绿色实体填充*/ setfillstyle(SOLID_FILL,color+3); /*画矩形*/ bar(2*width+width/2,height/2,15*width/2,3*height/2); /*显示字符串*/outtextxy(5*width,height,"0."); /*}if(c=='%'){将第二个操作数转换为浮点数*/num1=atof(str2); /*strcpy(str2,""); /*将str2清空*/做计算模运算乘方标志值*/act=6; /*setfillstyle(SOLID_FILL,color+3); /*设置用淡绿色实体填充*/画矩形*/ bar(2*width+width/2,height/2,15*width/2,3*height/2); /*显示字符串*/outtextxy(5*width,height,"0."); /*}if(c=='='){将第二个操作数转换为浮点数*/num2=atof(str2); /*根据运算符号计算*/switch(act) /*{case 1:result=num1+num2;break; /*做加法*/case 2:result=num1-num2;break; /*做减法*/case 3:result=num1*num2;break; /*做乘法*/case 4:result=num1/num2;break; /*做除法*/case 5:result=pow(num1,num2);break; /*做x的y次方*/case 6:result=fmod(num1,num2);break; /*做模运算*/ }设置用淡绿色实体填充*/ setfillstyle(SOLID_FILL,color+3); /*覆盖结果区*/ bar(2*width+width/2,height/2,15*width/2,3*height/2); /*将结果保存到temp中*/sprintf(temp,"%f",result); /*outtextxy(5*width,height,temp); /*显示结果*/}if(c=='c'){num1=0; /*将两个操作数复位0,符号标志为1*/num2=0;flag=1;strcpy(str2,""); /*将str2清空*/设置用淡绿色实体填充*/ setfillstyle(SOLID_FILL,color+3); /*覆盖结果区*/ bar(2*width+width/2,height/2,15*width/2,3*height/2); /*显示字符串*/outtextxy(5*width,height,"0."); /*}如果选择了q回车,结束计算程序*/if(c=='Q')exit(0); /*}putimage(x,y,rar,XOR_PUT); /*在退出之前消去光标箭头*/返回*/return; /*}/*窗口函数*/void mwindow( char *header ){int height;cleardevice(); /* 清除图形屏幕 */setcolor( MaxColors - 1 ); /* 设置当前颜色为白色*//* 设置视口大小 */ setviewport( 20, 20, MaxX/2, MaxY/2, 1 );height = textheight( "H" ); /* 读取基本文本大小 */settextstyle( DEFAULT_FONT, HORIZ_DIR, 1 );/*设置文本样式*/settextjustify( CENTER_TEXT, TOP_TEXT );/*设置字符排列方式*/输出标题*/outtextxy( MaxX/4, 2, header ); /*setviewport( 20,20+height+4, MaxX/2+4, MaxY/2+20, 1 ); /*设置视口大小*/ 画边框*/drawboder(); /*}画边框*/void drawboder(void) /*{定义视口类型变量*/struct viewporttype vp; /*setcolor( MaxColors - 1 ); /*设置当前颜色为白色 */setlinestyle( SOLID_LINE, 0, NORM_WIDTH );/*设置画线方式*/将当前视口信息装入vp所指的结构中*/getviewsettings( &vp );/*画矩形边框*/rectangle( 0, 0, vp.right-vp.left, vp.bottom-vp.top ); /*}/*设计鼠标图形函数*/int arrow(){int size;定义多边形坐标*/int raw[]={4,4,4,8,6,8,14,16,16,16,8,6,8,4,4,4}; /*设置填充模式*/setfillstyle(SOLID_FILL,2); /*/*画出一光标箭头*/fillpoly(8,raw);测试图象大小*/size=imagesize(4,4,16,16); /*分配内存区域*/rar=malloc(size); /*存放光标箭头图象*/getimage(4,4,16,16,rar); /*putimage(4,4,rar,XOR_PUT); /*消去光标箭头图象*/return 0;}/*按键函数*/int specialkey(void){int key;等待键盘输入*/while(bioskey(1)==0); /*key=bioskey(0); /*键盘输入*/只取特殊键的扫描值,其余为0*/ key=key&0xff? key&0xff:key>>8; /*return(key); /*返回键值*/}。

C语言鼠标操作方法及源码

C语言鼠标操作方法及源码

C语言鼠标操作方法及源码C语言不是直接支持鼠标操作的,因为C语言是一种面向过程的编程语言,主要用于系统级编程和应用程序开发。

而鼠标操作通常是通过操作系统提供的图形界面库来实现的,如Windows中的WinAPI或Linux中的X窗口系统等。

在C语言中,可以使用图形界面库或API来实现鼠标操作。

以下是一个使用WinAPI实现鼠标操作的例子:```c#include <windows.h>LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)switch (uMsg)case WM_MOUSEMOVE:int xPos = LOWORD(lParam);int yPos = HIWORD(lParam);//处理鼠标移动事件printf("鼠标移动到坐标 (%d, %d)\n", xPos, yPos);break;}case WM_LBUTTONDOWN:int xPos = LOWORD(lParam);int yPos = HIWORD(lParam);//处理鼠标左键按下事件printf("鼠标左键按下,坐标 (%d, %d)\n", xPos, yPos); break;}case WM_LBUTTONUP:int xPos = LOWORD(lParam);int yPos = HIWORD(lParam);//处理鼠标左键松开事件printf("鼠标左键松开,坐标 (%d, %d)\n", xPos, yPos); break;}//其他鼠标事件的处理...}return DefWindowProc(hwnd, uMsg, wParam, lParam);int main//创建窗口HWND hwnd;WNDCLASS wc = {0};wc.lpfnWndProc = WindowProc;wc.hInstance = GetModuleHandle(NULL);wc.lpszClassName = TEXT("MyWindowClass");RegisterClass(&wc);hwnd = CreateWindowEx(0, TEXT("MyWindowClass"), TEXT("C语言鼠标操作示例"), WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, CW_USEDEFAULT, 800, 600, NULL, NULL,wc.hInstance, NULL);ShowWindow(hwnd, SW_SHOWDEFAULT);}//消息循环MSG msg;while (GetMessage(&msg, NULL, 0, 0))TranslateMessage(&msg);DispatchMessage(&msg);}return 0;```以上代码演示了一个简单的C语言程序,通过使用WinAPI,实现了基本的鼠标操作。

鼠标滚轮算法 c语言

鼠标滚轮算法 c语言

鼠标滚轮算法 c语言以鼠标滚轮算法C语言为标题,本文将介绍鼠标滚轮算法的原理和实现。

鼠标滚轮是计算机鼠标的一种常见输入设备,它可以通过滚动滚轮来控制屏幕上的滚动条或者改变显示内容的大小。

鼠标滚轮算法是指用来处理鼠标滚轮事件的一系列程序和逻辑。

鼠标滚轮算法的实现是基于C语言的,因为C语言是一种广泛应用于系统层面的编程语言,具有高效性和灵活性。

下面将详细介绍鼠标滚轮算法的原理和实现步骤。

我们需要了解鼠标滚轮事件的原理。

鼠标滚轮通常有两个方向:向上滚动和向下滚动。

当用户通过滚动滚轮时,鼠标会发送相应的滚轮事件给计算机。

这些事件包含了滚轮的方向和滚动的距离。

在C语言中,我们可以通过使用鼠标滚轮事件的API来监测和处理滚轮事件。

通常情况下,我们会通过一个循环来不断监听鼠标滚轮事件,直到用户退出程序。

接下来,我们需要确定滚轮滚动的距离对应于显示内容的变化。

一般来说,滚轮向上滚动会使得显示内容向上移动,滚轮向下滚动会使得显示内容向下移动。

我们可以通过增加或减少显示内容的垂直偏移量来实现这个效果。

在C语言中,我们可以使用一个变量来保存显示内容的垂直偏移量。

当监听到滚轮向上滚动的事件时,我们可以将偏移量减小一个固定值,从而使得显示内容向上移动。

类似地,当监听到滚轮向下滚动的事件时,我们可以将偏移量增加一个固定值,从而使得显示内容向下移动。

除了滚动距离的计算,我们还需要考虑一些边界情况。

例如,当滚动到显示内容的最上方或最下方时,我们需要限制偏移量的变化,以防止内容溢出或显示不完整。

在C语言中,我们可以使用条件语句来判断偏移量是否越界,并在发生越界时进行相应的处理。

例如,当偏移量小于最小值时,我们可以将其设置为最小值;当偏移量大于最大值时,我们可以将其设置为最大值。

我们还可以考虑添加一些平滑滚动的效果,以提升用户体验。

例如,我们可以使用缓动函数来调整滚动距离的变化速度,使得滚动过程更加平滑和自然。

总结一下,鼠标滚轮算法的实现主要包括以下几个步骤:监听鼠标滚轮事件、计算滚动的距离、根据滚动的距离调整显示内容的偏移量、处理边界情况和添加平滑滚动效果。

c语言 ncurses编程

c语言 ncurses编程
30
字符的属性2-2
普通字符输出 终端字符最亮 下划线 字符反白显示 闪动显示 加亮加粗 保护模式 空白显示模式 半亮显示 字符掩盖 字符交替
描述
函数名 attron(chtype attribute) attroff(chtype attribute) attrset(chtype attribute) standend() standout()
在指定窗口的当前坐标处,格式化输出内容
mvwprintw(WINDOW*, int y, 在指定窗口的指定坐标处,格式化输出内容 int x,char *format,…)
21
printw()例子
#include <ncurses.h> /* ncurses.h 已经包含了stdio.h */ #include <string.h> int main() {
9
curses模式初始化
initscr()函数将终端屏幕初始化为curses 模式 它用来清除屏幕上所有的字符,并等待下一步处理。 在调用其它的curses 函数前,要先调initscr()函数初始化
屏幕。 initscr()初始化了curses 系统并且为当前屏幕(也就是
“stdscr”)和相关的数据结构分配内存
refresh();
/* 将虚拟屏幕上的内容写到显示器 上,并刷新*/
getch();
/* 等待用户输入*/
endwin();
/* 退出NCURSES 模式*/
return 0;
}
4
编译包含NCURSES 库函数的程序
如果要调用ncurses 库中的函数,你必须在代码 中加载ncurses.h 文件,就是要在C 或C++程序开 头添加“#include <ncurses.h>”,然后在链接时 标记lncurses参数。(注:ncurses 库已经包含 “stdio.h”)

c语言中钩子函数和回调函数的区别

c语言中钩子函数和回调函数的区别

C语言中钩子函数和回调函数的区别一、定义1. 钩子函数:钩子函数是在特定事件发生时自动调用的函数,用于拦截和处理这些事件。

在C语言中,钩子函数通常用于实现操作系统的消息处理机制,比如监控键盘、鼠标等输入设备的输入事件。

2. 回调函数:回调函数是作为参数传递给其他函数的函数,用于在特定事件发生时被调用。

在C语言中,回调函数通常用于实现异步操作,比如在网络通信中接收到数据时的处理。

二、调用方式1. 钩子函数:钩子函数是由操作系统或特定的库自动调用的,程序员无法直接调用钩子函数。

2. 回调函数:回调函数是作为参数传递给其他函数的,程序员需要在调用该函数时指定回调函数的名称或指针。

三、作用范围1. 钩子函数:钩子函数对系统的事件进行拦截和处理,可以改变系统的行为。

比如在Windows操作系统中,可以使用钩子函数来拦截键盘输入,实现快捷键功能。

2. 回调函数:回调函数用于在特定事件发生时被调用,通常用于实现异步操作或事件通知。

比如在网络通信中,可以使用回调函数来处理接收到的数据。

四、编程实现1. 钩子函数:在C语言中实现钩子函数通常需要调用操作系统或特定库提供的函数,并注册钩子函数。

钩子函数的实现方式因操作系统和应用场景的不同而异。

2. 回调函数:在C语言中实现回调函数通常需要定义一个函数指针类型,并将回调函数作为参数传递给其他函数。

在特定事件发生时,其他函数会调用指定的回调函数。

以上是C语言中钩子函数和回调函数的区别,虽然它们都涉及到在特定事件发生时调用函数,但是它们的定义、调用方式、作用范围和编程实现方式都有所不同。

深入理解这两种函数的区别对于提高程序员的编程技能和理解系统底层原理是非常有帮助的。

C语言中钩子函数和回调函数的区别继续扩写:五、应用场景1. 钩子函数:钩子函数通常用于监控、拦截和处理系统事件,比如键盘输入、鼠标点击等。

在图形用户界面(GUI)编程中,钩子函数常用于实现快捷键功能、鼠标事件处理等。

c语言键盘操作

c语言键盘操作

第一章编程技术实现本章内容简介:本章主要介绍如何实现键盘和鼠标的输入,图形图像技术,动画技术,发声技术,汉字显示技术,精确的时间控制技术。

是编写大型程序的基本功。

虽然每个技术所涉及的内容很少,所提及的函数也很少,但是当它们组合在一起的时候,就可以编写大型程序。

一、键盘:首先有必要介绍一下计算机是如何来处理键盘输入的数据的键盘里面有一个微处理器,用来扫描和检测每个键的按下或者抬起的状态,然后向主机传送一个字节的键盘扫描码,键盘扫描码翻译成对应的ASCⅡ码。

作为编程来说,只要知道每个按键都有对应的ASCⅡ码。

由于ASCⅡ码不能将键盘上所有的按键全部包括,因此有些控制键如Ctrl、Alt、End、Home和Del等用扩充的ASCⅡ码表示。

至于每个按键所对应的ASCⅡ码到底是什么,这里介绍一个函数可以实现该功能:int bioskey(int n)该函数声明在bios.h头文件中,所以调用之前需要在程序开始的位置写上#include<bios.h>,(以后如果第一次碰到的函数可以在TC根目录下的include文件夹中的头文件中查找,可以用记事本打开。

)参数n用来确定该函数的三个功能,具体如下表所示表1-1如选参数n为2时,当某位为1时,表示相应的键已按,或相应的控制功能已有效,若key值为0x09, 那么从表1-2中可以得知右Shift键和Alt键被按下,因为只有0x01和0x08相加和为0x09。

若该函数还是无法理解也不影响最后编小游戏,故此处不做详细介绍。

表1-2例1-1:#include<bios.h>int main ( ){int key;key=bioskey(0);printf(“%x”,key);}/* 该例子中,若按下键盘上的UP (↑)键,屏幕会显示4800(16进制),用16进制是一种习惯,在上表2中也体现了这种习惯的合理性。

*/例1-2:#include<stdio.h>#include<bios.h>int main(){int i , s;for(i=0;i<5000;i++){delay(1); /*delay()函数用于延时,即使同样的参数会根据不同的实际情况的不同而延时不同的时间,精确的时间控制请参阅《精确的时间控制》(超链接)一章*/if(bioskey(1)!=0){s=1;break;}}printf(“hello”);}}/* 该例中用了一个5000次的循环,每次延时1,每次去判断是否有按键被按下,如果有,则跳出循环,马上去执行printf(“hello”);若5000次循环里面都没有按键按下,在循环结束后,执行printf(“hello”);这种方法对于最后编小游戏非常有用,在最后的吃豆子放炸弹(超链接)例子中会再次提到*/最后再介绍一个函数:int kbhit(void);该函数声明在conio.h头文件中,所以调用之前需要在程序开始的位置写上#include<conio.h>若按了键盘,该函数返回1,否则返回0;C语言也可以实现鼠标的操作,但由于这种方法效率低,现在的面向对象的编程都不是用C语言的鼠标操作手段。

c语言鼠标的操作函数集

c语言鼠标的操作函数集

C语言的鼠标操作函数集#include<dos.h>#include<graphics.h>#include<conio.h>#include<stdio.h>union REGS regs;int X__max,Y__max,x_max,y_max;void Initgr(void) /*屏幕初始化成图形模式*/{int w,h,grdriver=DETECT,grmode;registerbgidriver(EGAVGA_driver);initgraph(&grdriver,&grmode,"");/*在双引号中可加你tc放的路径,但要在tc里有EGAVGA.BGI这个来初始图形*/if(graphresult())/*若调用不成功,退出*/{printf("\n 调用失败!\n");exit(1);}X__max=getmaxx();/*求横向象点坐标数*/Y__max=getmaxy();/*求纵向象点坐标数*/getaspectratio(&w,&h);/*求纵横比*/x_max=1000; /*设置屏幕坐标的宽度*/y_max=x_max*(float)Y__max*h/((float)X__max*w);}int Msinit(int Xlo,int Xhi,int Ylo,int Yhi)/*鼠标初始化*/{int retcode;regs.x.ax=0;/*初始化鼠标*/int86(0x33,®s,®s);retcode=regs.x.ax;if(retcode==0) return 0;regs.x.ax=7;/*设置鼠标X方向的移动范围*/regs.x.cx=Xlo;regs.x.dx=Xhi;int86(0x33,®s,®s);regs.x.ax=8;/*设置鼠标Y方向的移动范围*/regs.x.cx=Ylo;regs.x.dx=Yhi;int86(0x33,®s,®s);regs.x.ax=15;/*设置mickey与象素的比,这各会影响鼠标移动速度*/ regs.x.cx=(int)(x_max/X__max);regs.x.dx=(int)(y_max/Y__max);int86(0x33,®s,®s);return retcode;}int Msread(int *px,int *py,int *pbuttons)/*读鼠标位置及状态*/ {static int x0=320,y0=240,but0=0;int xnew,ynew,ch;do{if(kbhit()){ch=getch();if(ch==13){*pbuttons=1;return -1;}else return ch; /*返回键盘输入*/}regs.x.ax=3; /*调用功能3,读鼠标位置及状态*/int86(0x33,®s,®s);xnew=regs.x.cx;/*返回鼠标当前的位置的X坐标*/ynew=regs.x.dx;/*返回鼠标当前的位置的Y坐标*/*pbuttons=regs.x.bx;/*返回鼠标当前的状态*/}while(xnew==x0&&ynew==y0&&*pbuttons==but0);/*当鼠标状态改变或位置改变终止循环*/but0=*pbuttons;/*将鼠标状态保存到静态变量中*/x0=xnew;y0=ynew;/*将鼠标位置保存到静态变量中*/*px=xnew;*py=(int)(y_max-ynew);return -1;}int Xpixel(int x)/*由象素坐标变换为屏幕坐标*/{ return (int)((long)X__max*x/x_max);}int Ypixel(int y){ return Y__max-(int)((long)Y__max*y/y_max);}void Cursor(int x,int y) /*显示十字光标*/{int X=Xpixel(x),Y=Ypixel(y),color;char *str=" \0";line(X-8,Y,X-3,Y);line(X,Y-8,X,Y-4);line(X+3,Y,X+8,Y);line(X,Y+4,X,Y+8);color=getcolor();setcolor(BLACK);outtextxy(X__max-100,10,str);/*删除前次显示值*/sprintf(str,"%d,%d",x,y);setcolor(WHITE);outtextxy(X__max-100,10,str);/*在屏幕右上角显示当前光标的坐标*/ setcolor(color);}Void main(){int buttons,X,Y,x,y,a,b;char i;Initgr();/*初始化图形屏幕*/setcolor(EGA_LIGHTRED);/*设置屏幕前景色*/line(1,1,X__max-1,1); /*在屏幕四周画一矩形*/line(1,1,1,Y__max-1);line(X__max-1,1,X__max-1,Y__max-1);line(1,Y__max-1,X__max-1,Y__max-1);setcolor(EGA_WHITE);printf("没\n 按鼠标右键终止程序\n");printf(" 然后按任意键退出");setwritemode(XOR_PUT);/*设置屏幕输出模式*/Msinit(0,(int)x_max,0,(int)y_max);/*初始化鼠标*/a=x_max;b=y_max;x=0;Cursor(a,b); /*在a=x_max;b=y_max;处画指针*/while(x!=2){Msread(&X,&Y,&x);Cursor(a,b); /*删除之前的鼠标,因为屏幕输出模式的关系*/if(x==1){a=(int)(X*1.0/x_max*X__max);b=(int)((y_max-Y)*1.0/y_max*Y__max);circle(a,b,1); } /*画点*/Cursor(X,Y);a=X;b=Y;}Cursor(X,Y);/*再调用一次把原来的指针削掉*/getch();closegraph();}。

c语言中sendinput函数

c语言中sendinput函数

c语言中sendinput函数sendinput函数是C语言中的一个系统函数,用于模拟用户的输入操作。

该函数主要用于自动化测试、远程控制以及编写键盘驱动等应用场景。

它可以模拟鼠标、键盘和其他输入设备的输入操作,从而实现对目标窗口的操作。

sendinput函数的原型如下:```cUINT WINAPI SendInputUINT nInputs,LPINPUT pInputs,int cbSize```该函数接受三个参数,分别是nInputs、pInputs和cbSize。

1. nInputs是一个无符号整数,表示输入数据的个数。

它指定了pInputs数组中结构体的数量。

2. pInputs是一个指向INPUT结构体的指针数组。

每个INPUT结构体描述了一个输入事件,可以是鼠标事件、键盘事件或者硬件事件。

3. cbSize是一个整数,表示一个INPUT结构体的大小。

它通常使用sizeof(INPUT)来获取。

INPUT结构体的定义如下:```ctypedef struct tagINPUTDWORD type;unionMOUSEINPUT mi;KEYBDINPUT ki;HARDWAREINPUT hi;}DUMMYUNIONNAME;}INPUT,*PINPUT,*LPINPUT;```其中,type表示输入事件的类型,可以是INPUT_MOUSE、INPUT_KEYBOARD和INPUT_HARDWARE等。

而mi、ki和hi是用来表示具体输入事件类型的联合体,分别对应鼠标事件、键盘事件和硬件事件。

下面分别介绍几种常见的输入事件。

1.鼠标事件MOUSEINPUT结构体定义了鼠标事件的信息,包括鼠标位置、鼠标按键状态以及鼠标移动信息等。

2.键盘事件KEYBDINPUT结构体定义了键盘事件的信息,包括按键的扫描码、按键的状态以及按键的附加信息。

3.硬件事件HARDWAREINPUT结构体定义了硬件事件的信息,可以用来模拟若干硬件操作,如模拟发送电流等。

c语言中sendinput函数

c语言中sendinput函数

c语言中sendinput函数SendInput是一个Windows API函数,可以用来模拟用户输入操作,如键盘输入和鼠标操作等。

该函数可以将输入事件发送到指定的窗口或控件,用于自动化测试、仿真用户操作、远程控制等场景。

SendInput函数的原型如下:UINT SendInput(UINT nInputs, LPINPUT pInputs, int cbSize);参数说明:- nInputs:指定发送输入事件的数量。

- pInputs:指向一个INPUT结构数组的指针,每个元素描述一个输入事件。

- cbSize:输入缓冲区中每个输入事件的大小(单位为字节),通常为sizeof(INPUT)。

INPUT结构定义如下:typedef struct tagINPUTDWORD type; // 输入的类型,1为键盘输入事件,2为鼠标输入事件unionMOUSEINPUT mi;KEYBDINPUT ki;HARDWAREINPUT hi; // 用于发送硬件事件}DUMMYUNIONNAME;}INPUT,某PINPUT;其中,MOUSEINPUT和KEYBDINPUT是内嵌的结构体,分别用于描述鼠标和键盘的输入事件。

例如,键盘输入事件的结构定义如下:typedef struct tagKEYBDINPUTWORD wVk; // 虚拟按键码(Virtual Key Codes),用于指定键盘上的键WORD wScan; // Oem扫描码,用于指定具体的键(特殊字符)DWORD dwFlags; // 按键标记,例如KEYEVENTF_EXTENDEDKEY表示扩展键,KEYEVENTF_KEYUP表示按键松开ULONG_PTR dwE某traInfo; // 附加信息,通常为0}KEYBDINPUT,某PKEYBDINPUT;使用SendInput函数的一般步骤如下:1.创建一个输入事件队列,并初始化INPUT结构数组。

C语言课程设计PPT课件

C语言课程设计PPT课件
第31页/共87页
汉字库简介
程序中可直接使用UCDOS中的HZK16,ASC16和HZK24三个文件。 • HZK16中存储的是16*16点阵汉字是按行存储的以便于显示,每个汉字字模32BYTE,按照国标码顺序存储,
其中也包含了682个纯中文符号字母。
第32页/共87页
汉字库的情况
• ASC16存储256个西文ASCII码的8*16点阵格式,按行存储,每个ASCII码16字节。 • HZK24X存储24*24点阵打印字模,按列存储,每个汉字字模占576字节。24*24点阵汉字存储两比较大,所
功能
输入值 输出值
X 范围 CX DX 无
Y 范围 CX DX 无
光标范围 CX DX SI 无
DI
中断程序 CX ES : 无
DX
功能调用 AX=0007 AX=0008 AX=0010
AX=000C
第19页/共87页
鼠标功能调用方法
用TC通过INT33H中断来编制基本函数,有三种常用方法: • 嵌入汇编程序,如:ASM CLI清中断 • 利用全程变量赋予寄存器值,然后通过函数geninterrupt( )调用中断实现 • 利用联合类型REGS,SREGS通过函数int86(),int86x()调用中断,原型在dos.h
设置鼠标的移动范围
SetMouseArea(int x0,int y0,int x1,int y1) { union REGS regs;
regs.x.ax=7;regs.x.cx=x0;regs.x.dx=x1; int86(0x33,&regs;&regs); regs.x.ax=8;regs.x.cx=y0;regs.x.dx=y1; int86(0x33,&regs,&regs); }

C语言鼠标操作

C语言鼠标操作
if(X>=65&&X<=69&&Y>=20&&Y<=23)
break;
}
}
inRec.Event.MouseEvent.dwEventFlags == RIGHTMOST_BUTTON_PRESSED) //鼠标左键双击
inRec.Event.MouseEvent.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED//鼠标左键单击
void MouseEventProc(MOUSE_EVENT_RECORD mer)
{
DWORD state = mer.dwButtonState;
switch(mer.dwEventFlags)
{
case 0:
case MOUSE_MOVED:
mousePos = mer.dwMousePosition;
inRec.Event.MouseEvent.dwButtonState == RIGHTMOST_BUTTON_PRESSED//鼠标右键单击
inRec.Event.MouseEvent.dwButtonState == FROM_LEFT_2ND_BUTTON_PRESSED) //鼠标滚轮单击
break;
wheele.Y = mer.dwMousePosition.Y-mousePos.Y;
//if(mer.dwButtonState & 0xFF000000)mousePos.X -= 6;//WheelDown();
//else mousePos.X -= 6;//WheelUp();
ReadConsoleInput(hInput, &inRec, 1, &res);

C语言回调函数

C语言回调函数
{
while (node != NULL)
{
if (node -> value == value)
{
break;
}
node = node -> next;
}
return node;
}
这个函数用于在一个单向链表中查找一个指定的值,返回保存这个值的节点。它的参 数是指向这个链表第一个节点的指针以及要查找的值。这个函数看上去很简单,但是我们 考虑一个问题:它只能适用于值为整数的链表,如果查找一个字符串链表,我们不得不再 写一个函数,其实大部分代码和现在这个函数相同,只是第二个参数的类型和比较的方法 不同。
正好库函数 strcmp 所执行的比较和我们需要的一样,不过 gcc 会发出警告信息:因 为 strcmp 的参数被声明为 const char *而不是 void const *。
上面的例子展示了回调函数的基本原理和用法,回调函数的应用是非常广泛的。通常, 当我们想通过一个统一接口实现不同内容的时候,用回调函数来实现就非常合适。任何时 候,如果你所编写的函数必须能够在不同的时刻执行不同的类型的工作或者执行只能由函 数调用者定义的工作,你都可以用回调函数来实现。许多窗口系统就是使用回调函数连接 多个动作,如拖拽鼠标和点击按钮来指定调用用户程序中的某个特定函数。
其实我们更希望令查找函数与类型无关,这样它就能用于查找存放任何类型值的链表 了,因此必须改变比较的方式,而借助回调函数就可以达到这个目的。我们编写一个函数 (回调函数),用于比较两个同类型的值,然后把一个指向这个函数的指针作为参数传递 给查找函数,查找函数调用这个比较函数来执行比较,采用这个方法,任何类型的值得都 可以进行比较。
另一个使用回调机制的 API 函数是 EnumWindow(),它枚举屏幕上所有 的顶层窗口,每个窗口都可以通过它调用另一个程序提供的函数,并传递窗口 的处理程序。例如:如果被调用者返回一个值,就继续进行迭代;否则,退出。 EnumWindow()并不关心被调用者在何处,也不关心被调用者用它传递的处理程 序做了什么,它只关心返回值,因为基于返回值,它将继续执行或退出。

C语言人机交互键盘输入和鼠标事件处理

C语言人机交互键盘输入和鼠标事件处理

C语言人机交互键盘输入和鼠标事件处理C语言人机交互:键盘输入和鼠标事件处理C语言是一种广泛应用的编程语言,它可以与用户进行人机交互。

通过键盘输入和鼠标事件处理,我们可以实现用户与计算机之间的有效沟通和交流。

本文将详细介绍C语言中的人机交互方法,包括键盘输入的处理和鼠标事件的处理。

一、键盘输入的处理1. 单个字符的输入在C语言中,我们可以使用`getchar()`来获取用户输入的单个字符。

它会等待用户输入,并返回输入的字符。

下面是一个简单的例子:```c#include <stdio.h>int main() {char c;printf("请输入一个字符:");c = getchar();printf("您输入的字符是:%c\n", c);return 0;}```2. 字符串的输入如果需要获取用户输入的字符串,可以使用`gets()`函数。

该函数可以获取用户输入的一行字符串,并存储在指定的字符数组中。

下面是一个示例:```c#include <stdio.h>int main() {char str[100];printf("请输入一个字符串:");gets(str);printf("您输入的字符串是:%s\n", str);return 0;}```需要注意的是,`gets()`函数存在安全性问题,建议使用`fgets()`函数来代替。

`fgets()`函数可以指定缓冲区的大小,避免溢出。

二、鼠标事件的处理在C语言中,基于控制台的鼠标事件处理相对复杂。

我们可以使用Windows API来实现控制台窗口中的鼠标事件响应。

下面是一个示例,演示了如何处理鼠标的移动和点击事件:```c#include <stdio.h>#include <windows.h>void MouseEventProc(MOUSE_EVENT_RECORD mer) {DWORD dwEventFlags = mer.dwEventFlags;COORD mousePos = mer.dwMousePosition;if (dwEventFlags == MOUSE_MOVED) {printf("鼠标移动到坐标:%d, %d\n", mousePos.X, mousePos.Y);} else if (dwEventFlags == DOUBLE_CLICK) {printf("鼠标双击坐标:%d, %d\n", mousePos.X, mousePos.Y);} else if (dwEventFlags == MOUSE_WHEELED) {// 处理鼠标滚轮事件} // 其他事件处理...}int main() {HANDLE hInput = GetStdHandle(STD_INPUT_HANDLE);DWORD prevMode;INPUT_RECORD inputRecord;DWORD numEventsRead;SetConsoleMode(hInput, ENABLE_WINDOW_INPUT |ENABLE_MOUSE_INPUT); // 启用鼠标事件while (1) {ReadConsoleInput(hInput, &inputRecord, 1, &numEventsRead);if (inputRecord.EventType == MOUSE_EVENT) {MouseEventProc(inputRecord.Event.MouseEvent);}}return 0;}```在这个示例中,我们使用了`GetStdHandle()`函数获取标准输入句柄,并使用`SetConsoleMode()`函数启用了控制台窗口中的鼠标事件输入。

VC++.NET下鼠标左键在图形绘制中的应用

VC++.NET下鼠标左键在图形绘制中的应用






















实用第一 智慧 密集
V ・E | C NT 鼠
摘 要
mim 蚋通 l i n
。 朱娜敏 魏 京寿 孥| i 自 丽 。 强 | |
本文在 . E N T平 台下采 用 V C语 言 实现 了鼠标 左键 的绘 图 ,鼠标跟 随及 橡皮 筋矩 形
中的应 用 ,为开发 大型 图形 系统作 铺 垫。
关键 词 消息 ,事件 处理 程序 ,橡皮 筋矩 形


概 述
鼠标是最普通的输入设备 之一 。作为一个程序开 理 函 数 被 用 来 处 理 n B tn o n o
ON W M
— —
在 程 序 中 直 接 接 收 鼠标 和 键 盘 的输 入 是 必 要 的 。 在 程 序 开 发 中 , 鼠标 输 人 以 消 息 的形 式 出 现 。 要 响应 Widw 应 用 程 序 中 nos 鼠标 的各 种 输入 主要 需 要 了解 处 理 哪个 消息 的问 题 。 所 有 鼠标 光 标 消 息 的 处 理 函 数 都 有 两 个 参 数 :n lg Fas和
个 图形 。在 开 发 画 图 程 序 的过 程 中 ,鼠标 释 放 点 亦 可 看 作 移
动至 最 终 位 置 的 临 时终 点 。
二 、 实现 步 骤
1 新建项 目 .
彬 L U T N B C K 双击 鼠标 左键 a x m g v i n B t o D l l U N B TOD L L f s o d 0 L u t n b C k(I T LU T NON B TO DW n l g ,C o n o n ) F a s P itp it : 按下 鼠标 左键 a x m g o d n B t o D w U N f _ s v i 0 L u t n o n(I T
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C语言的鼠标操作函数集
#include<dos.h>
#include<graphics.h>
#include<conio.h>
#include<stdio.h>
union REGS regs;
int X__max,Y__max,x_max,y_max;
void Initgr(void) /*屏幕初始化成图形模式*/
{
int w,h,grdriver=DETECT,grmode;
registerbgidriver(EGAVGA_driver);
initgraph(&grdriver,&grmode,"");/*在双引号中可加你tc放的路径,但要在tc里有EGAVGA.BGI这个来初始图形*/
i
f(graphresult())/*若调用不成功,退出*/
{printf("\n 调用失败!\n");
exit(1);
}
X__max=getmaxx();/*求横向象点坐标数*/
Y__max=getmaxy();/*求纵向象点坐标数*/
getaspectratio(&w,&h);/*求纵横比*/
x_max=1000; /*设置屏幕坐标的宽度*/
y_max=x_max*(float)Y__max*h/((float)X__max*w);
}
int Msinit(int Xlo,int Xhi,int Ylo,int Yhi)/*鼠标初始化*/
{int retcode;
regs.x.ax=0;/*初始化鼠标*/
int86(0x33,®s,®s);
retcode=regs.x.ax;
if(retcode==0) return 0;
regs.x.ax=7;/*设置鼠标X方向的移动范围*/
regs.x.cx=Xlo;
regs.x.dx=Xhi;
int86(0x33,®s,®s);
regs.x.ax=8;/*设置鼠标Y方向的移动范围*/
regs.x.cx=Ylo;
regs.x.dx=Yhi;
int86(0x33,®s,®s);
regs.x.ax=15;/*设置mickey与象素的比,这各会影响鼠标移动速度*/ regs.x.cx=(int)(x_max/X__max);
regs.x.dx=(int)(y_max/Y__max);
int86(0x33,®s,®s);
return retcode;
}
int Msread(int *px,int *py,int *pbuttons)/*读鼠标位置及状态*/ {static int x0=320,y0=240,but0=0;
int xnew,ynew,ch;
do{
if(kbhit()){
ch=getch();
if(ch==13){
*pbuttons=1;
return -1;
}
else return ch; /*返回键盘输入*/
}
regs.x.ax=3; /*调用功能3,读鼠标位置及状态*/
int86(0x33,®s,®s);
xnew=regs.x.cx;/*返回鼠标当前的位置的X坐标*/
ynew=regs.x.dx;/*返回鼠标当前的位置的Y坐标*/
*pbuttons=regs.x.bx;/*返回鼠标当前的状态*/
}while(xnew==x0&&ynew==y0&&*pbuttons==but0);
/*当鼠标状态改变或位置改变终止循环*/
but0=*pbuttons;/*将鼠标状态保存到静态变量中*/
x0=xnew;y0=ynew;/*将鼠标位置保存到静态变量中*/
*px=xnew;*py=(int)(y_max-ynew);
return -1;
}
int Xpixel(int x)/*由象素坐标变换为屏幕坐标*/
{ return (int)((long)X__max*x/x_max);}
int Ypixel(int y)
{ return Y__max-(int)((long)Y__max*y/y_max);}
void Cursor(int x,int y) /*显示十字光标*/
{int X=Xpixel(x),Y=Ypixel(y),color;
char *str=" \0";
line(X-8,Y,X-3,Y);
line(X,Y-8,X,Y-4);
line(X+3,Y,X+8,Y);
line(X,Y+4,X,Y+8);
color=getcolor();
setcolor(BLACK);
outtextxy(X__max-100,10,str);/*删除前次显示值*/
sprintf(str,"%d,%d",x,y);
setcolor(WHITE);
outtextxy(X__max-100,10,str);/*在屏幕右上角显示当前光标的坐标*/ setcolor(color);
}
Void main()
{int buttons,X,Y,x,y,a,b;
char i;
Initgr();/*初始化图形屏幕*/
setcolor(EGA_LIGHTRED);/*设置屏幕前景色*/
line(1,1,X__max-1,1); /*在屏幕四周画一矩形*/
line(1,1,1,Y__max-1);
line(X__max-1,1,X__max-1,Y__max-1);
line(1,Y__max-1,X__max-1,Y__max-1);
setcolor(EGA_WHITE);
printf("没\n 按鼠标右键终止程序\n");
printf(" 然后按任意键退出");
setwritemode(XOR_PUT);/*设置屏幕输出模式*/
Msinit(0,(int)x_max,0,(int)y_max);/*初始化鼠标*/
a=x_max;b=y_max;
x=0;
Cursor(a,b); /*在a=x_max;b=y_max;处画指针*/
while(x!=2)
{Msread(&X,&Y,&x);
Cursor(a,b); /*删除之前的鼠标,因为屏幕输出模式的关系*/
if(x==1){
a=(int)(X*1.0/x_max*X__max);
b=(int)((y_max-Y)*1.0/y_max*Y__max);
circle(a,b,1); } /*画点*/
Cursor(X,Y);
a=X;b=Y;
}
Cursor(X,Y);/*再调用一次把原来的指针削掉*/
getch();
closegraph();
}。

相关文档
最新文档