MFC控件编程之鼠标消息
2021-06-27 17:05
标签:一个 src setw move set 成功 截图 code == 在MFC中鼠标消息.键盘消息我们很常用.所以说一下. 鼠标消息分为客户区消息.跟非客户区消息. 我们可以处理消息.来进行我们相应的函数即可. MFC添加消息的话.可以自己在消息映射表中添加 .可以自己使用工具直接添加. 消息映射表添加 学习过MFC原理的应该知道.这里可以添加消息. 自己可以手动添加.我们也可以使用向导来添加. 输出我们的鼠标点击的时候的坐标位置.调用 ::SetWindowText设置窗口标题. 非客户区消息就指的标题栏啊等等.这些位置. 而他们的消息多了一个NC开头. 例如我们在消息映射表中添加一个NC开头的消息. 我们也可以使用向导.看自己喜好了. 代码: 点击标题栏 如果按照上面写我们点击关闭按钮会关闭不了.原因就是NcLBUTTONDown里面包括了点击关闭按钮的消息.你没有进行处理.此时我们交给父类处理即可. 其中nflags是一个区域划分吗.我们可以自己判断是否是哪个区域会享用. 例如: if (nflags == HTSYSMENU) 判断是否是菜单.... 进行你的操作 点击客户区 在我们的鼠标消息到来之前.它会先判断是客户区域还是非客户区域.然后进行转换.才给我们将消息发送过来. 也就是说我们可以吧客户区转换为非客户区. 比如鼠标点击客户区.其实是点击的非客户区. 代码如下. 实现的消息 API: 坐标转为窗口坐标. 捕获鼠标也很常用. 比如我们鼠标按下画线.的时候. 鼠标会移动到窗口外边.那这样的话画线就不会成功了. 实现思路: 1.鼠标点击.保存一下坐标 2.鼠标抬起. 创建CClientDc. 使用MoveTo移动到保存的鼠标位置. 3.使用dc画线.画出新的位置. 例如: 鼠标按下. m_point是在类中定义的一个成员. 实现截图 遇到的问题.当我们鼠标拖动到窗口外面之后.就不会画线了.所以我们要捕获鼠标. 用到的三个API: 1.SetCapture(); 捕获鼠标.在鼠标按下的时候. 2.GetCapture(); 获取捕获的鼠标. 3.ReleaseCapture(); 释放 代码如下. 这样我们的鼠标移动到客户区外面也可以画线了. MFC控件编程之鼠标消息 标签:一个 src setw move set 成功 截图 code == 原文地址:https://www.cnblogs.com/iBinary/p/9651594.html MFC控件编程之鼠标消息
一丶客户区消息
void CCDCDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CString str;
str.Format(TEXT("x坐标 = %d,y 坐标 = %d"), point.x, point.y);
::SetWindowText(m_hWnd, str);
}
三丶非客户区消息
void CCDCDlg::OnNcLButtonDown(UINT nFlags, CPoint point)
{
CString str;
str.Format(TEXT("非客户区 x坐标 = %d,y 坐标 = %d"), point.x, point.y);
::SetWindowText(m_hWnd, str);
}
void CCDCDlg::OnNcLButtonDown(UINT nFlags, CPoint point)
{
CString str;
str.Format(TEXT("非客户区 x坐标 = %d,y 坐标 = %d"), point.x, point.y);
::SetWindowText(m_hWnd, str);
CDialogEx::OnNcLButtonDown(nFlags,point);
}
LRESULT CCDCDlg::OnNcHitTest(CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
UINT hit = CDialogEx::OnNcHitTest(point); //获取父类返回的判断是否是客户区还是非客户区
if (hit == HTCLIENT) //如果是客户区.那么我们转化为非客户区
{
hit = HTCAPTION;
}
return hit;
}
::ScreenToClient(m_hWnd, &point);
四丶捕获鼠标
void CCDCDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
//保存当前位置.
m_Point = point;
}
鼠标抬起
void CCDCDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
//
CClientDC dc(this);
dc.MoveTo(m_Point);
dc.LineTo(point);
}
void CCDCDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
//保存当前位置.
m_Point = point;
SetCapture(); //捕获鼠标
}
void CCDCDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
//
CClientDC dc(this);
dc.MoveTo(m_Point);
dc.LineTo(point);
if (GetCapture() == this)
{
ReleaseCapture();
}
}
下一篇:算法学习——枚举之最简真分数