admin管理员组

文章数量:1516870

最近做练习双击鼠标左键时老是相应单击事件,网上查询和自我探索后解决问题,代码如下:

我写的代码为单击鼠标左键确定圆心,鼠标移动时产生橡皮筋线,双击鼠标结束,单双击鼠标之间的距离为圆的半径

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

恩恩 基本上完成了

本文标签: 可将你自的事情从这开始