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)?
 {
//從這開始為鼠標雙擊時發生的事情,可將你自己的寫在下面
 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 鼠标双击响应单击事件的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: Hive分析窗口函数: LAG、LEAD
 - 下一篇: 51fe 漫画下载助手 release0