MFC 鼠标双击响应单击事件
2015-06-12 16:08
1141 查看
最近做练习双击鼠标左键时老是相应单击事件,网上查询和自我探索后解决问题,代码如下:
我写的代码为单击鼠标左键确定圆心,鼠标移动时产生橡皮筋线,双击鼠标结束,单双击鼠标之间的距离为圆的半径
void CMainFrame::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
MSG message;
DWORD st = GetTickCount();
while(1)
{
if(::PeekMessage(&message, NULL, 0 ,0 , PM_REMOVE))
{
::TranslateMessage(&message);
::DispatchMessage(&message);
if(message.message == WM_LBUTTONDBLCLK)
{
//从这开始为鼠标双击时发生的事情,可将你自己的写在下面
if (m_bTracking)
{
m_bTracking = false;
if (GetCapture () == this)
{
::ReleaseCapture (); // 擦除橡皮筋
}
}
//到这结束
break;
}
}
DWORD et = GetTickCount();
if(et - st > 200)
{
//从这开始为单击鼠标时发生的事情,可将你自己的写在下面
m_PointX=point.x;
m_PointY=point.y;
BeginPoint = point; //把鼠标所在坐标赋给起点坐标BeginPoint
EndPoint= point;
m_bTracking = true; // 如果可以捕获,就调用CWnd下的SetCapture开始捕获鼠标
if (m_bTracking)
{
if (m_bCaptureEnabled)
{
SetCapture();
}
}
ReleaseCapture(); //释放坐标
//到这结束
break;
}
}
//以下为我的代码,可以不看
//重绘rect范围的客户区
CRect rect;
GetClientRect(&rect);
rect.top=57;
InvalidateRect(&rect);
}
//画橡皮筋
void CMainFrame::InvertLine(CDC *pDC, CPoint BeginPoint, CPoint EndPoint)
{
if (m_No == 1)
{
int nOldMode = pDC->SetROP2 (R2_NOT);
pDC->MoveTo (BeginPoint);
pDC->LineTo (EndPoint);
pDC->SetROP2 (nOldMode);
}
}
void CMainFrame::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if (m_No == 1)
{
if (m_bTracking)
{
CClientDC dc (this);
InvertLine (&dc, BeginPoint, EndPoint);
InvertLine (&dc, BeginPoint, point);
EndPoint = point;
}
}
CFrameWnd::OnMouseMove(nFlags, point);
}
//按上下左右键移动绘制的圆
void CMainFrame::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
CRect clientRec;
GetClientRect(&clientRec);
switch(nChar)
{
case VK_LEFT:
if(m_PointX+m_Rodius>0)
{
m_PointX-=5;
}
else
{
m_PointX=clientRec.right+m_Rodius;
}
break;
case VK_RIGHT:
if (m_PointX-m_Rodius<=(clientRec.right-clientRec.left))
{
m_PointX+=5;
}
else
{
m_PointX=clientRec.left-m_Rodius;
}
break;
case VK_UP:
if (m_PointY+m_Rodius>59)
{
m_PointY-=5;
}
else
{
m_PointY=clientRec.bottom+m_Rodius;
}
break;
case VK_DOWN:
if (m_PointY-m_Rodius<=(clientRec.bottom-clientRec.top))
{
m_PointY+=5;
}
else
{
m_PointY=clientRec.top-m_Rodius+59;
}
break;
}
CRect rect;
GetClientRect(&rect);
rect.top=57;
InvalidateRect(&rect);
CFrameWnd::OnKeyDown(nChar, nRepCnt, nFlags);
}
//画圆
void CMainFrame::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
CPen Newpen,*pOldPen;
CBrush Newbrush,*pOldBrush;
Newpen.CreatePen(PS_SOLID,3,RGB(75,0,130));//创建画笔(画笔风格,粗细,颜色)
Newbrush.CreateSolidBrush(RGB(255,215,0));//创建画刷,可以设置画刷的颜色
pOldPen=dc.SelectObject(&Newpen);//获取画笔
pOldBrush=dc.SelectObject(&Newbrush);//获取画刷
m_Rodius=sqrt((BeginPoint.x-EndPoint.x)*(BeginPoint.x-EndPoint.x) + (BeginPoint.y-EndPoint.y)*(BeginPoint.y-EndPoint.y));
if (m_No == 1)
{
dc.Ellipse(m_PointX-m_Rodius,m_PointY-m_Rodius,m_PointX+m_Rodius,m_PointY+m_Rodius);
}
else
{
UpdateWindow();
}
dc.SelectObject(pOldPen);
dc.SelectObject(pOldBrush);
Newpen.DeleteObject();
Newbrush.DeleteObject();
// Do not call CFrameWnd::OnPaint() for painting messages
}
头文件中声明成员变量
int m_PointX;
int m_PointY;
int m_Rodius;
CPoint BeginPoint;//起点坐标
CPoint EndPoint;//终点坐标
bool m_bTracking;//标记鼠标是否在跟踪
bool m_bCaptureEnabled; // 标记WINDOWS是否在捕获鼠标
恩恩 基本上完成了
我写的代码为单击鼠标左键确定圆心,鼠标移动时产生橡皮筋线,双击鼠标结束,单双击鼠标之间的距离为圆的半径
void CMainFrame::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
MSG message;
DWORD st = GetTickCount();
while(1)
{
if(::PeekMessage(&message, NULL, 0 ,0 , PM_REMOVE))
{
::TranslateMessage(&message);
::DispatchMessage(&message);
if(message.message == WM_LBUTTONDBLCLK)
{
//从这开始为鼠标双击时发生的事情,可将你自己的写在下面
if (m_bTracking)
{
m_bTracking = false;
if (GetCapture () == this)
{
::ReleaseCapture (); // 擦除橡皮筋
}
}
//到这结束
break;
}
}
DWORD et = GetTickCount();
if(et - st > 200)
{
//从这开始为单击鼠标时发生的事情,可将你自己的写在下面
m_PointX=point.x;
m_PointY=point.y;
BeginPoint = point; //把鼠标所在坐标赋给起点坐标BeginPoint
EndPoint= point;
m_bTracking = true; // 如果可以捕获,就调用CWnd下的SetCapture开始捕获鼠标
if (m_bTracking)
{
if (m_bCaptureEnabled)
{
SetCapture();
}
}
ReleaseCapture(); //释放坐标
//到这结束
break;
}
}
//以下为我的代码,可以不看
//重绘rect范围的客户区
CRect rect;
GetClientRect(&rect);
rect.top=57;
InvalidateRect(&rect);
}
//画橡皮筋
void CMainFrame::InvertLine(CDC *pDC, CPoint BeginPoint, CPoint EndPoint)
{
if (m_No == 1)
{
int nOldMode = pDC->SetROP2 (R2_NOT);
pDC->MoveTo (BeginPoint);
pDC->LineTo (EndPoint);
pDC->SetROP2 (nOldMode);
}
}
void CMainFrame::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if (m_No == 1)
{
if (m_bTracking)
{
CClientDC dc (this);
InvertLine (&dc, BeginPoint, EndPoint);
InvertLine (&dc, BeginPoint, point);
EndPoint = point;
}
}
CFrameWnd::OnMouseMove(nFlags, point);
}
//按上下左右键移动绘制的圆
void CMainFrame::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
CRect clientRec;
GetClientRect(&clientRec);
switch(nChar)
{
case VK_LEFT:
if(m_PointX+m_Rodius>0)
{
m_PointX-=5;
}
else
{
m_PointX=clientRec.right+m_Rodius;
}
break;
case VK_RIGHT:
if (m_PointX-m_Rodius<=(clientRec.right-clientRec.left))
{
m_PointX+=5;
}
else
{
m_PointX=clientRec.left-m_Rodius;
}
break;
case VK_UP:
if (m_PointY+m_Rodius>59)
{
m_PointY-=5;
}
else
{
m_PointY=clientRec.bottom+m_Rodius;
}
break;
case VK_DOWN:
if (m_PointY-m_Rodius<=(clientRec.bottom-clientRec.top))
{
m_PointY+=5;
}
else
{
m_PointY=clientRec.top-m_Rodius+59;
}
break;
}
CRect rect;
GetClientRect(&rect);
rect.top=57;
InvalidateRect(&rect);
CFrameWnd::OnKeyDown(nChar, nRepCnt, nFlags);
}
//画圆
void CMainFrame::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
CPen Newpen,*pOldPen;
CBrush Newbrush,*pOldBrush;
Newpen.CreatePen(PS_SOLID,3,RGB(75,0,130));//创建画笔(画笔风格,粗细,颜色)
Newbrush.CreateSolidBrush(RGB(255,215,0));//创建画刷,可以设置画刷的颜色
pOldPen=dc.SelectObject(&Newpen);//获取画笔
pOldBrush=dc.SelectObject(&Newbrush);//获取画刷
m_Rodius=sqrt((BeginPoint.x-EndPoint.x)*(BeginPoint.x-EndPoint.x) + (BeginPoint.y-EndPoint.y)*(BeginPoint.y-EndPoint.y));
if (m_No == 1)
{
dc.Ellipse(m_PointX-m_Rodius,m_PointY-m_Rodius,m_PointX+m_Rodius,m_PointY+m_Rodius);
}
else
{
UpdateWindow();
}
dc.SelectObject(pOldPen);
dc.SelectObject(pOldBrush);
Newpen.DeleteObject();
Newbrush.DeleteObject();
// Do not call CFrameWnd::OnPaint() for painting messages
}
头文件中声明成员变量
int m_PointX;
int m_PointY;
int m_Rodius;
CPoint BeginPoint;//起点坐标
CPoint EndPoint;//终点坐标
bool m_bTracking;//标记鼠标是否在跟踪
bool m_bCaptureEnabled; // 标记WINDOWS是否在捕获鼠标
恩恩 基本上完成了
相关文章推荐
- 在 Linux 中如何移动文件
- 微软无线镭射简报鲨8000激光笔记本鼠标 - (2)
- 鼠标与“助手”的不解之缘
- Delphi实现窗体感知鼠标滑过并自动隐藏与显示窗口的方法
- PowerShell移动目录中指定文件的方法(非全部文件)
- 鼠标触发移动的分层菜单 层菜单moveMenu
- Visual C++中MFC消息的分类
- MFC中Radio Button的用法详解
- MFC创建右键弹出菜单的方法
- MFC中动态创建控件以及事件响应实现方法
- MFC程序对文件的处理方法
- MFC自定义消息的实现方法
- MFC之ComboBox控件用法实例教程
- C#实现随鼠标移动窗体实例
- VB实现鼠标绘图实例代码
- Js倒计时代码,当鼠标离开页面与回到页面会自动停止与开始
- js实现鼠标经过表格行变色的方法
- js实现精美的图片跟随鼠标效果实例
- JavaScript获取鼠标移动时的坐标(兼容IE8、chome谷歌、Firefox)
- JS+DIV实现鼠标划过切换层效果的方法