鼠标相关

检测鼠标是否存在的函数(返回值为true表示已经安装,返回值为0表示没有安装):

bMouse = GetSystemMetrics(SM_MOUSEPRESENT);

确定鼠标键的个数(返回值为0表示为安装鼠标,返回为非0表示相应的键值):

dwButtons = GetSystemMetrics(SM_CMOUSEBUTTONS);

鼠标消息可分为客户区鼠标消息与非客户区鼠标消息,对于一个典型的窗口而言,可用于输出文档的区域被称之为窗口的客户区。

而标题栏,菜单栏,滚动条,工具栏,和边框等所占据的窗口区域被称之为非客户区域。

一般非客户区域的鼠标消息我们交予操作系统来处理,我们只需要将重点放在客户区域的鼠标消息处理上

客户区域的鼠标消息处理函数原型:

afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point);

nFlags:表示鼠标按钮的状态以及鼠标事件发生时键盘上的按键状态,具体取值如下:

	MK_LBUTTON   //鼠标左键被按下
	MK_RBUTTON   //鼠标右键被按下
	MK_MBUTTON   //鼠标中键被按下
	MK_SHIFT     //键盘上的Shift键被按下
	MK_CONTROL   //键盘上的Ctrl键被按下
如果想知道某个键是否被按下,可以取以上值与nFlags按位做逻辑与运算,所得
结果若为非零值,则表示该键被按下,事例代码如下:

	if (nFlags & MK_SHIFT)
	{
		AfxMessageBox("键盘上的shift键被按下");
	}
	else if (nFlags & MK_LBUTTON)
	{
		AfxMessageBox("鼠标左键被按下");
	}
	else if (nFlags & MK_RBUTTON)
	{
		AfxMessageBox("鼠标右键被按下");
	}
	else if (nFlags & MK_MBUTTON)
	{
		AfxMessageBox("鼠标中间被按下");
	}
	else if (nFlags & MK_CONTROL)
	{
		AfxMessageBox("键盘上的Control键被按下");
	}
	else
	{
		AfxMessageBox("鼠标处于释放状态");
	}

point:表示鼠标光标热点的位置即设备坐标,是CPoint结构,成员x包含光标的水平坐标哪,
成员y包含坐标的垂直坐标,如果有需要可以将这些设备坐标转换为逻辑坐标
简单示例如下:

void CTestView::OnLButtonDblClk(UINT nFlags, CPoint point) 
{	
	char szText[MAX_PATH] = {0};
	
	sprintf(szText, "横坐标:%d  纵坐标:%d",point.x,point.y);
	AfxMessageBox(szText);
	
	CView::OnLButtonDblClk(nFlags, point);
}

效果图:



响应鼠标跟随消息WM_MOUSEMOVE

void CTestView::OnMouseMove(UINT nFlags, CPoint point) 
{
	CClientDC* pDC = new CClientDC(this);
	//设置跟随鼠标的图形为矩形
	CRect theRect(point.x - 30, point.y - 20, point.x + 30,point.y + 20);
	pDC->Rectangle(theRect);
	
	CView::OnMouseMove(nFlags, point);
}

效果图:


设置鼠标的样式:

IDC_ARROW    //默认的箭头光标
IDC_WAIT     //沙漏等待光标
IDC_CROSS    //十字形光标
IDC_IBEAM    //垂直I形光标
IDC_UPARROW  //垂直箭头光标
IDC_SIZEWE   //水平双向箭头光标
IDC_SIZENS   //垂直双向箭头光标
void CTestView::OnLButtonDblClk(UINT nFlags, CPoint point) 
{		
	//加载自定义的光标,并返回光标句柄值
	HCURSOR hCursor = AfxGetApp()->LoadCursor(IDC_CURSOR1);
	//设置加载的光标为当前区域活动光标
	SetCursor(hCursor);
	
	CView::OnLButtonDblClk(nFlags, point);
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值