MFC 鼠标双击响应单击事件
最近做練習雙擊鼠標左鍵時老是相應單擊事件,網上查詢和自我探索后解決問題,代碼如下:
我寫的代碼為單擊鼠標左鍵確定圓心,鼠標移動時產生橡皮筋線,雙擊鼠標結束,單雙擊鼠標之間的距離為圓的半徑
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)?
{
//從這開始為鼠標雙擊時發(fā)生的事情,可將你自己的寫在下面
if (m_bTracking)?
{ ? ?
m_bTracking = false; ??
if (GetCapture () == this) ?
{
::ReleaseCapture (); // 擦除橡皮筋 ?
} ? ? ? ? ?
}
//到這結束
break;
}?
}?
DWORD et = GetTickCount();?
if(et - st > 200)?
{
//從這開始為單擊鼠標時發(fā)生的事情,可將你自己的寫在下面
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范圍的客戶區(qū)
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));//創(chuàng)建畫筆(畫筆風格,粗細,顏色)
Newbrush.CreateSolidBrush(RGB(255,215,0));//創(chuàng)建畫刷,可以設置畫刷的顏色
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 鼠标双击响应单击事件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Hive分析窗口函数: LAG、LEAD
- 下一篇: 51fe 漫画下载助手 release0