您的位置:首页 > 其它

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是否在捕获鼠标

恩恩 基本上完成了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  鼠标 mfc 移动 Tag