VC mfc中实现鼠标左键长按有五个圆环跟随鼠标移动
时间: 2024-01-29 14:02:27 浏览: 39
实现鼠标左键长按有五个圆环跟随鼠标移动,可以按照以下步骤进行:
1. 在 MFC 应用程序中创建一个新的自定义控件类,命名为 CMFCMyControl。
2. 在 CMFCMyControl 类中添加以下代码:
在.h文件中添加:
```
class CMFCMyControl : public CWnd
{
public:
CMFCMyControl();
protected:
afx_msg void OnPaint();
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
DECLARE_MESSAGE_MAP()
private:
CPoint m_ptPos; // 当前鼠标位置
BOOL m_bCaptured; // 是否捕获鼠标
UINT_PTR m_nTimerID; // 定时器ID
int m_nRadius; // 圆环半径
int m_nInterval; // 刷新间隔
};
```
在.cpp文件中添加:
```
CMFCMyControl::CMFCMyControl()
{
m_bCaptured = FALSE;
m_nRadius = 5;
m_nInterval = 30;
}
BEGIN_MESSAGE_MAP(CMFCMyControl, CWnd)
ON_WM_PAINT()
ON_WM_ERASEBKGND()
ON_WM_LBUTTONDOWN()
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONUP()
END_MESSAGE_MAP()
void CMFCMyControl::OnPaint()
{
CPaintDC dc(this);
// 画圆环
for (int i = 0; i < 5; i++)
{
int nRadius = m_nRadius * (i + 1);
int nAlpha = (i + 1) * 50;
COLORREF clrRing = RGB(255, 0, 0);
clrRing = RGB(GetRValue(clrRing), GetGValue(clrRing), GetBValue(clrRing));
CPen pen(PS_SOLID, 1, clrRing);
CPen* pOldPen = dc.SelectObject(&pen);
CBrush brs(RGB(255, 255, 255));
CBrush* pOldBrush = dc.SelectObject(&brs);
dc.Ellipse(m_ptPos.x - nRadius, m_ptPos.y - nRadius, m_ptPos.x + nRadius, m_ptPos.y + nRadius);
dc.SelectObject(pOldPen);
dc.SelectObject(pOldBrush);
}
}
BOOL CMFCMyControl::OnEraseBkgnd(CDC* pDC)
{
return TRUE;
}
void CMFCMyControl::OnLButtonDown(UINT nFlags, CPoint point)
{
m_bCaptured = TRUE;
SetCapture();
m_ptPos = point;
m_nTimerID = SetTimer(1, m_nInterval, NULL);
}
void CMFCMyControl::OnMouseMove(UINT nFlags, CPoint point)
{
if (m_bCaptured)
{
m_ptPos = point;
Invalidate(FALSE);
}
}
void CMFCMyControl::OnLButtonUp(UINT nFlags, CPoint point)
{
if (m_bCaptured)
{
ReleaseCapture();
KillTimer(m_nTimerID);
m_bCaptured = FALSE;
Invalidate(FALSE);
}
}
```
3. 在 MFC 应用程序的对话框中添加 CMFCMyControl 控件,并在 OnInitDialog 函数中添加以下代码:
```
BOOL CMyDialog::OnInitDialog()
{
CDialogEx::OnInitDialog();
// TODO: Add extra initialization here
m_MyCtrl.Create(NULL, _T("My Control"), WS_CHILD | WS_VISIBLE, CRect(10, 10, 200, 200), this, 1);
return TRUE;
}
```
这样,当用户按下鼠标左键并拖动时,就会在控件内画出五个圆环,随着鼠标移动而移动。