日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MFC 鼠标双击响应单击事件

發(fā)布時間:2023/12/20 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 鼠标双击响应单击事件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。