鼠标事件:用鼠标在黑框框中画出图形

在了解句柄的概念和宏定义的前提下,就可以利用windows.h 头文件用已经定义好的许多函数的结构体做出很多功能了

比如读取鼠标状态信息(坐标,鼠标按键等)

(如果编译完此程序鼠标移动,点击黑框框均无反应,那么在编译运行出现黑框框后,右键黑框框顶栏->属性->选项->在"编辑选项"中的第一个选项“快速编辑模式”的勾选去掉即可!)



精简版:(详尽注释在下面的版本)

#include <stdio.h>    
#include <windows.h>    

void gotoxy(int x,int y)  //光标移动函数,X表示横坐标,Y表示纵坐标。
{
	COORD  coord;         //使用头文件自带的坐标结构
	coord.X=x;            //这里将int类型值传给short int
	coord.Y=y;
	HANDLE a=GetStdHandle(STD_OUTPUT_HANDLE);  //获得标准输出句柄
	SetConsoleCursorPosition(a,coord);         //以标准输出的句柄为参数设置控制台光标坐标
}

int main(void)    
{    
    HANDLE hIn = GetStdHandle(STD_INPUT_HANDLE);   //获得标准输入设备句柄  
    INPUT_RECORD mouse;  //定义输入事件结构体  
    DWORD res;    	 	 //res用于存储读取记录  
    COORD crPos;     	 //crPos用于存储鼠标当前位置
    while (1)  
    {  
        ReadConsoleInput(hIn, &mouse, 1, &res);        //读取输入事件  
        if (mouse.EventType == MOUSE_EVENT)  //相当于读取到的信息为鼠标事件 
        {  
            crPos = mouse.Event.MouseEvent.dwMousePosition;      //获得当前鼠标位置  
			gotoxy(0,0);  					 //去0,0位置打印出下面的文字 
            printf("当前鼠标位置坐标 X: %3lu  Y: %3lu", crPos.X, crPos.Y);  
 			if(mouse.Event.MouseEvent.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED) //如果鼠标左键被按下  FROM_LEFT_1ST_BUTTON_PRESSED表示最左边的鼠标键被按下 
 			{
 				gotoxy(crPos.X,crPos.Y);   //那么光标移动到这个坐标打印 
 				printf("&");               //打印出"&" ,这里可以随便换其他字符 
 			}
        }         
    }  
    CloseHandle(hIn);   // 关闭标准输入设备句柄    
    return 0;    
}    


详尽注释版:

#include <stdio.h>    
#include <windows.h>    

void gotoxy(int x,int y)  //光标移动函数,X表示横坐标,Y表示纵坐标。
{
	COORD  coord;         //使用头文件自带的坐标结构
	coord.X=x;            //这里将int类型值传给short
	coord.Y=y;
	HANDLE a=GetStdHandle(STD_OUTPUT_HANDLE);  //获得标准输出句柄
	SetConsoleCursorPosition(a,coord);         //以标准输出的句柄为参数设置控制台光标坐标
}

int main(void)    
{    
    HANDLE hIn = GetStdHandle(STD_INPUT_HANDLE);   //获得标准输入设备句柄  
    INPUT_RECORD mouse;                //定义输入事件结构体  
/*  结构体INPUT_RECORD的说明: 
    INPUT_RECORD结构体中的EnventType成员用于说明事件的类型,
		typedef struct _INPUT_RECORD 
		{
			WORD EventType;                 // 事件类型
			union 
			{
				KEY_EVENT_RECORD            KeyEvent;     //键盘事件
				MOUSE_EVENT_RECORD          MouseEvent;   //鼠标事件          
				WINDOW_BUFFER_SIZE_RECORD   WindowBufferSizeEvent; //窗口缓冲事件            
				MENU_EVENT_RECORD           MenuEvent;    //菜单事件
		        FOCUS_EVENT_RECORD          FocusEvent;   //摄像头事件
			} Event;
		} INPUT_RECORD;  */
    DWORD res;    	  //res用于存储读取记录  
    COORD crPos;      //crPos用于存储鼠标当前位置
    while (1)  
    {  
        ReadConsoleInput(hIn, &mouse, 1, &res);        //读取输入事件  
/*      ReadConsoleInput函数说明: 
		BOOL ReadConsoleInput(
 			HANDLE hConsoleInput,        //输入句柄
  			PINPUT_RECORD lpBuffer,      //指向INPUT_RECORD结构体(数组)的指针
  			DWORD nLength,               //上面那个结构体的大小 typedef unsigned long DWORD; 说白了DWORD就是个无符号整形 
  			LPDWORD lpNumberOfEventsRead //实际读入输入内容的个数,LPDWORD为长指针,PDWORD 为短指针都属于指针。
		);	
		它能获得对于这个Console的键盘和鼠标输入,相当于执行函数了就会读取(鼠标)信息放入mouse和res里								*/ 
  
        if (mouse.EventType == MOUSE_EVENT)  //相当于读取到的信息为鼠标事件 
        {  
/*  这里再重复一遍INPUT_RECORD函数体....  
    INPUT_RECORD结构体中的EnventType成员用于说明事件的类型,
		typedef struct _INPUT_RECORD 
		{
			WORD EventType;  // 事件类型,typedef unsigned short int WORD;   说白了WORD就是个无符号短整型 
			union 
			{
				KEY_EVENT_RECORD            KeyEvent;    //键盘事件
				MOUSE_EVENT_RECORD          MouseEvent;   //鼠标事件          
				WINDOW_BUFFER_SIZE_RECORD   WindowBufferSizeEvent; //窗口缓冲事件            
				MENU_EVENT_RECORD           MenuEvent;   //菜单事件
		        FOCUS_EVENT_RECORD          FocusEvent;   //摄像头事件
			} Event;
		} INPUT_RECORD;  */
		
/*     MOUSE_EVENT_RECORD结构体说明: 
 			typedef struct _MOUSE_EVENT_RECORD      //鼠标事件结构体    
			{    
  				COORD dwMousePosition;      //当前鼠标在控制台窗口缓冲区的位置    
				DWORD dwButtonState;        //鼠标按键的状态  注:typedef unsigned long DWORD
   		 		DWORD dwControlKeyState;    //控制键状态    
    			DWORD dwEventFlags;         //鼠标事件类型    
			} MOUSE_EVENT_RECORD;   		 */
              
            crPos = mouse.Event.MouseEvent.dwMousePosition;      //获得当前鼠标位置  
			gotoxy(0,0);   //去0,0位置打印出下面的文字 
            printf("当前鼠标位置坐标 X: %3lu  Y: %3lu", crPos.X, crPos.Y);  
 			if(mouse.Event.MouseEvent.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED) //如果鼠标左键被按下  FROM_LEFT_1ST_BUTTON_PRESSED表示最左边的鼠标键被按下 
 			{
 				gotoxy(crPos.X,crPos.Y);   //那么光标移动到这个坐标打印 
 				printf("&");               //打印出"&" ,这里可以随便换其他字符 
 			}
        }         
    }  
    CloseHandle(hIn);   // 关闭标准输入设备句柄    
    return 0;    
}    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值