检测鼠标是否存在的函数(返回值为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);
}