admin 管理员组文章数量: 1184232
最近做练习双击鼠标左键时老是相应单击事件,网上查询和自我探索后解决问题,代码如下:
我写的代码为单击鼠标左键确定圆心,鼠标移动时产生橡皮筋线,双击鼠标结束,单双击鼠标之间的距离为圆的半径
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是否在捕获鼠标
恩恩 基本上完成了
版权声明:本文标题:MFC编程陷阱:双击如何意外激活单击事件?详解处理方法! 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/p/1771553155a3545921.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论